.NET .NET Aspire 中的健康检查

运行状况检查提供有关应用的可用性和状态信息。 运行状况检查通常公开为 HTTP 终结点,但也可由应用在内部使用,以写入日志或基于当前运行状况执行其他任务。 运行状况检查通常与外部监控服务或容器编排系统结合使用来检查应用的状态。 健康检查报告的数据可用于各种场景:

  • 影响容器编排器、负载均衡器、API 网关以及其他管理服务所做的决策。 例如,如果容器化应用的运行状况检查失败,负载均衡器在路由流量时可能会跳过该应用。
  • 验证基础依赖项是否可用(例如数据库或缓存),并返回适当的状态消息。
  • 当应用未按预期响应时触发警报或通知。

.NET .NET Aspire 运行状况检查端点

当从 Program.cs 文件中调用 AddServiceDefaultsMapDefaultEndpoints 方法时,.NET.NET Aspire 会在 开发 环境中公开两个默认的健康检查 HTTP 终结点:

  • /health 终结点指示应用是否正常运行,以便接收请求。 所有运行状况检查都必须通过,应用才能在启动后被视为已准备好接受流量。

    GET /health
    

    当应用 正常时,/health 终结点返回 HTTP 状态代码 200,并返回一个 text/plainHealthy 的值。

  • /alive 指示应用是否正在运行或已崩溃,并且必须重新启动。 只有标记为 存活 标记的运行状况检查才能使应用被视为活动状态。

    GET /alive
    

    当应用程序 运行时,/alive 终结点返回 HTTP 状态代码 200 和 text/plainHealthy

除了运行状况检查之外,AddServiceDefaultsMapDefaultEndpoints 方法还对应用应用各种配置,例如 OpenTelemetry服务发现 配置。

非开发环境

在非开发环境中,默认情况下禁用 /health/alive 终结点。 如果需要启用它们,建议使用各种路由功能(例如主机筛选和/或授权)保护这些终结点。 有关更多信息,请参阅 中的 健康检查。

此外,最好为这些终结点配置请求超时和输出缓存,以防止滥用或拒绝服务攻击。 为了做到这一点,请考虑以下修改 AddDefaultHealthChecks 方法:

public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
{
    builder.Services.AddRequestTimeouts(
        configure: static timeouts =>
            timeouts.AddPolicy("HealthChecks", TimeSpan.FromSeconds(5)));

    builder.Services.AddOutputCache(
        configureOptions: static caching =>
            caching.AddPolicy("HealthChecks",
            build: static policy => policy.Expire(TimeSpan.FromSeconds(10))));

    builder.Services.AddHealthChecks()
        // Add a default liveness check to ensure app is responsive
        .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);

    return builder;
}

前面的代码:

  • 使用名为 HealthChecks的策略向运行状况检查请求添加 5 秒的超时。
  • 使用名为 HealthChecks的策略将 10 秒缓存添加到运行状况检查响应中。

现在考虑更新的 MapDefaultEndpoints 方法:

public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
    var healthChecks = app.MapGroup("");

    healthChecks
        .CacheOutput("HealthChecks")
        .WithRequestTimeout("HealthChecks");

    // All health checks must pass for app to be
    // considered ready to accept traffic after starting
    healthChecks.MapHealthChecks("/health");

    // Only health checks tagged with the "live" tag
    // must pass for app to be considered alive
    healthChecks.MapHealthChecks("/alive", new()
    {
        Predicate = static r => r.Tags.Contains("live")
    });

    return app;
}

前面的代码:

  • 将运行状况检查终结点分组到 / 路径下。
  • 缓存输出,并使用相应的 HealthChecks 策略指定请求时间。

除了更新的 AddDefaultHealthChecksMapDefaultEndpoints 方法之外,还必须为请求超时和输出缓存添加相应的服务。

在适当的使用应用的入口点(通常是 Program.cs 文件中),添加以下代码:

// Wherever your services are being registered.
// Before the call to Build().
builder.Services.AddRequestTimeouts();
builder.Services.AddOutputCache();

var app = builder.Build();

// Wherever your app has been built, before the call to Run().
app.UseRequestTimeouts();
app.UseOutputCache();

app.Run();

有关详细信息,请参阅 中的 ASP.NET Core 请求超时中间件,以及 ASP.NET Core中的 输出缓存中间件。

集成健康状态检查

.NET .NET Aspire 集成还可以为您的应用注册其他健康检查。 这些运行状况检查有助于返回 /health/alive 终结点的状态。 例如,.NET AspirePostgreSQL 集成会自动添加健康检查来验证以下条件:

  • 可以建立数据库连接
  • 可以成功执行数据库查询

如果其中任一操作失败,相应的健康检查也会失败。

配置运行状况检查

可以使用其中一个可用的配置选项禁用给定集成的健康检查。 .NET .NET Aspire 集成支持 Microsoft.Extensions.Configurations 通过配置文件(例如 appsettings.json)应用设置:

{
  "Aspire": {
    "Npgsql": {
      "DisableHealthChecks": true,
    }
  }
}

还可以使用内联委托来配置健康检查:

builder.AddNpgsqlDbContext<MyDbContext>(
    "postgresdb",
    static settings => settings.DisableHealthChecks  = true);

另请参阅