.NET Core 外部服务健康检查

时间:2021-07-02 09:09:02

标签: c# asp.net-core health-monitoring health-check

我正在使用 .NET Core 3.1 来开发 Web 应用程序。它依赖于其他几个外部服务(用 Node.js 编写的 API)。我想监控外部服务的运行状况并使用 HealthChecks.UI 在单独的页面上显示运行状况。我对自己的应用程序的健康状况不感兴趣,我对依赖的外部系统的健康状况感兴趣。这可以通过health checks package实现吗?

这是我目前拥有的代码:

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddHealthChecks()
            .AddCheck<ExternalServiceHealthCheck>("External service health check");
        
        services
            .AddHealthChecksUI()
            .AddInMemoryStorage();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseStaticFiles();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHealthChecksUI(setup =>
            {
                setup.UIPath = "/HealthChecks";
            });
        });
    }
}

ExternalServiceHealthCheck.cs

public class ExternalServiceHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        return Task.FromResult(HealthCheckResult.Healthy("External service is healthy"));
    }
}

当我转到 /HealthChecks 时,即使我注册了 ExternalServiceHealthCheck(见图),我也会得到一个空的 UI。为什么它没有显示在 /HealthChecks 页面上?

enter image description here

2 个答案:

答案 0 :(得分:0)

看起来用户界面看不到健康检查。默认情况下,除非您另行配置,否则 UI 会查找 /healthchecks-api 以获取要呈现的运行状况检查的数据。

此外 /healthchecks-api 需要安装 AspNetCore.HealthChecks.UI.Client 包并将该包 UIResponseWriter 设置为选项的 ResponseWriter 属性:

app.MapHealthChecks("/healthchecks-api", new HealthCheckOptions
{
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

您应该能够查看 /healthchecks-api 并看到一些 JSON 返回,而不是基本的“健康”/“不健康”消息。这一切都来自 HealthChecks UI 包的 readme

答案 1 :(得分:0)

当我在配置文件中添加时,我在本地完全重现了您的问题

"HealthChecks-UI": {
     "HealthChecks": [
       {
         "Name": "Ordering HTTP Check",
         "Uri": "http://localhost:5102/hc"
       },
       {
         "Name": "Ordering HTTP Background Check",
         "Uri": "http://localhost:5111/hc"
       }
     ]
   }

它可以正确显示。

如果要使用healthchecks-ui,必须通过appsettings.json或者在Startup中配置Endpoint,否则无法在UI上显示。在您的情况下,只要 API Endpoint 返回 http 状态代码 200,就是健康状态。所以你应该在其他项目中提供专门用于健康检查的API。如果一切正常,他们只需要返回http状态码200即可。