共用方式為


.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 端點。 如果您需要啟用它們,建議使用各種路由功能來保護這些端點,例如主機篩選和/或授權。 如需詳細資訊,請參閱 ASP.NET Core中的健康情況檢查。

此外,為這些端點設定請求逾時和輸出快取可能會帶來好處,這可以防止濫用或拒絕服務攻擊。 若要這樣做,請考慮下列已修改的 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;
}

上述程式代碼:

  • 將健康檢查請求的逾時設定為5秒,並使用名為 HealthChecks的原則。
  • 使用名為 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();

如需詳細資訊,請參閱 中的要求逾時中間件,以及在 輸出快取中間件。

整合健康檢測

.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);

另請參閱

  • .NET 在 C# 中應用程式健康情況檢查
  • 中的 健康情況檢查