Pemantauan kesehatan

Tip

Konten ini adalah kutipan dari eBook, .NET Microservices Architecture for Containerized .NET Applications, tersedia di .NET Docs atau sebagai PDF yang dapat diunduh gratis dan dapat dibaca secara offline.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Pemantauan kesehatan dapat memungkinkan informasi hampir real-time tentang status kontainer dan layanan mikro Anda. Pemantauan kesehatan sangat penting untuk beberapa aspek layanan mikro pengoperasian dan sangat penting ketika orkestrator melakukan peningkatan aplikasi parsial secara bertahap, seperti yang dijelaskan nanti.

Aplikasi berbasis layanan mikro sering menggunakan heartbeat atau pemeriksaan kesehatan untuk memungkinkan monitor performa, penjadwal, dan orkestrator mereka melacak banyak layanan. Jika layanan tidak dapat mengirim semacam sinyal "Saya masih aktif", baik sesuai permintaan atau sesuai jadwal, aplikasi Anda mungkin menghadapi risiko ketika Anda menyebarkan pembaruan, atau mungkin hanya mendeteksi kegagalan terlalu terlambat dan tidak dapat menghentikan kegagalan bertingkat yang dapat berakhir pada pemadaman besar.

Dalam model umum, layanan mengirim laporan tentang statusnya, dan informasi tersebut dikumpulkan untuk memberikan tampilan keseluruhan tentang status kesehatan aplikasi Anda. Jika Anda menggunakan orkestrator, Anda dapat memberikan informasi kesehatan ke kluster orkestrator Anda, sehingga kluster dapat bertindak sesuai. Jika Anda berinvestasi dalam pelaporan kesehatan berkualitas tinggi yang menangkap kondisi kustom Anda, Anda dapat mendeteksi dan memperbaiki masalah untuk aplikasi yang sedang berjalan dengan lebih mudah.

Menerapkan pemeriksaan kesehatan di layanan ASP.NET Core

Saat mengembangkan layanan mikro atau aplikasi web ASP.NET Core, Anda dapat menggunakan fitur pemeriksaan kesehatan bawaan yang dirilis di ASP .NET Core 2.2 (Microsoft.Extensions.Diagnostics.HealthChecks). Seperti banyak fitur ASP.NET Core, pemeriksaan kesehatan dilengkapi dengan serangkaian layanan dan middleware.

Layanan pemeriksaan kesehatan dan middleware mudah digunakan dan menyediakan kemampuan yang memungkinkan Anda memvalidasi apakah ada sumber daya eksternal yang diperlukan untuk aplikasi Anda (seperti database SQL Server atau API jarak jauh) berfungsi dengan baik. Ketika Anda menggunakan fitur ini, Anda juga dapat memutuskan apa artinya sumber daya sehat, seperti yang kami jelaskan nanti.

Untuk menggunakan fitur ini secara efektif, Anda harus terlebih dahulu mengonfigurasi layanan di layanan mikro Anda. Kedua, Anda memerlukan aplikasi front-end yang mengkueri laporan kesehatan. Aplikasi front-end itu bisa menjadi aplikasi pelaporan kustom, atau bisa menjadi orkestrator itu sendiri yang dapat bereaksi sesuai dengan status kesehatan.

Gunakan fitur HealthChecks di layanan mikro ASP.NET back-end Anda

Di bagian ini, Anda akan mempelajari cara menerapkan fitur HealthChecks dalam contoh aplikasi API Web ASP.NET Core 8.0 saat menggunakan paket Microsoft.Extensions.Diagnostics.HealthChecks . Implementasi fitur ini dalam layanan mikro skala besar seperti eShopOnContainers dijelaskan di bagian berikutnya.

Untuk memulai, Anda perlu menentukan apa yang merupakan status sehat untuk setiap layanan mikro. Dalam aplikasi sampel, kami menentukan layanan mikro sehat jika API-nya dapat diakses melalui HTTP dan database SQL Server terkait juga tersedia.

Di .NET 8, dengan API bawaan, Anda dapat mengonfigurasi layanan, menambahkan Pemeriksaan Kesehatan untuk layanan mikro dan database SQL Server dependennya dengan cara ini:

// Program.cs from .NET 8 Web API sample

//...
// Registers required services for health checks
builder.Services.AddHealthChecks()
    // Add a health check for a SQL Server database
    .AddCheck(
        "OrderingDB-check",
        new SqlConnectionHealthCheck(builder.Configuration["ConnectionString"]),
        HealthStatus.Unhealthy,
        new string[] { "orderingdb" });

Dalam kode sebelumnya, metode mengonfigurasi services.AddHealthChecks() pemeriksaan HTTP dasar yang mengembalikan kode status 200 dengan "Sehat". Selanjutnya, AddCheck() metode ekstensi mengonfigurasi kustom SqlConnectionHealthCheck yang memeriksa kesehatan SQL Database terkait.

Metode menambahkan AddCheck() pemeriksaan kesehatan baru dengan nama tertentu dan implementasi jenis IHealthCheck. Anda dapat menambahkan beberapa Pemeriksaan Kesehatan menggunakan metode AddCheck, sehingga layanan mikro tidak akan memberikan status "sehat" sampai semua pemeriksaannya sehat.

SqlConnectionHealthCheckadalah kelas kustom yang mengimplementasikan IHealthCheck, yang mengambil string koneksi sebagai parameter konstruktor dan menjalankan kueri sederhana untuk memeriksa apakah koneksi ke database SQL berhasil. Layanan ini mengembalikan HealthCheckResult.Healthy() jika kueri berhasil dijalankan dan dengan pengecualian aktual FailureStatus saat gagal.

// Sample SQL Connection Health Check
public class SqlConnectionHealthCheck : IHealthCheck
{
    private const string DefaultTestQuery = "Select 1";

    public string ConnectionString { get; }

    public string TestQuery { get; }

    public SqlConnectionHealthCheck(string connectionString)
        : this(connectionString, testQuery: DefaultTestQuery)
    {
    }

    public SqlConnectionHealthCheck(string connectionString, string testQuery)
    {
        ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
        TestQuery = testQuery;
    }

    public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            try
            {
                await connection.OpenAsync(cancellationToken);

                if (TestQuery != null)
                {
                    var command = connection.CreateCommand();
                    command.CommandText = TestQuery;

                    await command.ExecuteNonQueryAsync(cancellationToken);
                }
            }
            catch (DbException ex)
            {
                return new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex);
            }
        }

        return HealthCheckResult.Healthy();
    }
}

Perhatikan bahwa dalam kode sebelumnya, Select 1 adalah kueri yang digunakan untuk memeriksa Kesehatan database. Untuk memantau ketersediaan layanan mikro Anda, orkestrator seperti Kubernetes secara berkala melakukan pemeriksaan kesehatan dengan mengirim permintaan untuk menguji layanan mikro. Penting untuk menjaga kueri database Anda tetap efisien sehingga operasi ini cepat dan tidak menghasilkan pemanfaatan sumber daya yang lebih tinggi.

Terakhir, tambahkan middleware yang merespons jalur /hcurl :

// Program.cs from .NET 8 Web Api sample

app.MapHealthChecks("/hc");

Ketika titik akhir dipanggil, titik <yourmicroservice>/hc akhir menjalankan semua pemeriksaan kesehatan yang dikonfigurasi dalam AddHealthChecks() metode di kelas Startup dan menunjukkan hasilnya.

Implementasi HealthChecks di eShopOnContainers

Layanan mikro di eShopOnContainers mengandalkan beberapa layanan untuk melakukan tugasnya. Misalnya, Catalog.API layanan mikro dari eShopOnContainers tergantung pada banyak layanan, seperti Azure Blob Storage, SQL Server, dan RabbitMQ. Oleh karena itu, ia memiliki beberapa pemeriksaan kesehatan yang ditambahkan menggunakan AddCheck() metode. Untuk setiap layanan dependen, implementasi kustom IHealthCheck yang menentukan status kesehatan masing-masing perlu ditambahkan.

Proyek sumber terbuka AspNetCore.Diagnostics.HealthChecks memecahkan masalah ini dengan menyediakan implementasi pemeriksaan kesehatan kustom untuk setiap layanan perusahaan ini, yang dibangun di atas .NET 8. Setiap pemeriksaan kesehatan tersedia sebagai paket NuGet individual yang dapat dengan mudah ditambahkan ke proyek. eShopOnContainers menggunakannya secara luas di semua layanan mikronya.

Misalnya, dalam Catalog.API layanan mikro, paket NuGet berikut ditambahkan:

Screenshot of the AspNetCore.Diagnostics.HealthChecks NuGet packages.

Gambar 8-7. Pemeriksaan Kesehatan Kustom yang diterapkan di Catalog.API menggunakan AspNetCore.Diagnostics.HealthChecks

Dalam kode berikut, implementasi pemeriksaan kesehatan ditambahkan untuk setiap layanan dependen dan kemudian middleware dikonfigurasi:

// Extension method from Catalog.api microservice
//
public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration)
{
    var accountName = configuration.GetValue<string>("AzureStorageAccountName");
    var accountKey = configuration.GetValue<string>("AzureStorageAccountKey");

    var hcBuilder = services.AddHealthChecks();

    hcBuilder
        .AddSqlServer(
            configuration["ConnectionString"],
            name: "CatalogDB-check",
            tags: new string[] { "catalogdb" });

    if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey))
    {
        hcBuilder
            .AddAzureBlobStorage(
                $"DefaultEndpointsProtocol=https;AccountName={accountName};AccountKey={accountKey};EndpointSuffix=core.windows.net",
                name: "catalog-storage-check",
                tags: new string[] { "catalogstorage" });
    }
    if (configuration.GetValue<bool>("AzureServiceBusEnabled"))
    {
        hcBuilder
            .AddAzureServiceBusTopic(
                configuration["EventBusConnection"],
                topicName: "eshop_event_bus",
                name: "catalog-servicebus-check",
                tags: new string[] { "servicebus" });
    }
    else
    {
        hcBuilder
            .AddRabbitMQ(
                $"amqp://{configuration["EventBusConnection"]}",
                name: "catalog-rabbitmqbus-check",
                tags: new string[] { "rabbitmqbus" });
    }

    return services;
}

Terakhir, tambahkan middleware HealthCheck untuk mendengarkan titik akhir "/hc":

// HealthCheck middleware
app.UseHealthChecks("/hc", new HealthCheckOptions()
{
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

Mengkueri layanan mikro Anda untuk melaporkan status kesehatannya

Ketika Anda telah mengonfigurasi pemeriksaan kesehatan seperti yang dijelaskan dalam artikel ini dan Anda memiliki layanan mikro yang berjalan di Docker, Anda dapat langsung memeriksa dari browser jika sehat. Anda harus menerbitkan port kontainer di host Docker, sehingga Anda dapat mengakses kontainer melalui IP host Docker eksternal atau melalui host.docker.internal, seperti yang ditunjukkan pada gambar 8-8.

Screenshot of the JSON response returned by a health check.

Gambar 8-8. Memeriksa status kesehatan layanan tunggal dari browser

Dalam pengujian itu, Anda dapat melihat bahwa Catalog.API layanan mikro (berjalan pada port 5101) sehat, mengembalikan status HTTP 200 dan informasi status di JSON. Layanan ini juga memeriksa kesehatan dependensi database SQL Server dan RabbitMQ, sehingga pemeriksaan kesehatan melaporkan dirinya sehat.

Menggunakan pengawas

Pengawas adalah layanan terpisah yang dapat mengawasi kesehatan dan beban di seluruh layanan, dan melaporkan kesehatan tentang layanan mikro dengan mengkueri dengan pustaka yang HealthChecks diperkenalkan sebelumnya. Ini dapat membantu mencegah kesalahan yang tidak akan terdeteksi berdasarkan tampilan satu layanan. Pengawas juga merupakan tempat yang baik untuk menghosting kode yang dapat melakukan tindakan remediasi untuk kondisi yang diketahui tanpa interaksi pengguna.

Sampel eShopOnContainers berisi halaman web yang menampilkan sampel laporan pemeriksaan kesehatan, seperti yang ditunjukkan pada Gambar 8-9. Ini adalah pengawas paling sederhana yang dapat Anda miliki karena hanya menunjukkan status layanan mikro dan aplikasi web di eShopOnContainers. Biasanya pengawas juga mengambil tindakan ketika mendeteksi status tidak sehat.

Untungnya, AspNetCore.Diagnostics.HealthChecks juga menyediakan paket AspNetCore.HealthChecks.UI NuGet yang dapat digunakan untuk menampilkan hasil pemeriksaan kesehatan dari URI yang dikonfigurasi.

Screenshot of the Health Checks UI eShopOnContainers health statuses.

Gambar 8-9. Sampel laporan pemeriksaan kesehatan di eShopOnContainers

Singkatnya, layanan pengawas ini meminta setiap titik akhir "/hc" layanan mikro. Layan ini akan menjalankan semua pemeriksaan kesehatan yang ditentukan di dalamnya dan mengembalikan status kesehatan keseluruhan tergantung pada semua pemeriksaan tersebut. HealthChecksUI mudah digunakan dengan beberapa entri konfigurasi dan dua baris kode yang perlu ditambahkan ke dalam Startup.cs dari layanan pengawas.

Contoh file konfigurasi untuk UI pemeriksaan kesehatan:

// Configuration
{
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "Ordering HTTP Check",
        "Uri": "http://host.docker.internal:5102/hc"
      },
      {
        "Name": "Ordering HTTP Background Check",
        "Uri": "http://host.docker.internal:5111/hc"
      },
      //...
    ]}
}

Program.cs file yang menambahkan HealthChecksUI:

// Program.cs from WebStatus(Watch Dog) service
//
// Registers required services for health checks
builder.Services.AddHealthChecksUI();
// build the app, register other middleware
app.UseHealthChecksUI(config => config.UIPath = "/hc-ui");

Pemeriksaan kesehatan saat menggunakan orkestrator

Untuk memantau ketersediaan layanan mikro Anda, orkestrator seperti Kubernetes dan Service Fabric secara berkala melakukan pemeriksaan kesehatan dengan mengirim permintaan untuk menguji layanan mikro. Ketika orkestrator menentukan bahwa layanan/kontainer tidak sehat, orkestrator menghentikan permintaan perutean ke instans tersebut. Ini juga biasanya membuat instans baru kontainer tersebut.

Misalnya, sebagian besar orkestrator dapat menggunakan pemeriksaan kesehatan untuk mengelola penyebaran tanpa waktu henti. Hanya ketika status layanan/kontainer berubah menjadi sehat, orkestrator akan mulai merutekan lalu lintas ke instans layanan/kontainer.

Pemantauan kesehatan sangat penting ketika orkestrator melakukan peningkatan aplikasi. Beberapa orkestrator (seperti Azure Service Fabric) memperbarui layanan secara bertahap—misalnya, mereka mungkin memperbarui seperlima permukaan kluster untuk setiap peningkatan aplikasi. Kumpulan node yang ditingkatkan pada saat yang sama disebut sebagai domain peningkatan. Setelah setiap domain peningkatan ditingkatkan dan tersedia untuk pengguna, domain peningkatan tersebut harus melewati pemeriksaan kesehatan sebelum penyebaran berpindah ke domain peningkatan berikutnya.

Aspek lain dari kesehatan layanan adalah melaporkan metrik dari layanan. Ini adalah kemampuan canggih dari model kesehatan beberapa pengarah orkestra, seperti Service Fabric. Metrik penting dalam Service Fabric karena digunakan untuk menyeimbangkan penggunaan sumber daya. Metrik juga dapat menjadi indikator kesehatan sistem. Misalnya, Anda mungkin memiliki aplikasi yang memiliki banyak layanan, dan setiap instans melaporkan permintaan per detik (RPS) metrik. Jika satu layanan menggunakan lebih banyak sumber daya dari layanan lain, Service Fabric memindahkan instans layanan di sekitar kluster, untuk mencoba mempertahankan pemanfaatan sumber daya yang merata.

Perhatikan bahwa Azure Service Fabric menyediakan model Pemantauan Kesehatannya sendiri, yang lebih canggih daripada pemeriksaan kesehatan sederhana.

Pemantauan tingkat lanjut: visualisasi, analisis, dan pemberitahuan

Bagian terakhir pemantauan adalah memvisualisasikan aliran peristiwa, melaporkan performa layanan, dan memberi tahu saat masalah terdeteksi. Anda dapat menggunakan solusi yang berbeda untuk aspek pemantauan ini.

Anda dapat menggunakan aplikasi kustom sederhana yang menampilkan status layanan Anda, seperti halaman kustom yang ditampilkan saat menjelaskan AspNetCore.Diagnostics.HealthChecks. Atau Anda dapat menggunakan alat yang lebih canggih seperti Azure Monitor untuk meningkatkan pemberitahuan berdasarkan aliran peristiwa.

Terakhir, jika Anda menyimpan semua aliran peristiwa, Anda dapat menggunakan Microsoft Power BI atau solusi lain seperti Kibana atau Splunk untuk memvisualisasikan data.

Sumber daya tambahan