从代码中调用AspNetCore.Diagnostics.HealthCheck,而无需调用HTTP端点?

问题描述 投票:2回答:1

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

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

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个回答
0
投票

我认为您可以这样做:

  1. 从容器(HealthCheckService)获取IServiceProvider实例。
  2. 如果需要,将其传递给您的服务
  3. 呼叫healthCheckService.CheckHealthAsync以获取健康状态。
  4. (奖励)使用await Task.Delay(sleepTimeSpan)代替Thread.Sleep

此想法基于中间件代码here

© www.soinside.com 2019 - 2024. All rights reserved.