Поделиться через


Проверка состояния в .NET.NET Aspire

Проверки работоспособности предоставляют сведения о доступности и состоянии приложения. Проверки работоспособности часто предоставляются как конечные точки HTTP, но также могут использоваться приложением для записи журналов или выполнения других задач на основе текущей работоспособности. Проверки работоспособности обычно используются в сочетании со внешней службой мониторинга или оркестратором контейнеров для проверки состояния приложения. Данные, сообщаемые проверками работоспособности, можно использовать для различных сценариев:

  • Влияние решений, принятых оркестраторами контейнеров, подсистемами балансировки нагрузки, шлюзами API и другими службами управления. Например, если проверка работоспособности контейнерного приложения завершается ошибкой, она может быть пропущена при маршрутизации трафика балансировщиком нагрузки.
  • Убедитесь, что доступны базовые зависимости, например база данных или кэш, и верните соответствующее сообщение о состоянии.
  • Активируйте оповещения или уведомления, когда приложение не отвечает должным образом.

конечные точки проверки работоспособности .NET.NET Aspire

.NET .NET Aspire по умолчанию предоставляет две конечные точки проверки работоспособности HTTP в средах разработки при вызове методов AddServiceDefaults и MapDefaultEndpoints из файла Program.cs.

  • Конечная точка /health указывает, работает ли приложение обычно, где оно готово к получению запросов. Все проверки работоспособности должны пройти успешно, чтобы приложение считалось готовым принимать трафик после запуска процесса.

    GET /health
    

    Конечная точка /health возвращает код состояния HTTP 200 и text/plain значение Healthy, когда приложение находится в исправном состоянии.

  • /alive указывает, запущено ли приложение или произошло сбой, и его необходимо перезапустить. Только проверки работоспособности, помеченные тегом live, должны успешно пройден для того, чтобы приложение считалось живым.

    GET /alive
    

    Конечная точка /alive возвращает код состояния HTTP 200 и значение text/plainHealthy, если приложение .

Методы AddServiceDefaults и MapDefaultEndpoints также применяют к вашему приложению различные конфигурации, помимо проверки работоспособности, включая 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.
  • Добавляет в ответ проверки работоспособности 10-секундный кэш с использованием политики под именем HealthChecks.

Теперь рассмотрим обновленный метод 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.

Помимо обновленных методов AddDefaultHealthChecks и MapDefaultEndpoints, необходимо также добавить соответствующие службы как для времени ожидания запросов, так и для кэширования выходных данных.

В соответствующей точке входа приложения (обычно файл 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);

См. также