Проверка работоспособности приложений .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 интерфейс.
  • Определяет основной конструктор, принимаюющий следующие параметры:
  • Реализует интерфейс 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 экземпляра, возвращаемого AddHealthChecksAddApplicationLifecycleHealthCheck вызовом метода расширения.
    • Экземпляр healthChecksBuilder можно использовать для добавления дополнительных проверок состояния системы.
  • Создает экземпляр IHost как переменную app.
  • Получает IHostedService от поставщика услуг, это экземпляр ExampleService.
  • Вызовы с двумя Task.WhenAll ссылками на задачи:
    • Метод DelayAndReportAsync, который задерживает выполнение на 500 миллисекунд, а затем вызывает метод ReadyAsync на экземпляре ExampleService, оценит проверку работоспособности.
    • Метод RunAsync(IHost, CancellationToken) запускает app.

Приложение создает логи в следующем порядке, информируя о состоянии проверки работоспособности в связи с событиями жизненного цикла приложения:

  1. StartingAsync:Нездоровый
  2. StartAsync:Нездоровый
  3. StartedAsync:Нездоровый
  4. ReadyAsync:Здоровый
  5. StoppingAsync:Нездоровый
  6. StopAsync:Нездоровый
  7. StoppedAsync:Нездоровый

Другими словами, этот поставщик гарантирует, что экземпляр приложения получает трафик только после его готовности. Если вы разрабатываете веб-приложения с помощью ASP.NET Core, доступно промежуточное программное обеспечение для проверки работоспособности. Дополнительную информацию см. в разделе "Проверка работоспособности в ASP.NET Core".

См. также