Udostępnij za pośrednictwem


Kontrole kondycji w .NET.NET Aspire

Testy kondycji zapewniają informacje o dostępności i stanie aplikacji. Kontrole zdrowia są często udostępniane jako punkty końcowe HTTP, ale aplikacja może ich używać także wewnętrznie do zapisywania logów lub wykonywania innych zadań na podstawie bieżącego stanu zdrowia. Kontrole kondycji są zwykle używane w połączeniu z zewnętrzną usługą monitorowania lub koordynatorem kontenerów w celu sprawdzenia stanu aplikacji. Dane zgłaszane przez kontrole kondycji mogą być używane w różnych scenariuszach:

  • Wpływ na decyzje podejmowane przez koordynatorów kontenerów, moduły równoważenia obciążenia, bramy interfejsu API i inne usługi zarządzania. Na przykład, jeśli sprawdzanie kondycji aplikacji konteneryzowanej zakończy się niepowodzeniem, może zostać pominięte przez moduł równoważący obciążenie kierujący ruchem.
  • Sprawdź, czy dostępne są podstawowe zależności, takie jak baza danych lub pamięć podręczna, i zwróć odpowiedni komunikat statusu.
  • Wyzwalaj alerty lub powiadomienia, gdy aplikacja nie odpowiada zgodnie z oczekiwaniami.

.NET .NET Aspire punktów końcowych sprawdzania kondycji

udostępnia dwa domyślne punkty końcowe HTTP do sprawdzania kondycji w środowiskach Development , gdy metody i są wywoływane z pliku .

  • Punkt końcowy /health wskazuje, czy aplikacja działa normalnie, gdzie jest gotowa do odbierania żądań. Wszystkie kontrole stanu muszą zakończyć się pomyślnie, aby aplikacja była uważana za gotową do akceptowania ruchu po uruchomieniu.

    GET /health
    

    Punkt końcowy /health zwraca kod stanu HTTP 200 i wartość text/plain wynoszącą Healthy, gdy aplikacja jest zdrowa.

  • /alive wskazuje, czy aplikacja jest uruchomiona, czy uległa awarii i musi zostać ponownie uruchomiona. Tylko testy stanu zdrowia oznaczone tagiem muszą zostać pomyślnie przeprowadzone, aby aplikacja została uznana za działającą.

    GET /alive
    

    Punkt końcowy /alive zwraca kod stanu HTTP 200 i wartość text/plainHealthy, gdy aplikacja jest aktywna.

Metody AddServiceDefaults i MapDefaultEndpoints stosują również różne konfiguracje w Twojej aplikacji poza kontrolami kondycji, takie jak konfiguracje OpenTelemetry i konfiguracje odnajdywania usług .

Środowiska nie-deweloperskie

W środowiskach nieprogramowania punkty końcowe /health i /alive są domyślnie wyłączone. Jeśli musisz je włączyć, zaleca się ochronę tych punktów końcowych przy użyciu różnych funkcji routingu, takich jak filtrowanie hostów i/lub autoryzacja. Aby uzyskać więcej informacji, zobacz sprawdzanie stanu zdrowia w sekcji ASP.NET Core.

Ponadto korzystne może być skonfigurowanie limitów czasu żądania i buforowania danych wyjściowych dla tych punktów końcowych w celu zapobiegania nadużyciom lub atakom typu "odmowa usługi". W tym celu należy wziąć pod uwagę następującą zmodyfikowaną metodę 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;
}

Powyższy kod:

  • Dodaje limit czasu 5 sekund do żądań kontroli kondycji z zasadą o nazwie HealthChecks.
  • Dodaje 10-sekundowy cache do odpowiedzi sprawdzania kondycji z polityką o nazwie HealthChecks.

Teraz rozważ zaktualizowaną metodę 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;
}

Powyższy kod:

  • Grupuje punkty końcowe sprawdzania kondycji pod ścieżką /.
  • Buforuje dane wyjściowe i określa czas żądania z odpowiednimi zasadami HealthChecks.

Oprócz zaktualizowanych metod AddDefaultHealthChecks i MapDefaultEndpoints należy również dodać odpowiednie usługi dla limitów czasu żądania i buforowania danych wyjściowych.

W odpowiednim punkcie wejścia aplikacji klienckiej (zazwyczaj w pliku oznaczonym jako Program.cs) dodaj następujący kod:

// 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();

Aby uzyskać więcej informacji, zobacz przekroczenie limitu czasu żądania w oprogramowaniu pośredniczącym w programie ASP.NET Core i buforowanie danych wyjściowych w oprogramowaniu pośredniczącym w programie ASP.NET Core.

Testy kondycji integracji

.NET .NET Aspire integracje mogą również rejestrować dodatkowe kontrole kondycji aplikacji. Te kontrole stanu zdrowia przyczyniają się do zwracanego statusu punktów końcowych /health i /alive. Na przykład integracja .NET AspirePostgreSQL automatycznie dodaje kontrolę kondycji, aby sprawdzić następujące warunki:

  • Można ustanowić połączenie z bazą danych
  • Zapytanie bazy danych może zostać wykonane pomyślnie

Jeśli którakolwiek z tych operacji zakończy się niepowodzeniem, odpowiednia kontrola kondycji również zakończy się niepowodzeniem.

Konfigurowanie kontroli kondycji

Możesz wyłączyć kontrole kondycji dla danej integracji przy użyciu jednej z dostępnych opcji konfiguracji. .NET .NET Aspire integracje obsługują Microsoft.Extensions.Configurations do stosowania ustawień za pośrednictwem plików konfiguracji, takich jak appsettings.json:

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

Możesz również użyć delegata wbudowanego, aby skonfigurować kontrole kondycji:

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

Zobacz też