Проверка состояния в .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/plain
Healthy, если приложение .
Методы 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);
См. также
- .NET проверки работоспособности приложения на C#
- проверка состояния в ASP.NET Core
.NET Aspire