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

См. также