Bagikan melalui


Pemeriksaan kesehatan di .NET.NET Aspire

Pemeriksaan kesehatan menyediakan ketersediaan dan informasi status tentang aplikasi. Pemeriksaan kesehatan sering dijadikan sebagai endpoint HTTP, tetapi juga dapat digunakan secara internal oleh aplikasi untuk menulis log atau melakukan tugas lain berdasarkan status kesehatan saat ini. Pemeriksaan kesehatan biasanya digunakan dalam kombinasi dengan layanan pemantauan eksternal atau orkestrator kontainer untuk memeriksa status aplikasi. Data yang dilaporkan oleh pemeriksaan kesehatan dapat digunakan untuk berbagai skenario:

  • Memengaruhi keputusan yang dibuat oleh orkestrator kontainer, load balancer, gateway API, dan layanan manajemen lainnya. Misalnya, jika pemeriksaan kesehatan untuk aplikasi kontainer gagal, load balancer mungkin akan mengabaikannya saat mengarahkan lalu lintas.
  • Verifikasi bahwa dependensi yang mendasar tersedia, seperti database atau cache, dan kembalikan pesan status yang sesuai.
  • Kirim peringatan atau pemberitahuan saat aplikasi tidak merespons seperti yang diharapkan.

.NET .NET Aspire titik akhir pemeriksaan kesehatan

mengekspos dua titik akhir HTTP pemeriksaan kesehatan default di lingkungan Pengembangan ketika metode dan dipanggil dari file :

  • Titik akhir /health menunjukkan apakah aplikasi berjalan normal di mana aplikasi siap menerima permintaan. Semua pemeriksaan kesehatan harus lulus agar aplikasi dianggap siap menerima lalu lintas setelah dimulai.

    GET /health
    

    Titik akhir /health mengembalikan kode status HTTP 200 dan nilai text/plainHealthy ketika aplikasi sehat.

  • /alive menunjukkan apakah aplikasi sedang berjalan atau mengalami crash dan harus dimulai ulang. Hanya pemeriksaan kesehatan yang ditandai dengan tag live yang harus dilewati agar aplikasi dianggap aktif.

    GET /alive
    

    Titik akhir /alive mengembalikan kode status HTTP 200 dan nilai text/plainHealthy saat aplikasi berjalan.

Metode AddServiceDefaults dan MapDefaultEndpoints juga menerapkan berbagai konfigurasi ke aplikasi Anda, tidak hanya untuk pemeriksaan kesehatan, tetapi juga untuk konfigurasi penemuan layanan seperti OpenTelemetry dan .

Lingkungan non-pengembangan

Di lingkungan non-pengembangan, titik akhir /health dan /alive dinonaktifkan secara default. Jika Anda perlu mengaktifkannya, disarankan untuk melindungi titik akhir ini dengan berbagai fitur perutean, seperti pemfilteran host dan/atau otorisasi. Untuk informasi selengkapnya, lihat pemeriksaan kesehatan di ASP.NET Core.

Selain itu, mungkin menguntungkan untuk mengonfigurasi pengaturan batas waktu permintaan dan caching output untuk titik akhir ini untuk mencegah penyalahgunaan atau serangan penolakan layanan. Untuk melakukannya, pertimbangkan metode AddDefaultHealthChecks yang dimodifikasi berikut:

public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
{
    builder.Services.AddRequestTimeouts(
        configure: static timeouts =>
            timeouts.AddPolicy("HealthChecks", TimeSpan.FromSeconds(5)));

    builder.Services.AddOutputCache(
        configureOptions: static caching =>
            caching.AddPolicy("HealthChecks",
            build: static policy => policy.Expire(TimeSpan.FromSeconds(10))));

    builder.Services.AddHealthChecks()
        // Add a default liveness check to ensure app is responsive
        .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);

    return builder;
}

Kode sebelumnya:

  • Menambahkan batas waktu 5 detik ke permintaan pemeriksaan kesehatan dengan kebijakan bernama HealthChecks.
  • Menambahkan cache berdurasi 10 detik ke respons pemeriksaan kesehatan dengan kebijakan bernama HealthChecks.

Sekarang pertimbangkan metode MapDefaultEndpoints yang diperbarui:

public static WebApplication MapDefaultEndpoints(this WebApplication app)
{
    var healthChecks = app.MapGroup("");

    healthChecks
        .CacheOutput("HealthChecks")
        .WithRequestTimeout("HealthChecks");

    // All health checks must pass for app to be
    // considered ready to accept traffic after starting
    healthChecks.MapHealthChecks("/health");

    // Only health checks tagged with the "live" tag
    // must pass for app to be considered alive
    healthChecks.MapHealthChecks("/alive", new()
    {
        Predicate = static r => r.Tags.Contains("live")
    });

    return app;
}

Kode sebelumnya:

  • Mengelompokkan titik akhir pemeriksaan kesehatan di bawah jalur /.
  • Cache output dan menentukan waktu permintaan dengan kebijakan HealthChecks yang sesuai.

Selain metode AddDefaultHealthChecks dan MapDefaultEndpoints yang diperbarui, Anda juga harus menambahkan layanan yang sesuai untuk layanan batas waktu permintaan dan penyimpanan sementara output.

Dalam titik masuk aplikasi yang sesuai untuk mengonsumsi (biasanya file Program.cs), tambahkan kode berikut:

// Wherever your services are being registered.
// Before the call to Build().
builder.Services.AddRequestTimeouts();
builder.Services.AddOutputCache();

var app = builder.Build();

// Wherever your app has been built, before the call to Run().
app.UseRequestTimeouts();
app.UseOutputCache();

app.Run();

Untuk informasi selengkapnya, lihat middleware batas waktu permintaan di ASP.NET Core dan middleware caching output di ASP.NET Core.

Pemeriksaan kesehatan integrasi

integrasi .NET.NET Aspire juga dapat mendaftarkan pemeriksaan kesehatan tambahan untuk aplikasi Anda. Pemeriksaan kesehatan ini berkontribusi pada status titik akhir /health dan /alive yang dikembalikan. Misalnya, integrasi .NET AspirePostgreSQL secara otomatis menambahkan pemeriksaan kesehatan untuk memverifikasi kondisi berikut:

  • Koneksi database dapat dibuat
  • Kueri database dapat berhasil dijalankan

Jika salah satu operasi ini gagal, pemeriksaan kesehatan yang sesuai juga gagal.

Mengonfigurasi pemeriksaan kesehatan

Anda dapat menonaktifkan pemeriksaan kesehatan untuk integrasi tertentu menggunakan salah satu opsi konfigurasi yang tersedia. integrasi mendukung Microsoft.Extensions.Configurations untuk menerapkan pengaturan melalui file konfigurasi seperti :

{
  "Aspire": {
    "Npgsql": {
      "DisableHealthChecks": true,
    }
  }
}

Anda juga dapat menggunakan delegasi sebaris untuk mengonfigurasi pemeriksaan kesehatan:

builder.AddNpgsqlDbContext<MyDbContext>(
    "postgresdb",
    static settings => settings.DisableHealthChecks  = true);

Lihat juga