【问题标题】:.NET Core health check of external services.NET Core 外部服务健康检查
【发布时间】:2021-07-02 09:09:02
【问题描述】:

我正在使用 .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,我的用户界面也是空的(见图)。为什么/HealthChecks 页面没有显示?

【问题讨论】:

  • 您链接的文档中有描述how to add a custom healthcheck
  • 我添加了一个自定义健康检查,但它仍然没有显示在 UI 上。检查已编辑的问题。
  • 是显示另一个系统的页面还是检查另一个系统的可用性并显示健康检查页面?
  • 第二个选项。我想在我的应用程序中显示一个 UI,它会显示所有外部 API 的健康检查状态。
  • 你添加了 app.UseStaticFiles(); ?检查浏览器控制台是否输出 404

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


【解决方案1】:

UI 似乎看不到运行状况检查。默认情况下,除非您另有配置,否则 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

【讨论】:

  • 这是我拥有的代码currently。但是,当我转到/healthchecks-api 时,出现以下异常:AmbiguousMatchException: The request matched multiple endpoints. Matches: HealthChecks UI Api, Health checks
  • 我创建了一个非常简单的项目,您可以在其中重现该问题。可在此处获得:filedropper.com/healthchecktest
【解决方案2】:

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

"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.jsonStartup中配置Endpoint,否则无法在UI上显示。在您的情况下,只要 API Endpoint 返回 http 状态代码 200,它就是健康状态。因此,您应该在其他项目中提供专门用于 Health Check 的 API。如果一切正常,他们只需要返回http状态码200。

【讨论】:

  • 这些Uri 字段应该指向外部服务,对吧(例如https://api.external.com/GetServiceInfo)?我使用的外部服务是用 Node.js 编写的,它们没有标准的 .NET Core 健康检查输出。我想编写自定义逻辑来确定他们的健康状况,例如。调用其中一个 URL 并解析 JSON 结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2017-06-09
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多