【问题标题】:Invoke AspNetCore.Diagnostics.HealthCheck from code without a call to HTTP endpoint?从代码调用 AspNetCore.Diagnostics.HealthCheck 而不调用 HTTP 端点?
【发布时间】:2020-03-22 02:09:20
【问题描述】:

我在一组 Service Fabric 服务中添加了Microsoft.AspNetCore.Diagnostics.HealthChecks,其中一些具有 HTTP ServiceEndpoints,而另一些则没有。

对于那些没有服务端点的,如果我想添加一些IHealthCheck的实现并将它们添加到StartUp中的ServiceCollection中,如下所示:

services
  .AddHealthChecks()
   .AddCheck<DatabaseHealthCheck>("Database")
   .AddCheck<Api1HealthCheck>("Dependency API 1")
   .AddCheck<Api2HealthCheck>("Dependency API 2");

有没有一种方法可以在不调用服务本身的 HTTP 端点的情况下调用这些健康检查?

这些特定的服务在 RunAsync 方法中有一个类似这样的 while 循环,目前用于向日志输出心跳:

public async Task RunAsync(string appInstanceDesc, CancellationToken cancellationToken)
    {
        long iterations = 0;
        var sleepTimeSpan = _config.PollingInterval.GetTimeSpan();

        while (true)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                _logger.LogInformation("Cancellation requested - shutting down");
                break;
            }

            _logger?.LogDebug($"CR Heartbeat log iteration 
                                   {++iterations}{appInstanceDesc}");

            Thread.Sleep(sleepTimeSpan);
        }
    }

有没有办法从该循环中调用HealthCheck 类,以便将其结果输出到日志中?

【问题讨论】:

    标签: c# asp.net-core .net-core azure-service-fabric health-monitoring


    【解决方案1】:

    我认为你可以这样做:

    1. 从容器 (IServiceProvider) 中获取 HealthCheckService 实例。
    2. 如果需要,将其传递给您的服务
    3. 拨打healthCheckService.CheckHealthAsync获取健康状况。
    4. (奖励)使用await Task.Delay(sleepTimeSpan) 而不是Thread.Sleep

    这个想法是基于中间件代码here

    【讨论】:

      【解决方案2】:

      假设您添加了内置的健康检查框架:

      services.AddHealthChecks()

      如果你这样做:

      .. appBuilder.ApplicationServices.GetService&lt;HealthCheckService&gt;();

      .. serviceProvider.GetRequiredService&lt;HealthCheckService&gt;();

      为了手动执行CheckHealthAsync 并获得包含状态的HealthReport 返回:

      HealthReport healthReport = await healthCheckService.CheckHealthAsync();

      确保您使用的是正确的HealthCheckService,因为它存在于以下两个位置:

      using Microsoft.Extensions.Diagnostics.HealthChecks;

      进入:

      using Microsoft.Extensions.HealthChecks;

      就我而言,我必须使用来自Microsoft.Extensions.Diagnostics.HealthChecks的那个

      【讨论】:

        猜你喜欢
        • 2020-07-14
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多