Example #1
0
        /// <summary>
        /// Poll each service identifer using serivce discovery to determine their state of responsiveness.
        /// </summary>
        private async Task ResolveServicesState(IEnumerable <Service> serviceIdentifiers)
        {
            var serviceStateTasks = new List <Task>();
            var _services         = new Dictionary <string, ServiceResult>();

            Logger.LogInformation($"{nameof(ResolvePollingServices)}: Resolving services for polling...");

            var aggregatedServiceState = ServiceState.Unknown;

            foreach (var service in serviceIdentifiers)
            {
                serviceStateTasks
                .Add(QueryService(service)
                     .ContinueWith(x =>
                {
                    if (!x.IsCompleted || x.Result == null)
                    {
                        Logger.LogError($"{nameof(ResolveServicesState)}: Failure querying service '{service.Identifier}' at '{service.Endpoint}'; {x.Exception.GetBaseException().Message}");
                        return;
                    }

                    var servicePingResponse = x.Result;

                    _healthCheckState.AddServicePingResponse(service.Identifier, servicePingResponse);

                    if (servicePingResponse.State != ServiceState.Available)
                    {
                        aggregatedServiceState = ServiceState.Unavailable;
                    }

                    if (aggregatedServiceState != ServiceState.Unavailable)
                    {
                        aggregatedServiceState = ServiceState.Available;
                    }
                }));
            }

            await Task.WhenAll(serviceStateTasks);

            Logger.LogInformation($"{nameof(ResolveServicesState)}: Setting aggregated service state to: {aggregatedServiceState}");
            _healthCheckState.SetAggregatedServiceState(aggregatedServiceState);
        }