可视化 ASP.Net Core Web API 健康检查

前言

ASP.NET Core 提供运行状况检查 Middleware 和库,以便于报告应用的运行状况。

使用方式也很简单。

引用 NugetMicrosoft.Extensions.Diagnostics.HealthChecks

然后修改 Startup.cs 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddHealthChecks();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...
    app.UseHealthChecks("/health");
}

我们甚至可以为第三方组件,比如数据库、缓存,提供健康状态检查。

最后,访问 /health 来查看应用程序的健康状态:

这种文本方式不够直观,今天我们介绍一个轻量级的图形UI,通过可视化的方式进行健康检查。

Demo

1.引用 Nuget 包

引用如下 Nuget 包:

1
2
3
AspNetCore.HealthChecks.UI
AspNetCore.HealthChecks.UI.Client
AspNetCore.HealthChecks.UI.InMemory.Storage

UI 支持不同的存储类型,如 Sql Server、MySql 等,这里选择直接保存到内存。

2.修改Startup.cs

添加UI,并设置了自定义健康检查,用于演示不健康状态:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddHealthChecksUI().AddInMemoryStorage();
    services.AddHealthChecks().AddCheck<DemoHealthCheck>("My IO");
}

public class DemoHealthCheck: IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        if (DateTime.Now.Second > 30)
        {
            return Task.FromResult(HealthCheckResult.Healthy());
        }

        return Task.FromResult(HealthCheckResult.Unhealthy("不健康"));
    }
}

指定健康检查和UI的地址,并且使用 UIResponseWriter.WriteHealthCheckUIResponse 返回 json 格式健康检查数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapHealthChecks("/health", new HealthCheckOptions()
        {
            Predicate = _ => true,
            ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
        });
        endpoints.MapHealthChecksUI(options => options.UIPath = "/health-ui");
    });
}

3.添加配置项

修改 appsettings.json 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
"HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "My IO",
        "Uri": "/health"
      }
    ],
    "Webhooks": [
      {
        "Name": "",
        "Uri": "",
        "Payload": "",
        "RestoredPayload": ""
      }
    ],
    "EvaluationTimeinSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60
  }

HealthChecks 是个数组,也就是说,UI 同时可以监控多个健康检查 API。

Webhooks 用于当 API 的健康状态改变时,向指定 Uri 发送告警数据。

4.使用

运行程序,访问 /health-ui 即可打开 UI:

点击 Details 按钮,还可查看健康状态历史:

0%