Esempio n. 1
0
 /// <inheritdoc cref="IServiceMessageProcessor.AddServiceHealthCheckMessageListener(Guid, ServiceHealthCheckListener)"/>
 public void AddServiceHealthCheckMessageListener(Guid messageId, ServiceHealthCheckListener serviceHealthCheckListener)
 {
     _serviceHealthCheckListeners.TryAdd(messageId, serviceHealthCheckListener);
 }
Esempio n. 2
0
        /// <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);
            }
        }