/// <inheritdoc cref="IServiceMessageProcessor.AddServiceHealthCheckMessageListener(Guid, ServiceHealthCheckListener)"/> public void AddServiceHealthCheckMessageListener(Guid messageId, ServiceHealthCheckListener serviceHealthCheckListener) { _serviceHealthCheckListeners.TryAdd(messageId, serviceHealthCheckListener); }
/// <inheritdoc cref="IRegistryService.StartMonitoringServicesAsync(CancellationToken)"/> public async Task StartMonitoringServicesAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { Dictionary <Guid, ServiceHealthCheckListener> healthCheckListeners = new Dictionary <Guid, ServiceHealthCheckListener>(); List <Task <(bool, Guid, Guid, string, ServiceHealthCheckResponse)> > healthCheckTasks = new List <Task <(bool, Guid, Guid, string, ServiceHealthCheckResponse)> >(); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(10)); if (_messageToServiceMapper.ServiceMap.Count() > 0) { foreach (var(id, serviceConnector) in _messageToServiceMapper.ServiceMap) { ServiceHealthCheckListener messageListener = new ServiceHealthCheckListener(); ServiceHealthCheckRequest serviceHealthCheckRequest = new ServiceHealthCheckRequest(); serviceConnector.EnqueueMessage(serviceHealthCheckRequest); _serviceMessageProcessor.AddServiceHealthCheckMessageListener(serviceHealthCheckRequest.Id, messageListener); healthCheckListeners.Add(id, messageListener); healthCheckTasks.Add(messageListener.ReceiveMessageAsync(cancellationTokenSource.Token) .ContinueWith <(bool, Guid, Guid, string, ServiceHealthCheckResponse)>((task) => { if (task.IsCompletedSuccessfully) { return(true, id, serviceHealthCheckRequest.Id, serviceConnector.Name, task.Result); } else { return(false, id, serviceHealthCheckRequest.Id, serviceConnector.Name, null); } })); } StringBuilder stringBuilder = new StringBuilder(); foreach ((bool success, Guid id, Guid requestId, string name, ServiceHealthCheckResponse response) in await Task.WhenAll(healthCheckTasks)) { stringBuilder.AppendLine(new string('-', 20)); stringBuilder.AppendLine($"Service: {name}"); stringBuilder.AppendLine($"Id: {id}"); stringBuilder.AppendLine($"Success: {success && response.Success}"); if (success && response.Success) { stringBuilder.AppendLine($"Status: {response.ServiceHealthReport.Status}"); stringBuilder.AppendLine($"Total duration in milliseconds: {response.ServiceHealthReport.TotalDuration.Milliseconds}"); foreach (HealthCheckDto healthCheck in response.ServiceHealthReport.HealthChecks) { stringBuilder.AppendLine($"\tHealth check: {healthCheck.Name}"); stringBuilder.AppendLine($"\tStatus: {healthCheck.Status}"); stringBuilder.AppendLine($"\tDuration in milliseconds: {healthCheck.Duration.Milliseconds}"); if (!(healthCheck.Description is null)) { stringBuilder.AppendLine($"\tDescription: {healthCheck.Description}"); } } } else { stringBuilder.AppendLine($"Removing {id} from service map!"); // TODO: notify registry service that a service has stopped responding? _messageToServiceMapper.RemoveService(id); } stringBuilder.AppendLine(new string('-', 20)); _serviceMessageProcessor.RemoveServiceHealthCheckMessageListener(requestId); } _registryServiceLogger.LogInformation(stringBuilder.ToString()); } else { _registryServiceLogger.LogInformation("No services registered yet."); } await Task.Delay(TimeSpan.FromSeconds(60), cancellationToken); } }