コード例 #1
0
        public Task <HealthCheckResult> CheckHealthAsync(
            HealthCheckContext context,
            CancellationToken cancellationToken = default)
        {
            var options = _options.Get(context.Registration.Name);

            // Include GC information in the reported diagnostics.
            var allocated = GC.GetTotalMemory(forceFullCollection: false);
            var data      = new Dictionary <string, object>()
            {
                { "AllocatedBytes", allocated },
                { "Gen0Collections", GC.CollectionCount(0) },
                { "Gen1Collections", GC.CollectionCount(1) },
                { "Gen2Collections", GC.CollectionCount(2) },
            };

            var status = (allocated < options.Threshold) ? HealthStatus.Healthy : context.Registration.FailureStatus;

            return(Task.FromResult(new HealthCheckResult(
                                       status,
                                       description: "Reports degraded status if allocated bytes " + $">= {options.Threshold} bytes.",
                                       exception: null,
                                       data: data)));
        }
コード例 #2
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            using (var connection = CreateConnection(ConnectionString))
            {
                try
                {
                    await connection.OpenAsync(cancellationToken);

                    if (TestQuery != null)
                    {
                        var command = connection.CreateCommand();
                        command.CommandText = TestQuery;

                        await command.ExecuteNonQueryAsync(cancellationToken);
                    }
                }
                catch (DbException ex)
                {
                    return(new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex));
                }
            }

            return(HealthCheckResult.Healthy());
        }
コード例 #3
0
ファイル: StorageHealthCheck.cs プロジェクト: afuersch/Buddy
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var path = new[] { "healthcheck", "healthcheck_file.bin" };

                await _storage.Save(new byte[] { 1, 2, 3 }, path);

                var bytes = await _storage.Load(path);

                await _storage.Delete(path);

                if (bytes != null && bytes.Length != 3 && bytes[0] != 1 && bytes[1] != 2 && bytes[2] != 3)
                {
                    return(new HealthCheckResult(HealthStatus.Unhealthy, "Content does not match"));
                }

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(HealthStatus.Unhealthy, null, ex));
            }
        }
コード例 #4
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            var fluentdHostAddress = string.Empty;

            try
            {
                fluentdHostAddress = Environment.GetEnvironmentVariable("FLUENTD_HOST") ?? throw new ArgumentNullException("Missing 'FLUENTD_HOST' environment variable .");

                var request = new HttpRequestMessage(HttpMethod.Get, fluentdHostAddress);

                var client = _clientFactory.CreateClient();
                client.Timeout = TimeSpan.FromSeconds(5);

                var response = await client.SendAsync(request, cancellationToken);

                response.EnsureSuccessStatusCode();
            }
            catch (Exception ex)
            {
                return(HealthCheckResult.Unhealthy($"HealthCheck request to Fluentd endpoint {fluentdHostAddress} failed with error message [{ex.Message}]"));
            }

            return(HealthCheckResult.Healthy());
        }
        public async Task Then_If_The_Status_Is_Healthy_Then_A_Healthy_Response_Is_Returned(
            [Frozen] Mock <IAzureQueueService> azureQueueService,
            HealthCheckContext healthCheckContext,
            QueueHealthCheck handler
            )
        {
            //Arrange
            var expectedQueueName = "test.queue";
            var queueMonitor      = new QueueMonitor(expectedQueueName, false);

            azureQueueService.Setup(x => x.GetQueuesToMonitor()).Returns(new List <QueueMonitor>
            {
                queueMonitor
            });
            azureQueueService.Setup(x => x.IsQueueHealthy(expectedQueueName)).ReturnsAsync(true);

            //Act
            var actual = await handler.CheckHealthAsync(healthCheckContext, CancellationToken.None);

            //Assert
            azureQueueService.Verify(x => x.IsQueueHealthy(expectedQueueName), Times.Once);
            Assert.AreEqual(HealthStatus.Healthy, actual.Status);
            Assert.IsFalse(actual.Data.ContainsKey("QueuesInError"));
        }
コード例 #6
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                using var ping = new Ping();
                var reply = await ping.SendPingAsync(Host);

                switch (reply.Status)
                {
                case IPStatus.Success:
                    var msg = $"ICMP to {Host} took {reply.RoundtripTime} ms.";
                    return((reply.RoundtripTime > HealthyRoundtripTime) ? HealthCheckResult.Degraded(msg) : HealthCheckResult.Healthy(msg));

                default:
                    return(HealthCheckResult.Unhealthy($"ICMP to {Host} failed: {reply.Status}"));
                }
            }
            catch (Exception ex)
            {
                var err = $"ICMP to {Host} failed: {ex.Message}";

                return(HealthCheckResult.Unhealthy(err));
            }
        }
コード例 #7
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                var messageQueuesHealth = CheckAllMessageQueuesHealth();
                await Task.WhenAll(messageQueuesHealth);

                if (messageQueuesHealth.Result.Status == HealthStatus.Healthy)
                {
                    logger.LogDebug(EventIds.AzureMessageQueueIsHealthy.ToEventId(), "Azure message queue is healthy");
                    return(HealthCheckResult.Healthy("Azure message queue is healthy"));
                }
                else
                {
                    logger.LogError(EventIds.AzureMessageQueueIsUnhealthy.ToEventId(), messageQueuesHealth.Exception, "Azure message queue is unhealthy with error {Message}", messageQueuesHealth.Result.Exception.Message);
                    return(HealthCheckResult.Unhealthy("Azure message queue is unhealthy", messageQueuesHealth.Exception));
                }
            }
            catch (Exception ex)
            {
                logger.LogError(EventIds.AzureMessageQueueIsUnhealthy.ToEventId(), ex, "Azure message queue is unhealthy with error {Message}", ex.Message);
                return(HealthCheckResult.Unhealthy("Azure message queue is unhealthy", ex));
            }
        }
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            HubConnection?connection = null;

            try
            {
                connection = _hubConnectionBuilder();

                await connection.StartAsync(cancellationToken);

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
            finally
            {
                if (connection != null)
                {
                    await connection.DisposeAsync();
                }
            }
        }
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                var connectionKey = $"{_connectionString}_{_topicName}_{_subscriptionName}";
                if (!_managementClientConnections.TryGetValue(connectionKey, out var managementClient))
                {
                    managementClient = new ServiceBusAdministrationClient(_connectionString);
                    if (!_managementClientConnections.TryAdd(connectionKey, managementClient))
                    {
                        return(new HealthCheckResult(context.Registration.FailureStatus, description:
                                                     "New service bus administration client connection can't be added into dictionary."));
                    }
                }

                _ = await managementClient.GetSubscriptionRuntimePropertiesAsync(_topicName, _subscriptionName, cancellationToken);

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #10
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            //using (var connection = new SqlConnection(ConnectionString))
            //{
            //    try
            //    {
            //        await connection.OpenAsync(cancellationToken);

            //        if (TestQuery != null)
            //        {
            //            var command = connection.CreateCommand();
            //            command.CommandText = TestQuery;

            //            await command.ExecuteNonQueryAsync(cancellationToken);
            //        }
            //    }
            //    catch (DbException ex)
            //    {
            //        return new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex);
            //    }
            //}

            return(HealthCheckResult.Healthy());
        }
コード例 #11
0
        public async Task <HealthCheckResult> CheckHealthAsync(
            HealthCheckContext context,
            CancellationToken cancellationToken = default)
        {
            try
            {
                using var ping = new Ping();
                var reply = await ping.SendPingAsync(Host);

                switch (reply.Status)
                {
                case IPStatus.Success:
                    var msg = String.Format(
                        "IMCP to {0} took {1} ms.",
                        Host, reply.RoundtripTime);
                    return((reply.RoundtripTime > Timeout)
                            ? HealthCheckResult.Degraded(msg)
                            : HealthCheckResult.Healthy(msg));

                default:
                    var err = String.Format(
                        "IMCP to {0} failed: {1}",
                        Host,
                        reply.Status);
                    return(HealthCheckResult.Unhealthy(err));
                }
            }
            catch (Exception ex)
            {
                var err = String.Format(
                    "IMCP to {0} failed: {1}",
                    Host,
                    ex.Message);
                return(HealthCheckResult.Unhealthy(err));
            }
        }
コード例 #12
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
        {
            return(await Task.Run(() =>
            {
                IDictionary <string, Object> data = new Dictionary <string, object>();
                data.Add("type", "ProcessListHealthChecks");
                UInt32 totalsize = 0;
                Double TotalProcessorTime = 0;
                int number = 0;
                foreach (var aProc in Process.GetProcesses())
                {
                    number++;
                    data.Add(aProc.ProcessName + "_Memory " + number.ToString(), aProc.WorkingSet64 / 1024);
                    try
                    {
                        data.Add(aProc.ProcessName + "_TotalProcessorTime " + number.ToString(), aProc.TotalProcessorTime.TotalSeconds);
                        TotalProcessorTime += aProc.TotalProcessorTime.TotalSeconds;
                    }
                    catch (Exception ex)
                    {
                        if (!string.IsNullOrWhiteSpace(ex.Message))
                        {
                            data.Add("error", ex.Message);
                        }
                        // data.Add(aProc.ProcessName + "_TotalProcessorTime " + number.ToString(), "Failed to load");
                    }
                    totalsize += Convert.ToUInt32(aProc.WorkingSet64 / 1024.0);
                }

                data.Add("Total Memory", totalsize);
                data.Add("Total TotalProcessorTime", TotalProcessorTime);
                ReadOnlyDictionary <string, Object> rodata = new ReadOnlyDictionary <string, object>(data);
                string description = "ProcessList Total Memory Usage " + totalsize + " MB";
                return HealthCheckResult.Healthy(description, rodata);
            }));
        }
コード例 #13
0
        public override async Task <HealthCheckResult> DoCheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            var url     = httpContextAccessor.HttpContext.Request.Scheme + "://" + httpContextAccessor.HttpContext.Request.Host;
            var content = await httpClient.GetStringAsync($"{url}/api/article", cancellationToken);

            var articles = JsonConvert.DeserializeObject <IReadOnlyList <ArticleDto> >(content);

            if (articles.Count == 0)
            {
                return(HealthCheckResult.Degraded("No article was returned from the web api"));
            }

            if (articles.Any(x => x.IsPublished() && string.IsNullOrEmpty(x.Content)))
            {
                return(HealthCheckResult.Degraded("At least one published article has no content"));
            }

            if (articles.Any(x => x.IsPublished() && string.IsNullOrEmpty(x.Title)))
            {
                return(HealthCheckResult.Degraded("At least one published article has no title"));
            }

            return(HealthCheckResult.Healthy("The web api returns articles"));
        }
コード例 #14
0
        public async Task <HealthCheckResult> CheckHealthAsync(
            HealthCheckContext context,
            CancellationToken cancellationToken = new CancellationToken())
        {
            logger.LogInformation($"Executing health check for {nameof(SpeakerService)}.");

            try
            {
                var response = await CheckService(cancellationToken);

                logger.LogInformation($"Executed health check for {nameof(SpeakerService)}.");
                if ((response.StatusCode == HttpStatusCode.Unauthorized ||
                     response.StatusCode == HttpStatusCode.Forbidden) &&
                    !"Site Disabled".Equals(response.ReasonPhrase, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(HealthCheckResult.Healthy("Got expected response from Speaker Api."));
                }
                return(HealthCheckResult.Unhealthy($"Got status code {response.StatusCode} with reason `{response.ReasonPhrase}`."));
            }
            catch (HttpRequestException httpRequestException)
            {
                return(HealthCheckResult.Unhealthy(httpRequestException.Message));
            }
        }
コード例 #15
0
        public Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            if (!IsCacheExpired())
            {
                return(Task.FromResult(_lastPingResult));
            }

            if (Monitor.TryEnter(_locker))
            {
                try
                {
                    if (IsCacheExpired())
                    {
                        PingService();
                    }
                }
                finally
                {
                    Monitor.Exit(_locker);
                }
            }

            return(Task.FromResult(_lastPingResult));
        }
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                foreach (var item in _options.ConfigureHosts.Values)
                {
                    var ipAddresses = await Dns.GetHostAddressesAsync(item.Host).WithCancellationTokenAsync(cancellationToken);

                    foreach (var ipAddress in ipAddresses)
                    {
                        if (item.Resolutions == null || !item.Resolutions.Contains(ipAddress.ToString()))
                        {
                            return(new HealthCheckResult(context.Registration.FailureStatus, description: $"Ip Address {ipAddress} was not resolved from host {item.Host}"));
                        }
                    }
                }

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #17
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                if (!Connections.TryGetValue(connectionString, out var cosmosDbClient))
                {
                    cosmosDbClient = new CosmosClient(connectionString);

                    if (!Connections.TryAdd(connectionString, cosmosDbClient))
                    {
                        cosmosDbClient.Dispose();
                        cosmosDbClient = Connections[connectionString];
                    }
                }

                await cosmosDbClient.ReadAccountAsync();

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #18
0
        /// <summary>
        /// Perform a query to check how many holidays are registered in the Holidays table in current year.
        /// </summary>
        /// <param name="context">Represent the context information associated.</param>
        /// <param name="cancellationToken">Notification that operations should be canceled.</param>
        /// <returns><see cref="HealthCheckResult"/>The result of a health check</returns>
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
        {
            try
            {
                DateTime startDate = new DateTime(DateTime.Now.Year, 01, 01);
                DateTime endDate   = new DateTime(DateTime.Now.Year, 12, 31);

                using (var connection = new SqlConnection(_connection))
                {
                    await connection.OpenAsync(cancellationToken);

                    var command = connection.CreateCommand();
                    command.CommandText = $"select count(id) from holidays where holidaydate >= '{startDate.ToSqlDate()}' and holidaydate <= '{endDate.ToSqlDate()}'";

                    var x = Convert.ToInt32(await command.ExecuteScalarAsync(cancellationToken)) > 0 ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();

                    return(Convert.ToInt32(await command.ExecuteScalarAsync(cancellationToken)) > 0 ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy());
                }
            }
            catch (Exception ex)
            {
                return(HealthCheckResult.Unhealthy());
            }
        }
コード例 #19
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken)
        {
            _logger.LogInformation("Pinging Courses API");

            var timer    = Stopwatch.StartNew();
            var response = await _apiClient.GetResponseCode(new GetPingRequest());

            timer.Stop();

            if ((int)response == 200)
            {
                var durationString = timer.Elapsed.ToHumanReadableString();

                _logger.LogInformation($"Courses API ping successful and took {durationString}");

                return(HealthCheckResult.Healthy(HealthCheckResultDescription,
                                                 new Dictionary <string, object> {
                    { "Duration", durationString }
                }));
            }

            _logger.LogWarning($"Courses API ping failed : [Code: {response}]");
            return(HealthCheckResult.Unhealthy(HealthCheckResultDescription));
        }
コード例 #20
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                foreach (var(host, port) in _options.ConfiguredHosts)
                {
                    using (var tcpClient = new TcpClient())
                    {
                        await tcpClient.ConnectAsync(host, port).WithCancellationTokenAsync(cancellationToken);

                        if (!tcpClient.Connected)
                        {
                            return(new HealthCheckResult(context.Registration.FailureStatus, description: $"Connection to host {host}:{port} failed"));
                        }
                    }
                }

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #21
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                if (_options.RegistryWriteCheck)
                {
                    await ExecuteRegistryWriteCheckAsync(cancellationToken);
                }
                else if (_options.RegistryReadCheck)
                {
                    await ExecuteRegistryReadCheckAsync();
                }
                if (_options.ServiceConnectionCheck)
                {
                    await ExecuteServiceConnectionCheckAsync(cancellationToken);
                }

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                using (var connection = new NpgsqlConnection(_connectionString))
                {
                    _connectionAction?.Invoke(connection);

                    await connection.OpenAsync(cancellationToken);

                    using (var command = connection.CreateCommand())
                    {
                        command.CommandText = _sql;
                        await command.ExecuteScalarAsync(cancellationToken);
                    }

                    return(HealthCheckResult.Healthy());
                }
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #23
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                using (var httpClient = new HttpClient()
                {
                    BaseAddress = _idSvrUri
                })
                {
                    var response = await httpClient.GetAsync(IDSVR_DISCOVER_CONFIGURATION_SEGMENT);

                    if (!response.IsSuccessStatusCode)
                    {
                        return(new HealthCheckResult(context.Registration.FailureStatus, description: "Discover endpoint is not responding with 200 OK, the current status is {response.StatusCode} and the content { (await response.Content.ReadAsStringAsync())}"));
                    }

                    return(HealthCheckResult.Healthy());
                }
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #24
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            try
            {
                var eventStoreUri = new Uri(_eventStoreConnection);

                ConnectionSettings connectionSettings;

                if (string.IsNullOrEmpty(_login) || string.IsNullOrEmpty(_password))
                {
                    connectionSettings = ConnectionSettings.Create()
                                         .KeepRetrying()
                                         .Build();
                }
                else
                {
                    connectionSettings = ConnectionSettings.Create()
                                         .KeepRetrying()
                                         .SetDefaultUserCredentials(new UserCredentials(_login, _password))
                                         .Build();
                }

                var connection = EventStoreConnection.Create(
                    connectionSettings,
                    eventStoreUri,
                    CONNECTION_NAME);

                await connection.ConnectAsync();

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #25
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
        {
            try
            {
                var connection = new SqlConnection(_configuration.GetConnectionString("ContentContext"));
                await connection.OpenAsync(cancellationToken);

                var command = new SqlCommand("SELECT TOP 1 * FROM Content", connection);
                var reader  = await command.ExecuteReaderAsync(cancellationToken);

                var canRead = await reader.ReadAsync(cancellationToken);

                connection.Close();
                if (!canRead)
                {
                    return(HealthCheckResult.Unhealthy());
                }
                return(HealthCheckResult.Healthy());
            }
            catch
            {
                return(HealthCheckResult.Unhealthy());
            }
        }
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
        {
            var configuredHosts = _options.ConfiguredHosts.Values;

            try
            {
                foreach (var(host, timeout) in configuredHosts)
                {
                    using var ping = new Ping();
                    var pingReply = await ping.SendPingAsync(host, timeout);

                    if (pingReply.Status != IPStatus.Success)
                    {
                        return(new HealthCheckResult(context.Registration.FailureStatus, description: $"Ping check for host {host} is failed with status reply:{pingReply.Status}"));
                    }
                }

                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                return(new HealthCheckResult(context.Registration.FailureStatus, exception: ex));
            }
        }
コード例 #27
0
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
        {
            var query = GraphQueryBuilder.ForResourceType("microsoft.logic/workflows")
                        .Project("subscriptionId", "resourceGroup", "type", "name", "id")
                        .LimitTo(1)
                        .Build();

            if (_resourceDeclarationMonitor.CurrentValue.AzureLandscape?.Subscriptions == null ||
                _resourceDeclarationMonitor.CurrentValue.AzureLandscape?.Subscriptions?.Any() == false)
            {
                return(HealthCheckResult.Unhealthy("No Azure subscriptions are configured"));
            }

            var healthProbeResults = await ProbeSubscriptionsAsync(query);

            var healthCheckMetadata = GenerateMetadata(healthProbeResults);

            if (healthProbeResults.Any(probeKeyValuePair => probeKeyValuePair.IsSuccessful == false))
            {
                return(HealthCheckResult.Unhealthy("One or more subscriptions are unhealthy.", data: healthCheckMetadata));
            }

            return(HealthCheckResult.Healthy("Successfully queried all subscriptions", data: healthCheckMetadata));
        }
コード例 #28
0
        /// <inheritdoc cref="IHealthCheck.CheckHealthAsync" />
        public async Task <HealthCheckResult> CheckHealthAsync(
            HealthCheckContext context,
            CancellationToken cancellationToken = default)
        {
            Check.NotNull(context, nameof(context));

            IReadOnlyCollection <IConsumer> disconnectedConsumers =
                await _service.GetDisconnectedConsumersAsync(_minHealthyStatus, _gracePeriod, _endpointsFilter)
                .ConfigureAwait(false);

            if (disconnectedConsumers.Count == 0)
            {
                return(new HealthCheckResult(HealthStatus.Healthy));
            }

            string errorMessage = disconnectedConsumers.Aggregate(
                "One or more consumers are not connected:",
                (current, consumer) =>
                $"{current}{Environment.NewLine}- " +
                $"{consumer.Endpoint.DisplayName} " +
                $"[{consumer.Id}]");

            return(new HealthCheckResult(context.Registration.FailureStatus, errorMessage));
        }
コード例 #29
0
        public async Task <HealthCheckResult> CheckHealthAsync(
            HealthCheckContext context,
            CancellationToken cancellationToken = default)
        {
            string faurl = Configuration["AppSettings:SAMPLE_VARIABLE"];

            using (HttpClient client = new HttpClient())
            {
                try
                {
                    var response = await client.GetAsync(faurl);

                    if (!response.IsSuccessStatusCode)
                    {
                        throw new Exception($"SAMPLE_VARIABLE responding with: {response.StatusCode}");
                    }
                }
                catch (Exception e)
                {
                    return(await Task.FromResult(HealthCheckResult.Unhealthy(e.Message)));
                }
            }
            return(await Task.FromResult(HealthCheckResult.Healthy("SAMPLE_VARIABLE endpoint is up!")));
        }
コード例 #30
0
        /// <summary>
        /// Runs the health check, returning the status of the component being checked.
        /// </summary>
        /// <param name="context">A context object associated with the current execution.</param>
        /// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> that can be used to cancel the health check.</param>
        /// <returns>A <see cref="T:System.Threading.Tasks.Task`1" /> that completes when the health check has finished, yielding the status of the component being checked.</returns>
        public async Task <HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
        {
            try
            {
                var client   = _workerProvider.CreateClient(_id);
                var response = client.DnsLookup(new DnsLookupRequest
                {
                    Host = "example.com",
                    Type = DnsLookupType.A,
                }, cancellationToken: cancellationToken);

                // Read the stream until the end
                await foreach (var _ in response.ResponseStream.ReadAllAsync(cancellationToken))
                {
                }
                _workerProvider.SetStatus(_id, WorkerStatus.Available);
                return(HealthCheckResult.Healthy());
            }
            catch (Exception ex)
            {
                _workerProvider.SetStatus(_id, WorkerStatus.Down);
                return(HealthCheckResult.Unhealthy("DNS lookups failing", ex));
            }
        }