从代码调用 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<HealthCheckService>();
或
.. serviceProvider.GetRequiredService<HealthCheckService>();
为了手动执行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 端点?的主要内容,如果未能解决你的问题,请参考以下文章