Bagikan melalui


Pemeriksaan kesehatan aplikasi .NET di C#

Dalam sistem terdistribusi, pemeriksaan kesehatan adalah penilaian berkala tentang status, ketersediaan, dan performa simpul atau layanan individu. Pemeriksaan ini memastikan bahwa sistem berfungsi dengan benar dan efisien. Pemeriksaan kesehatan sangat penting untuk keandalan sistem, dan biasanya dilakukan secara berkala dengan hasil yang dianalisis untuk pengambilan keputusan dan tindakan korektif.

Hasil status pemeriksaan heath berikut dimungkinkan:

Selain itu, pemeriksaan kesehatan sering melaporkan berbagai metrik diagnostik. Untuk informasi selengkapnya, lihat Metrik Diagnostik: Microsoft.Extensions.Diagnostics.HealthChecks.

Pemeriksaan kesehatan pemanfaatan sumber daya

Untuk melakukan pemeriksaan kesehatan pada pemanfaatan sumber daya aplikasi .NET Anda, tambahkan referensi paket ke Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. IServiceCollection Pada instans, rantai panggilan dari AddHealthChecks ke AddResourceUtilizationHealthCheck. Contoh berikut menunjukkan cara menggunakan AddResourceUtilizationHealthCheck metode ekstensi untuk menambahkan pemeriksaan kesehatan pemanfaatan sumber daya ke IServiceCollection instans:

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();

Kode sebelumnya:

Pemeriksaan kesehatan seumur hidup aplikasi

Untuk melakukan pemeriksaan kesehatan pada peristiwa IHostApplicationLifetimeseumur hidup aplikasi , gunakan metode ekstensi yang AddApplicationLifecycleHealthCheck tersedia di paket NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common .

Penyedia ini akan menunjukkan bahwa aplikasi sehat hanya ketika sepenuhnya aktif. Sampai objek seumur hidup menunjukkan aplikasi telah dimulai, penyedia akan melaporkan aplikasi sebagai tidak sehat. Ketika aplikasi mulai dimatikan, penyedia akan melaporkan aplikasi sebagai tidak sehat.

Pustaka mengekspos konsumen yang HealthCheckService memungkinkan untuk meminta pemeriksaan kesehatan kapan saja. Pertimbangkan implementasi berikut 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);
    }
}

Kode sebelumnya:

  • Mendefinisikan kelas baru ExampleLifecycle yang mengimplementasikan IHostedService antarmuka.
  • Menentukan konstruktor utama yang menerima parameter berikut:
  • IHostedLifecycleService Mengimplementasikan antarmuka, dengan setiap metode memanggil CheckHealthAsync metode .
  • ReadyAsync Menentukan metode yang memanggil CheckHealthAsync metode .
  • Menentukan metode kustom CheckHealthAsync yang mengambil nama pemanggil dan token pembatalan, lalu meminta pemeriksaan kesehatan dari HealthCheckService instans. yang result kemudian dicatat.

Satu-satunya waktu layanan pemeriksaan kesehatan akan melaporkan status HealthStatus.Healthy adalah setelah aplikasi dimulai dan sebelum berhenti dipanggil. Harap pertimbangkan Program.cs berikut:

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();
    }
}

Kode sebelumnya:

  • Membuat instans baru HostApplicationBuilder yang ditetapkan sebagai builder variabel.
  • ExampleService Mendaftarkan sebagai satu-satunya IHostedServiceaplikasi .
  • Menambahkan pemeriksaan kesehatan untuk peristiwa IHostApplicationLifetime seumur hidup aplikasi dengan menautkan panggilan dari IHealthChecksBuilder instans yang dikembalikan oleh AddHealthChecks panggilan ke AddApplicationLifecycleHealthCheck metode ekstensi.
    • healthChecksBuilder Instans dapat digunakan untuk menambahkan lebih banyak pemeriksaan kesehatan.
  • Membangun instans IHost sebagai app variabel.
  • IHostedService Mendapatkan dari penyedia layanan, ini adalah ExampleService instans.
  • Panggilan diberikan Task.WhenAll dua referensi tugas:
    • Metode iniDelayAndReportAsync, yang menunda selama 500 milidetik dan kemudian memanggil metode pada ExampleService instansReadyAsync, akan mengevaluasi pemeriksaan kesehatan.
    • Metode ini RunAsync(IHost, CancellationToken) , memulai app.

Aplikasi mengeluarkan log dalam urutan berikut, melaporkan status pemeriksaan kesehatan karena berkaitan dengan peristiwa siklus hidup:

  1. StartingAsync: Tidak Sehat
  2. StartAsync: Tidak Sehat
  3. StartedAsync: Tidak Sehat
  4. ReadyAsync:Sehat
  5. StoppingAsync: Tidak Sehat
  6. StopAsync: Tidak Sehat
  7. StoppedAsync: Tidak Sehat

Dengan kata lain, penyedia ini memastikan bahwa instans aplikasi hanya menerima lalu lintas saat siap. Jika Anda mengembangkan aplikasi web dengan ASP.NET Core, ada middleware pemeriksaan kesehatan yang tersedia. Untuk informasi selengkapnya, Pemeriksaan kesehatan di ASP.NET Core.

Lihat juga