ASP.NET Core 健康监控:从入门到实战

在 ASP.NET Core 中,HealthCheck 是一种用于监控应用程序运行状况的内置机制。允许你定义和运行检查,以确保你的应用程序及其依赖项(如数据库、缓存、外部服务等)正常运行。HealthCheck 通常用于微服务架构、容器化环境(如 Kubernetes)或需要高可用性的场景。

简介

HealthCheck 提供了一种标准化的方式,通过 HTTP 端点(通常是 /health)返回应用程序的健康状态。

  • • Healthy:应用程序及其依赖项正常运行。

  • • Degraded:应用程序部分功能受限,但仍在运行。

  • • Unhealthy:应用程序或其依赖项存在问题。

HealthCheck 可以与外部工具(如 Kubernetes、负载均衡器)集成,用于自动检测和处理故障。


基本使用

ASP.NET Core 提供了 Microsoft.Extensions.Diagnostics.HealthChecks 包来实现健康检查。

1:安装必要的 NuGet 包
dotnet add package Microsoft.Extensions.Diagnostics.HealthChecks

如需要检查特定依赖( SQL Server、Redis),可能需要额外的包

dotnet add package Microsoft.Extensions.Diagnostics.HealthChecks.SqlServer
dotnet add package Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore
2:配置 HealthCheck 服务

在 Program.cs 或 Startup.cs 中,注册健康检查服务:

using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.Diagnostics.HealthChecks;

var builder = WebApplication.CreateBuilder(args);

// 注册健康检查服务
builder.Services.AddHealthChecks()
    // 可选:添加特定依赖的健康检查
    .AddSqlServer(connectionString: builder.Configuration.GetConnectionString("DefaultConnection"), name: "SqlServer")
    .AddRedis(redisConnectionString: builder.Configuration["Redis:ConnectionString"], name: "Redis");

var app = builder.Build();

// 配置健康检查端点
app.MapHealthChecks("/health");

app.Run();
  • • AddHealthChecks():注册健康检查服务。

  • • AddSqlServerAddRedis:添加特定依赖的健康检查(需安装对应的 NuGet 包)。

  • • MapHealthChecks("/health"):定义健康检查的 HTTP 端点。

步骤 3:访问健康检查端点

运行应用程序后,访问 /health 端点(例如 http://localhost:5000/health)。如果所有检查通过,响应将是:

Healthy

如有检查失败,响应可能是 Degraded 或 Unhealthy


高级配置

健康检查响应格式

默认情况下,/health 端点只返回状态文本(如 Healthy)。你可以通过 HealthCheckOptions 自定义响应格式:

app.MapHealthChecks("/health", new HealthCheckOptions
{
    ResponseWriter = async (context, report) =>
    {
        var result = new
        {
            Status = report.Status.ToString(),
            Checks = report.Entries.Select(e => new
            {
                Name = e.Key,
                Status = e.Value.Status.ToString(),
                Description = e.Value.Description
            })
        };
        context.Response.ContentType = "application/json";
        await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(result));
    }
});

访问 /health 将返回 JSON 格式的详细报告,例如:

{
  "Status":"Healthy",
"Checks":[
    {
      "Name":"SqlServer",
      "Status":"Healthy",
      "Description":"SQL Server is reachable"
    },
    {
      "Name":"CustomCheck",
      "Status":"Healthy",
      "Description":"Everything is fine!"
    }
]
}

图片

 

健康检查分组

你可以为不同的场景定义多个健康检查端点。例如,一个端点用于基本检查(/health/ready),另一个用于详细检查(/health/live):

builder.Services.AddHealthChecks()
    .AddSqlServer(connectionString: builder.Configuration.GetConnectionString("DefaultConnection"), name: "SqlServer", tags: new[] { "ready" })
    .AddCheck<CustomHealthCheck>("CustomCheck", tags: new[] { "live" });

app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
    Predicate = check => check.Tags.Contains("ready")
});

app.MapHealthChecks("/health/live", new HealthCheckOptions
{
    Predicate = check => check.Tags.Contains("live")
});
  • • /health/ready:只检查带有 ready 标签的健康检查。

  • • /health/live:只检查带有 live 标签的健康检查。

健康检查与 UI 集成

ASP.NET Core 提供了一个健康检查 UI 包,用于可视化健康检查结果。

dotnet add package AspNetCore.HealthChecks.UI
dotnet add package AspNetCore.HealthChecks.UI.Client
AspNetCore.HealthChecks.UI.SqlServer.Storage
AspNetCore.HealthChecks.UI.InMemory.Storage

配置 UI

builder.Services.AddHealthChecksUI().AddInMemoryStorage();
app.MapHealthChecksUI();

访问 /healthchecks-ui(默认路径)即可查看健康检查的仪表板。

图片

 


5. 常见健康检查扩展

ASP.NET Core 生态系统提供了许多开箱即用的健康检查扩展,例如:

  • • 数据库:SQL Server、MySQL、PostgreSQL、MongoDB、Entity Framework Core。

  • • 缓存:Redis、Memcached。

  • • 消息队列:RabbitMQ、Kafka。

  • • 外部服务:HTTP 端点、FTP、DNS。

安装对应的 NuGet 包并按文档配置即可。例如,检查 HTTP 端点:

builder.Services.AddHealthChecks()
    .AddUrlGroup(new Uri("https://api.dotnetshare.com"), name: "ExternalApi");

使用场景

  • • Kubernetes:配置 /health/ready 用于 Readiness Probe,/health/live 用于 Liveness Probe。

  • • 负载均衡器:通过健康检查端点检测节点是否可用。

  • • 监控系统:将健康检查结果集成到 Prometheus、Grafana 或其他监控工具。

  • • 微服务:确保服务及其依赖项(如数据库、API)正常运行。

注意事项

  • • 安全性:健康检查端点可能暴露敏感信息(如依赖项状态)。建议限制访问,例如通过 IP 白名单或身份验证。

  • • 性能:健康检查应尽量轻量,避免对系统造成额外负担。

  • • 超时:为健康检查设置合理的超时时间,避免阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值