从代码调用 AspNetCore.Diagnostics.HealthCheck 而不调用 HTTP 端点?

Posted

技术标签:

【中文标题】从代码调用 AspNetCore.Diagnostics.HealthCheck 而不调用 HTTP 端点?【英文标题】:Invoke AspNetCore.Diagnostics.HealthCheck from code without a call to HTTP endpoint? 【发布时间】: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 
                                   ++iterationsappInstanceDesc");

            Thread.Sleep(sleepTimeSpan);
        
    

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

【问题讨论】:

【参考方案1】:

我认为你可以这样做:

    从容器 (IServiceProvider) 中获取 HealthCheckService 实例。 如果需要,将其传递给您的服务 拨打healthCheckService.CheckHealthAsync获取健康状况。 (奖励)使用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的那个

【讨论】:

以上是关于从代码调用 AspNetCore.Diagnostics.HealthCheck 而不调用 HTTP 端点?的主要内容,如果未能解决你的问题,请参考以下文章

用于从 FORTRAN 代码调用的 C++ 函数调用 C++ 代码的 Cmake 配置文件

从 C++ 调用 C# 代码

从代码中调用按钮单击的函数

跟踪从实体框架代码调用的查询

Cython:从 C 程序调用 Python 代码

从代码后面调用命令