Проверка работоспособности приложений .NET в C#
В распределенной системе проверки работоспособности — это периодические оценки состояния, доступности и производительности отдельных узлов или служб. Эти проверки обеспечивают правильную и эффективную работу системных функций. Проверки работоспособности важны для надежности системы, и они обычно выполняются с регулярными интервалами с результатами, проанализированными для принятия решений и исправлений.
Возможны следующие результаты проверки состояния хита:
Кроме того, проверки работоспособности часто сообщают о различных диагностических метриках. Дополнительные сведения см. в разделе Метрики диагностики: Microsoft.Extensions.Diagnostics.HealthChecks
Проверки работоспособности использования ресурсов
Чтобы проверить работоспособность использования ресурсов приложений .NET, добавьте ссылку на пакет в Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. В экземпляре IServiceCollection прицефруйте вызов из AddHealthChecks AddResourceUtilizationHealthCheck. В следующем примере показано, как использовать AddResourceUtilizationHealthCheck
метод расширения для добавления проверки работоспособности использования ресурсов в IServiceCollection
экземпляр:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHealthChecks()
.AddResourceUtilizationHealthCheck();
var app = builder.Build();
var healthCheckService = app.Services.GetRequiredService<HealthCheckService>();
var result = await healthCheckService.CheckHealthAsync();
Console.WriteLine($"{result.Status} {result.TotalDuration}");
app.Run();
Предыдущий код:
- Создает новый экземпляр HostApplicationBuilder.
- Добавляет проверку работоспособности использования ресурсов путем цепочки вызова из AddHealthChecks вызова AddResourceUtilizationHealthCheck метода расширения.
- IHost Создает экземпляр в качестве переменной
app
. - Возвращает экземпляр HealthCheckService класса из поставщика услуг.
- Выполняет проверку работоспособности и отображает результат.
- Запускает приложение.
Проверки работоспособности приложения
Чтобы проверить работоспособность событий IHostApplicationLifetimeвремени существования приложения, используйте AddApplicationLifecycleHealthCheck метод расширения, доступный в пакете NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common .
Этот поставщик указывает, что приложение работает только в том случае, если оно полностью активно. До тех пор, пока объект времени существования не указывает, что приложение запущено, поставщик сообщит о том, что приложение не работает. После завершения работы приложения поставщик сообщит о неработоспособной работе приложения.
Библиотека предоставляет HealthCheckService пользователям возможность запрашивать проверку работоспособности в любое время. Рассмотрим следующую реализацию ExampleService
.
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
internal class ExampleLifecycle(
HealthCheckService healthCheckService,
ILogger<ExampleLifecycle> logger) : IHostedLifecycleService
{
Task IHostedService.StartAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedService.StopAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
public Task ReadyAsync() => CheckHealthAsync();
private async Task CheckHealthAsync(
[CallerMemberName] string eventName = "",
CancellationToken cancellationToken = default)
{
HealthReport result =
await healthCheckService.CheckHealthAsync(cancellationToken);
logger.LogInformation(
"{EventName}: {Status}", eventName, result.Status);
}
}
Предыдущий код:
- Определяет новый
ExampleLifecycle
класс, реализующий IHostedService интерфейс. - Определяет основной конструктор, принимаюющий следующие параметры:
- Экземпляр класса HealthCheckService.
- Экземпляр класса ILogger<TCategoryName>.
- IHostedLifecycleService Реализует интерфейс с каждым методом, вызывающим
CheckHealthAsync
метод. - Определяет метод, вызывающий
ReadyAsync
CheckHealthAsync
метод. - Определяет пользовательский
CheckHealthAsync
метод, который записывает имя вызывающего объекта и маркер отмены, а затем запрашивает проверку работоспособности из экземпляраHealthCheckService
. Затемresult
записывается в журнал.
Единственный раз, когда служба проверки работоспособности сообщит о состоянии HealthStatus.Healthy после запуска приложения и перед остановкой. Рассмотрим следующие Program.cs:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
var healthChecksBuilder = builder.Services
.AddHostedService<ExampleLifecycle>()
.AddHealthChecks()
.AddApplicationLifecycleHealthCheck();
// You could use the healthChecksBuilder instance to add more checks...
var app = builder.Build();
var services = app.Services.GetRequiredService<IEnumerable<IHostedService>>();
await Task.WhenAll(DelayAndReportAsync(services), app.RunAsync());
static async Task DelayAndReportAsync(IEnumerable<IHostedService> services)
{
// Ensure app started...
await Task.Delay(500);
var service = services.FirstOrDefault(static s => s is ExampleLifecycle);
if (service is ExampleLifecycle example)
{
await example.ReadyAsync();
}
}
Предыдущий код:
- Создает новый HostApplicationBuilder экземпляр, назначенный в качестве переменной
builder
. ExampleService
Регистрирует только IHostedServiceприложение.- Добавляет проверку работоспособности для событий IHostApplicationLifetime времени существования приложения путем цепочки вызова из IHealthChecksBuilder экземпляра, возвращаемого AddHealthChecks AddApplicationLifecycleHealthCheck вызовом метода расширения.
- Экземпляр
healthChecksBuilder
можно использовать для добавления дополнительных проверок работоспособности.
- Экземпляр
- IHost Создает экземпляр в качестве переменной
app
. IHostedService
Получает от поставщика услуг, этоExampleService
экземпляр.- Вызовы с двумя Task.WhenAll ссылками на задачи:
- Метод
DelayAndReportAsync
, который задерживаетReadyAsync
500 миллисекунд, а затем вызывает метод в экземпляреExampleService
, будет оценивать проверку работоспособности. - Метод RunAsync(IHost, CancellationToken) запускается
app
.
- Метод
Приложение выводит журналы в следующем порядке, сообщая о состоянии проверки работоспособности в связи с событиями жизненного цикла:
StartingAsync
:НездоровыйStartAsync
:НездоровыйStartedAsync
:НездоровыйReadyAsync
:ЗдоровыйStoppingAsync
:НездоровыйStopAsync
:НездоровыйStoppedAsync
:Нездоровый
Другими словами, этот поставщик гарантирует, что экземпляр приложения получает трафик только после его готовности. Если вы разрабатываете веб-приложения с помощью ASP.NET Core, доступно по промежуточному слоям проверки работоспособности. Дополнительные сведения см . в разделе "Проверка работоспособности" в ASP.NET Core.