Aracılığıyla paylaş


Sistem durumunu izleme

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.

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

Sistem durumu izleme, kapsayıcılarınızın ve mikro hizmetlerinizin durumu hakkında neredeyse gerçek zamanlı bilgilere izin verebilir. Sistem durumu izleme, mikro hizmetlerin birden çok yönü için kritik öneme sahiptir ve düzenleyiciler daha sonra açıklandığı gibi kısmi uygulama yükseltmelerini aşamalar halinde gerçekleştirdiğinde özellikle önemlidir.

Mikro hizmet tabanlı uygulamalar genellikle performans izleyicilerinin, zamanlayıcılarının ve düzenleyicilerinin çok sayıda hizmeti izlemesini sağlamak için sinyalleri veya sistem durumu denetimlerini kullanır. Hizmetler isteğe bağlı veya belirli bir zamanlamaya göre bir tür "Hayattayım" sinyali gönderemiyorsa, güncelleştirmeleri dağıttığınızda uygulamanız risklerle karşılaşabilir veya yalnızca çok geç hataları algılayabilir ve büyük kesintilerle sonuçlanabilecek basamaklı hataları durduramayabilir.

Tipik modelde hizmetler, durumlarıyla ilgili raporlar gönderir ve bu bilgiler uygulamanızın sistem durumunun genel bir görünümünü sağlamak için toplanır. Düzenleyici kullanıyorsanız, kümenin uygun şekilde çalışabilmesi için düzenleyicinizin kümesine sistem durumu bilgileri sağlayabilirsiniz. Uygulamanız için özelleştirilmiş yüksek kaliteli sistem durumu raporlamaya yatırım yaparsanız, çalışan uygulamanızla ilgili sorunları çok daha kolay algılayabilir ve düzeltebilirsiniz.

ASP.NET Core hizmetlerinde sistem durumu denetimleri uygulama

ASP.NET Core mikro hizmeti veya web uygulaması geliştirirken, ASP .NET Core 2.2'de (Microsoft.Extensions.Diagnostics.HealthChecks) yayımlanan yerleşik sistem durumu denetimleri özelliğini kullanabilirsiniz. Birçok ASP.NET Core özelliği gibi sistem durumu denetimleri de bir dizi hizmet ve ara yazılımla birlikte gelir.

Sistem durumu denetimi hizmetleri ve ara yazılım kullanımı kolaydır ve uygulamanız için gereken dış kaynakların (SQL Server veritabanı veya uzak API gibi) düzgün çalışıp çalışmadığını doğrulamanızı sağlayan özellikler sağlar. Bu özelliği kullandığınızda, daha sonra açıkladığımız gibi kaynağın iyi durumda olup olmadığının ne anlama geldiğini de seçebilirsiniz.

Bu özelliği etkili bir şekilde kullanmak için önce mikro hizmetlerinizdeki hizmetleri yapılandırmanız gerekir. İkincisi, sistem durumu raporlarını sorgulayan bir ön uç uygulamasına ihtiyacınız vardır. Bu ön uç uygulaması özel bir raporlama uygulaması veya sistem durumu durumlarına göre tepki verebilecek bir düzenleyici olabilir.

Arka uç ASP.NET mikro hizmetlerinizde HealthChecks özelliğini kullanma

Bu bölümde, Microsoft.Extensions.Diagnostics.HealthChecks paketini kullanırken Örnek ASP.NET Core 8.0 Web API uygulamasında HealthChecks özelliğini uygulamayı öğreneceksiniz. Bu özelliğin eShopOnContainers gibi büyük ölçekli bir mikro hizmette uygulanması sonraki bölümde açıklanmıştır.

Başlamak için, her mikro hizmet için sağlıklı bir durum oluşturan şeyi tanımlamanız gerekir. Örnek uygulamada, API'sine HTTP üzerinden erişilebiliyorsa ve ilgili SQL Server veritabanı da kullanılabiliyorsa mikro hizmetin iyi durumda olduğunu tanımlarız.

.NET 8'de, yerleşik API'lerle hizmetleri yapılandırabilir, mikro hizmet ve bağımlı SQL Server veritabanı için sistem durumu denetimi ekleyebilirsiniz:

// 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" });

Önceki kodda services.AddHealthChecks() yöntemi, "Sağlıklı" ile 200 durum kodu döndüren temel bir HTTP denetimi yapılandırıyor. Ayrıca uzantı yöntemi, AddCheck() ilgili SQL Veritabanı sistem durumunu denetleen bir özel SqlConnectionHealthCheck yapılandırma gerçekleştirir.

yöntemi, AddCheck() belirtilen ada ve türüne IHealthChecksahip yeni bir sistem durumu denetimi ekler. AddCheck yöntemini kullanarak birden çok Durum Denetimi ekleyebilirsiniz, böylece mikro hizmet tüm denetimleri iyi duruma gelene kadar "iyi durumda" durumu sağlamaz.

SqlConnectionHealthCheck, bir bağlantı dizesi oluşturucu parametresi olarak alan ve SQL veritabanı bağlantısının başarılı olup olmadığını denetlemek için basit bir sorgu yürüten bir özel sınıftırIHealthCheck. Sorgu başarıyla yürütülürse ve başarısız olduğunda gerçek özel durumla birlikte bir FailureStatus döndürürHealthCheckResult.Healthy().

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

Önceki kodda veritabanının Select 1 Sistem Durumunu denetlemek için kullanılan sorgu olduğunu unutmayın. Mikro hizmetlerinizin kullanılabilirliğini izlemek için Kubernetes gibi düzenleyiciler mikro hizmetleri test etmek için istek göndererek düzenli aralıklarla sistem durumu denetimleri gerçekleştirir. Bu işlemlerin hızlı olması ve kaynakların daha yüksek kullanımına neden olması için veritabanı sorgularınızı verimli tutmanız önemlidir.

Son olarak, URL yoluna /hcyanıt veren bir ara yazılım ekleyin:

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

app.MapHealthChecks("/hc");

Uç nokta <yourmicroservice>/hc çağrıldığında, Başlangıç sınıfındaki yönteminde AddHealthChecks() yapılandırılan tüm sistem durumu denetimlerini çalıştırır ve sonucu gösterir.

eShopOnContainers'da HealthChecks uygulaması

eShopOnContainers'daki mikro hizmetler, görevini gerçekleştirmek için birden çok hizmete güvenir. Örneğin, Catalog.API eShopOnContainers mikro hizmeti Azure Blob Depolama, SQL Server ve RabbitMQ gibi birçok hizmete bağlıdır. Bu nedenle, yöntemi kullanılarak AddCheck() eklenen birkaç sistem durumu denetimi vardır. Her bağımlı hizmet için, ilgili sistem durumunu tanımlayan özel IHealthCheck bir uygulamanın eklenmesi gerekir.

AspNetCore.Diagnostics.HealthChecks açık kaynak projesi, .NET 8 üzerinde oluşturulan bu kurumsal hizmetlerin her biri için özel sistem durumu denetimi uygulamaları sağlayarak bu sorunu çözer. Her sistem durumu denetimi, projeye kolayca eklenebilen tek bir NuGet paketi olarak kullanılabilir. eShopOnContainers bunları tüm mikro hizmetlerinde yoğun olarak kullanır.

Örneğin, mikro hizmette Catalog.API aşağıdaki NuGet paketleri eklendi:

Screenshot of the AspNetCore.Diagnostics.HealthChecks NuGet packages.

Şekil 8-7. AspNetCore.Diagnostics.HealthChecks kullanılarak Catalog.API'de uygulanan Özel Sistem Durumu Denetimleri

Aşağıdaki kodda, her bağımlı hizmet için sistem durumu denetimi uygulamaları eklenir ve ara yazılım yapılandırılır:

// 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;
}

Son olarak, "/hc" uç noktasını dinlemek için HealthCheck ara yazılımını ekleyin:

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

Mikro hizmetlerinizi sorgular ve sistem durumlarını bildirin

Bu makalede açıklandığı gibi sistem durumu denetimlerini yapılandırdığınızda ve mikro hizmeti Docker'da çalıştırdığınızda, iyi durumda olup olmadığını doğrudan bir tarayıcıdan kontrol edebilirsiniz. Kapsayıcıya, şekil 8-8'de gösterildiği gibi dış Docker ana bilgisayar IP'sini veya aracılığıyla host.docker.internalerişebilmek için kapsayıcı bağlantı noktasını Docker konağından yayımlamanız gerekir.

Screenshot of the JSON response returned by a health check.

Şekil 8-8. Tarayıcıdan tek bir hizmetin sistem durumunu denetleme

Bu testte mikro hizmetin (bağlantı noktası 5101'de çalışan) iyi durumda olduğunu ve JSON'da HTTP durum 200 ve durum bilgilerini döndürdüğünü görebilirsiniz Catalog.API . Hizmet ayrıca SQL Server veritabanı bağımlılığının ve RabbitMQ'nun sistem durumunu denetlediği için sistem durumu denetimi kendisini iyi durumda olarak bildirdi.

Watchdogs kullanma

Watchdog, sistem durumunu izleyip hizmetler arasında yük oluşturabilen ve daha önce tanıtılan kitaplıkla HealthChecks sorgu yaparak mikro hizmetlerle ilgili sistem durumunu raporlayan ayrı bir hizmettir. Bu, tek bir hizmetin görünümüne göre algılanacak hataları önlemeye yardımcı olabilir. Watchdogs, kullanıcı etkileşimi olmadan bilinen koşullar için düzeltme eylemleri gerçekleştirebilen kodu barındırmak için de iyi bir yerdir.

eShopOnContainers örneği, Şekil 8-9'da gösterildiği gibi örnek sistem durumu denetimi raporlarını görüntüleyen bir web sayfası içerir. Bu, yalnızca eShopOnContainers'daki mikro hizmetlerin ve web uygulamalarının durumunu gösterdiğinden sahip olabileceğiniz en basit watchdog'tur. Genellikle bir izleme, iyi durumda olmayan durumlar algıladığında da eylemler gerçekleştirir.

Neyse ki AspNetCore.Diagnostics.HealthChecks, yapılandırılan URI'lerden sistem durumu denetimi sonuçlarını görüntülemek için kullanılabilecek AspNetCore.HealthChecks.UI NuGet paketi de sağlar.

Screenshot of the Health Checks UI eShopOnContainers health statuses.

Şekil 8-9. eShopOnContainers'da örnek sistem durumu denetimi raporu

Özetle, bu izleme hizmeti her mikro hizmetin "/hc" uç noktasını sorgular. Bu işlem, içinde tanımlanan tüm sistem durumu denetimlerini yürütür ve tüm bu denetimlere bağlı olarak genel bir sistem durumu döndürür. HealthChecksUI, watchdog hizmetinin Startup.cs eklenmesi gereken birkaç yapılandırma girdisi ve iki kod satırıyla kolayca kullanılabilir.

Sistem durumu denetimi kullanıcı arabirimi için örnek yapılandırma dosyası:

// 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"
      },
      //...
    ]}
}

HealthChecksUI ekleyen Program.cs dosyası:

// 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");

Düzenleyiciler kullanılırken sistem durumu denetimleri

Mikro hizmetlerinizin kullanılabilirliğini izlemek için Kubernetes ve Service Fabric gibi düzenleyiciler mikro hizmetleri test etmek için istek göndererek düzenli aralıklarla sistem durumu denetimleri gerçekleştirir. Bir düzenleyici bir hizmetin/kapsayıcının iyi durumda olmadığını belirlediğinde, isteklerin söz konusu örneğe yönlendirilmesi durdurulur. Ayrıca genellikle bu kapsayıcının yeni bir örneğini oluşturur.

Örneğin çoğu düzenleyici, sıfır kapalı kalma süresi dağıtımlarını yönetmek için sistem durumu denetimlerini kullanabilir. Yalnızca bir hizmetin/kapsayıcının durumu iyi durumda olduğunda düzenleyici trafiği hizmete/kapsayıcı örneklerine yönlendirmeye başlar.

Bir düzenleyici bir uygulama yükseltmesi gerçekleştirdiğinde sistem durumu izleme özellikle önemlidir. Bazı düzenleyiciler (Azure Service Fabric gibi) hizmetleri aşamalar halinde güncelleştirir; örneğin, her uygulama yükseltmesi için küme yüzeyinin beşte birini güncelleştirebilirler. Aynı anda yükseltilen düğüm kümesi, yükseltme etki alanı olarak adlandırılır. Her yükseltme etki alanı yükseltildikten ve kullanıcılar tarafından kullanılabilir duruma geldikten sonra, dağıtım bir sonraki yükseltme etki alanına geçmeden önce bu yükseltme etki alanının sistem durumu denetimlerini geçirmesi gerekir.

Hizmet durumunun bir diğer yönü de hizmetten ölçümleri raporlamaktır. Bu, Service Fabric gibi bazı düzenleyicilerin sistem durumu modelinin gelişmiş bir özelliğidir. Ölçümler, kaynak kullanımını dengelemek için kullanıldığından düzenleyici kullanılırken önemlidir. Ölçümler, sistem durumunun bir göstergesi de olabilir. Örneğin, çok sayıda mikro hizmeti olan bir uygulamanız olabilir ve her örnek saniye başına istek (RPS) ölçümü bildirir. Bir hizmet başka bir hizmetten daha fazla kaynak (bellek, işlemci vb.) kullanıyorsa, düzenleyici kaynak kullanımını bile sürdürmeye çalışmak için hizmet örneklerini küme içinde taşıyabilir.

Azure Service Fabric'in basit sistem durumu denetimlerinden daha gelişmiş olan kendi Sistem Durumu İzleyicisi modelini sağladığını unutmayın.

Gelişmiş izleme: görselleştirme, analiz ve uyarılar

İzlemenin son bölümü olay akışını görselleştirmek, hizmet performansını raporlamak ve bir sorun algılandığında uyarmaktır. İzlemenin bu yönü için farklı çözümler kullanabilirsiniz.

AspNetCore.Diagnostics.HealthChecks açıklanırken gösterilen özel sayfa gibi hizmetlerinizin durumunu gösteren basit özel uygulamalar kullanabilirsiniz. Ya da azure izleyicisi gibi daha gelişmiş araçlar kullanarak olay akışına göre uyarı gönderebilirsiniz.

Son olarak, tüm olay akışlarını depoluyorsanız verileri görselleştirmek için Microsoft Power BI'ı veya Kibana veya Splunk gibi diğer çözümleri kullanabilirsiniz.

Ek kaynaklar