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:
- Membuat instans baru HostApplicationBuilder .
- Menambahkan pemeriksaan kesehatan untuk pemanfaatan sumber daya dengan menautkan panggilan dari AddHealthChecks panggilan ke AddResourceUtilizationHealthCheck metode ekstensi.
- Membangun instans IHost sebagai
app
variabel. - Mendapatkan instans HealthCheckService kelas dari penyedia layanan.
- Melakukan pemeriksaan kesehatan dan menampilkan hasilnya.
- Menjalankan aplikasi.
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:
- Instans HealthCheckService kelas.
- Instans ILogger<TCategoryName> kelas.
- IHostedLifecycleService Mengimplementasikan antarmuka, dengan setiap metode memanggil
CheckHealthAsync
metode . ReadyAsync
Menentukan metode yang memanggilCheckHealthAsync
metode .- Menentukan metode kustom
CheckHealthAsync
yang mengambil nama pemanggil dan token pembatalan, lalu meminta pemeriksaan kesehatan dariHealthCheckService
instans. yangresult
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 adalahExampleService
instans.- Panggilan diberikan Task.WhenAll dua referensi tugas:
- Metode ini
DelayAndReportAsync
, yang menunda selama 500 milidetik dan kemudian memanggil metode padaExampleService
instansReadyAsync
, akan mengevaluasi pemeriksaan kesehatan. - Metode ini RunAsync(IHost, CancellationToken) , memulai
app
.
- Metode ini
Aplikasi mengeluarkan log dalam urutan berikut, melaporkan status pemeriksaan kesehatan karena berkaitan dengan peristiwa siklus hidup:
StartingAsync
: Tidak SehatStartAsync
: Tidak SehatStartedAsync
: Tidak SehatReadyAsync
:SehatStoppingAsync
: Tidak SehatStopAsync
: Tidak SehatStoppedAsync
: 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.