ASP.NET Core'da sistem durumu denetimleri

Tarafından Glenn Condron ve Juergen Gutsch

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Warning

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için Sistem Durumu Denetimleri Ara Yazılımı ve kitaplıklar sunar.

Uygulama tarafından sağlık kontrolleri HTTP uç noktaları olarak sağlanır. Sistem durumu denetimi uç noktaları çeşitli gerçek zamanlı izleme senaryoları için yapılandırılabilir:

  • Sistem durumu yoklamaları, bir uygulamanın durumunu denetlemek için kapsayıcı düzenleme sistemleri ve yük dengeleyiciler tarafından kullanılabilir. Örneğin, bir kapsayıcı düzenleyicisi, başarısız olan bir sağlık kontrolüne yanıt olarak aşamalı dağıtımı durdurabilir veya bir kapsayıcıyı yeniden başlatabilir. Yük dengeleyici, trafiği hatalı örnekten iyi durumdaki bir örneğe yönlendirerek iyi durumda olmayan bir uygulamaya tepki verebilir.
  • İyi durumda bellek, disk ve diğer fiziksel sunucu kaynaklarının kullanımı izlenebilir.
  • Sistem durumu denetimleri, kullanılabilirliği ve normal çalışma durumunu onaylamak için bir uygulamanın veritabanları ve dış hizmet uç noktaları gibi bağımlılıklarını test edebilir.

Sağlık kontrolleri, genellikle bir uygulamanın durumunu kontrol etmek için dış bir izleme hizmeti veya kapsayıcı düzenleyici ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce hangi izleme sisteminin kullanılacağına karar verin. İzleme sistemi, hangi tür sağlık kontrollerinin oluşturulacağını ve endpoint'lerin nasıl yapılandırılacağını belirler.

Temel sağlık denetimi

Birçok uygulama için, uygulamanın istekleri işlemek için kullanılabilirliğini (çalışırlık durumu) bildiren temel bir sağlık araştırması yapılandırması, uygulamanın durumunu keşfetmek için yeterlidir.

Temel yapılandırma, sağlık denetimi hizmetlerini kaydeder ve bir URL uç noktasında sağlık yanıtı ile yanıt vermek için Sağlık Denetimleri Ara yazılımını çağırır. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için özgül bir sağlık kontrolü kayıtlı değildir. Uygulama, sistem durumu uç noktası URL'sinde yanıt verebiliyorsa iyi durumda kabul edilir. Varsayılan yanıt yazarı istemciye düz metin yanıtı olarak yazar HealthStatus . HealthStatus, HealthStatus.Healthy, HealthStatus.Degraded veya HealthStatus.Unhealthy.

Sağlık denetimi hizmetlerini AddHealthChecks içinde Program.cs kaydedin. MapHealthChecks çağrısı yaparak bir sağlık kontrolü uç noktası oluşturun.

Aşağıdaki örnek /healthz konumunda bir sağlık denetimi uç noktası oluşturur:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHealthChecks();

var app = builder.Build();

app.MapHealthChecks("/healthz");

app.Run();

DockerHEALTHCHECK

Docker , temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu denetlemek için kullanabileceğiniz yerleşik HEALTHCHECK bir yönerge içerir:

HEALTHCHECK CMD curl --fail http://localhost:5000/healthz || exit 1

Yukarıdaki örnek, curl ile /healthz konumundaki sistem durumu denetimi uç noktasına HTTP isteğinde bulunmak için kullanır. curl .NET Linux kapsayıcı görüntülerine dahil değildir, ancak gerekli paketi Dockerfile dosyasına yükleyerek ekleyebilirsiniz. Alpine Linux tabanlı görüntüleri kullanan kapsayıcılar, wget öğesi yerine curl öğesini kullanabilir.

Sağlık denetimleri oluşturma

Arayüzü uygulayarak IHealthCheck sağlık kontrolleri oluşturun. CheckHealthAsync yöntemi, sağlığı HealthCheckResult, Healthy veya Degraded olarak gösteren bir Unhealthy döndürür. Sonuç, yapılandırılabilir durum koduyla düz metin yanıtı olarak yazılır. Sistem durumu denetimi seçenekleri bölümüne bakın. HealthCheckResult isteğe bağlı anahtar-değer çiftleri de döndürebilir.

Aşağıdaki örnekte sağlık kontrolünün yerleşimi gösterilmektedir.

public class SampleHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        var isHealthy = true;

        // ...

        if (isHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            new HealthCheckResult(
                context.Registration.FailureStatus, "An unhealthy result."));
    }
}

Sağlık kontrolünün mantığı CheckHealthAsync yöntemine yerleştirilir. Yukarıdaki örnek, isHealthytrueolarak bir kukla değişkeni ayarlar. Eğer isHealthy değeri false olarak ayarlanırsa, HealthCheckRegistration.FailureStatus durumu döndürülür.

Eğer CheckHealthAsync denetim sırasında bir özel durum fırlatırsa, HealthReportEntry değerine ayarlanmış HealthReportEntry.Status ile yeni bir FailureStatus döndürülür. Bu durum AddCheck tarafından tanımlanır (sistem durumu denetim hizmetlerini kaydetme bölümüne bakın) ve denetim hatasına neden olan iç özel durumu içerir. Description, özel durumun iletisi olarak ayarlanır.

Sağlık denetimi hizmetlerini kaydetme

Sağlık kontrolü hizmetini kaydetmek için AddCheck numarasını Program.cs arayın.

builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheck>("Sample");

AddCheck Aşağıdaki örnekte gösterilen aşırı yükleme, sistem durumu denetimi hata bildirdiğinde hata durumunu (HealthStatus) bildirecek şekilde ayarlar. Hata durumu (varsayılan) null olarak ayarlanırsa HealthStatus.Unhealthy raporlanır. Bu aşırı yükleme, kitaplık yazarları için yararlı bir senaryodur; sağlık denetimi uygulaması ayarı kabul ederse, sağlık denetimi hatası durumunda kitaplık tarafından belirtilen hata durumunun uygulama tarafından zorunlu kılındığı bir durumdur.

Etiketler , sistem durumu denetimlerini filtrelemek için kullanılabilir. Etiketler, Sistem durumu denetimlerini filtrele bölümünde açıklanmıştır.

builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheck>(
        "Sample",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "sample" });

AddCheck bir lambda işlevini de yürütebilir. Aşağıdaki örnekte, sağlık kontrolü her zaman sağlıklı bir sonuç döndürür.

builder.Services.AddHealthChecks()
    .AddCheck("Sample", () => HealthCheckResult.Healthy("A healthy result."));

Argümanları bir sağlık kontrolü uygulamasına geçirmek için AddTypeActivatedCheck çağırın. Aşağıdaki örnekte, türe dayalı sağlık kontrolü, oluşturucusunda bir tamsayı ve bir dize kabul eder.

public class SampleHealthCheckWithArgs : IHealthCheck
{
    private readonly int _arg1;
    private readonly string _arg2;

    public SampleHealthCheckWithArgs(int arg1, string arg2)
        => (_arg1, _arg2) = (arg1, arg2);

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        // ...

        return Task.FromResult(HealthCheckResult.Healthy("A healthy result."));
    }
}

Önceki sağlık kontrolünü kaydetmek için, bağımsız değişken olarak geçen tamsayı ve dize ile AddTypeActivatedCheck çağrısı yapın.

builder.Services.AddHealthChecks()
    .AddTypeActivatedCheck<SampleHealthCheckWithArgs>(
        "Sample",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "sample" },
        args: new object[] { 1, "Arg" });

Sağlık Kontrolleri Yönlendirmesini Kullanma

Program.cs içinde, uç nokta URL'si veya göreli yolu ile uç nokta oluşturucusunda MapHealthChecks çağırın.

app.MapHealthChecks("/healthz");

Konağı gerektir

Sistem durumu denetimi uç noktası için bir veya daha fazla izin verilen konak belirtmek için çağrısı RequireHost yapın. Konaklar için punycode yerine Unicode kullanın ve port ekleyebilirsiniz. Bir koleksiyon sağlamazsanız, herhangi bir sunucu kabul edilir.

app.MapHealthChecks("/healthz")
    .RequireHost("www.contoso.com:5001");

Sistem durumu denetimi uç noktasının yanıt vermesini yalnızca belirli bir bağlantı noktasında sınırlamak için RequireHost çağrısında bir bağlantı noktası belirtin. Genellikle, izleme hizmetleri için bir bağlantı noktasını kullanıma açmak için kapsayıcı ortamında bu yaklaşımı kullanın:

app.MapHealthChecks("/healthz")
    .RequireHost("*:5001");

Warning

Konak üst bilgisine dayanan API'ler, örneğin ve HttpRequest.Host, istemciler tarafından olası kimlik sahtekarlığına maruz kalabilir.

Host ve bağlantı noktası kimlik sahtekarlığını önlemek için aşağıdaki yaklaşımlardan birini kullanın:

Yetkisiz istemcilerin bağlantı noktası sahtekarlığına uğramasını önlemek için öğesini çağırın RequireAuthorization:

app.MapHealthChecks("/healthz")
    .RequireHost("*:5001")
    .RequireAuthorization();

Daha fazla bilgi için RequireHost ile yollarda konak eşleştirme bölümüne bakın.

Yetkilendirme gerektir

RequireAuthorization öğesini durum denetimi istek uç noktasında Yetkilendirme Ara Yazılımını çalıştırmak için çağırın. Aşırı RequireAuthorization yükleme bir veya daha fazla yetkilendirme ilkesi kabul eder. İlke sağlanmazsa, varsayılan yetkilendirme ilkesi kullanılır:

app.MapHealthChecks("/healthz")
    .RequireAuthorization();

Kaynaklar Arası İstekleri (CORS) etkinleştirme

Sistem durumu denetimlerini tarayıcıda el ile çalıştırmak yaygın bir senaryo olmasa da, CORS Ara Yazılımı sistem durumu denetimleri uç noktalarına çağrılarak RequireCors etkinleştirilebilir. Aşırı RequireCors yükleme bir CORS ilke oluşturucusu temsilcisini (CorsPolicyBuilder) veya bir ilke adını kabul eder. Daha fazla bilgi için ASP.NET Core'da Kaynaklar Arası İstekler (CORS) Etkinleştirme başlıklı sayfaya bakın.

Sağlık kontrolü seçenekleri

HealthCheckOptions sistem durumu denetimi davranışını özelleştirme fırsatı sağlar:

Sağlık kontrollerini filtrele

Varsayılan olarak, Sistem Durumu Denetimleri Ara Yazılımı tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için seçeneğine Predicate boole döndüren bir işlev sağlayın.

Aşağıdaki örnek, yalnızca sample etiketiyle işaretlenmiş sağlık kontrollerinin çalıştırılmasını sağlamak için bir filtre uygular.

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    Predicate = healthCheck => healthCheck.Tags.Contains("sample")
});

HTTP durum kodunu özelleştirme

HTTP durum kodlarına sağlık durumunun eşlemeyi özelleştirmek için ResultStatusCodes kullanın. Aşağıdaki StatusCodes atamalar ara yazılım tarafından kullanılan varsayılan değerlerdir. Durum kodu değerlerini gereksinimlerinizi karşılayacak şekilde değiştirin:

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    ResultStatusCodes =
    {
        [HealthStatus.Healthy] = StatusCodes.Status200OK,
        [HealthStatus.Degraded] = StatusCodes.Status200OK,
        [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
    }
});

Önbellek üst bilgilerini gizleme

AllowCachingResponses Durum Denetimleri Ara Yazılımının yanıt önbelleğe almayı önlemek için yoklama yanıtına HTTP üst bilgileri ekleyip eklemediğini denetler. Değer false (varsayılan) ise, ara yazılım, Cache-Control, Expires ve Pragma üst bilgilerini ayarlar veya geçersiz kılarak yanıt önbelleğe almayı önler. değeri ise trueara yazılım yanıtın önbellek üst bilgilerini değiştirmez:

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    AllowCachingResponses = true
});

Çıktıyı özelleştirme

Sistem durumu denetimleri raporunun çıktısını özelleştirmek için, yanıtı yazacak bir temsilci olarak HealthCheckOptions.ResponseWriter özelliğini ayarlayın.

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    ResponseWriter = WriteResponse
});

Varsayılan temsilci, dize değeriyle en düşük düz metin yanıtını HealthReport.Statusyazar. Aşağıdaki özel temsilci, System.Text.Json kullanarak özel bir JSON yanıtı çıktısı verir:

private static Task WriteResponse(HttpContext context, HealthReport healthReport)
{
    context.Response.ContentType = "application/json; charset=utf-8";

    var options = new JsonWriterOptions { Indented = true };

    using var memoryStream = new MemoryStream();
    using (var jsonWriter = new Utf8JsonWriter(memoryStream, options))
    {
        jsonWriter.WriteStartObject();
        jsonWriter.WriteString("status", healthReport.Status.ToString());
        jsonWriter.WriteStartObject("results");

        foreach (var healthReportEntry in healthReport.Entries)
        {
            jsonWriter.WriteStartObject(healthReportEntry.Key);
            jsonWriter.WriteString("status",
                healthReportEntry.Value.Status.ToString());
            jsonWriter.WriteString("description",
                healthReportEntry.Value.Description);
            jsonWriter.WriteStartObject("data");

            foreach (var item in healthReportEntry.Value.Data)
            {
                jsonWriter.WritePropertyName(item.Key);

                JsonSerializer.Serialize(jsonWriter, item.Value,
                    item.Value?.GetType() ?? typeof(object));
            }

            jsonWriter.WriteEndObject();
            jsonWriter.WriteEndObject();
        }

        jsonWriter.WriteEndObject();
        jsonWriter.WriteEndObject();
    }

    return context.Response.WriteAsync(
        Encoding.UTF8.GetString(memoryStream.ToArray()));
}

Sistem durumu denetimleri API'si, karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz çünkü biçim, seçtiğiniz izleme sistemine özgüdür. Yukarıdaki örneklerde verilen yanıtı gerektiği gibi özelleştirin. JSON serileştirme hakkında daha fazla bilgi için, System.Text.Json konusuna bakın.

Veritabanı yoklaması

Sistem durumu denetimi, veritabanının normal yanıt verdiğini belirtmek için boole testi olarak çalıştırılacak bir veritabanı sorgusu belirtebilir.

AspNetCore.Diagnostics.HealthChecks, ASP.NET Core uygulamaları için bir sistem durumu denetimi kitaplığı, SQL Server veritabanında çalışan bir sistem durumu denetimi içerir. AspNetCore.Diagnostics.HealthChecks veritabanı bağlantısının iyi durumda olduğunu onaylamak için veritabanına karşı bir SELECT 1 sorgu yürütür.

Warning

Sorgu kullanarak veritabanı bağlantısını denetlerken, hızlı bir şekilde döndüren bir sorgu seçin. Sorgu yaklaşımı veritabanını aşırı yükleme ve performansını düşürme riskini çalıştırır. Çoğu durumda test sorgusu çalıştırmak gerekli değildir. Yalnızca veritabanıyla başarılı bir bağlantı oluşturmak yeterlidir. Sorgu çalıştırmayı gerekli bulursanız, gibi SELECT 1basit bir SELECT sorgusu seçin.

Bu SQL Server sistem durumu denetimini kullanmak için NuGet paketine AspNetCore.HealthChecks.SqlServer bir paket başvurusu ekleyin. Aşağıdaki örnek SQL Server sistem durumu denetimini kaydeder:

var conStr = builder.Configuration.GetConnectionString("DefaultConnection");
if (string.IsNullOrEmpty(conStr))
{
    throw new InvalidOperationException(
                       "Could not find a connection string named 'DefaultConnection'.");
}
builder.Services.AddHealthChecks()
    .AddSqlServer(conStr);

Note

Microsoft bakımını yapmaz veya desteklemez AspNetCore.Diagnostics.HealthChecks.

Entity Framework Core DbContext araştırması

Denetim, uygulamanın DbContextEF Core için yapılandırılan veritabanıyla iletişim kurabildiğini DbContext onaylar. Denetimi destekleyen DbContext uygulamalar:

için bir sağlık kontrolü kaydeder. DbContext yönteme TContext olarak sağlanır. Hata durumunu, etiketleri ve özel test sorgusunu yapılandırmak için bir overload işlevi kullanılabilir.

Varsayılan olarak:

  • DbContextHealthCheck, EF Core'nin CanConnectAsync yöntemini çağırır. Yöntem aşırı yüklemelerini kullanarak AddDbContextCheck sistem durumu denetlenirken çalıştırılacak işlemi özelleştirebilirsiniz.
  • Sağlık durumu kontrolünün adı, TContext türünün adıdır.

Aşağıdaki örnek bir DbContext ve ilişkili bir DbContextHealthCheck kaydeder:

builder.Services.AddDbContext<SampleDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddHealthChecks()
    .AddDbContextCheck<SampleDbContext>();

Ayrı hazırlık ve canlılık yoklamaları

Bazı barındırma senaryolarında iki uygulama durumunu ayırt etmek için bir çift sistem durumu denetimi kullanın:

  • Hazır olma, uygulamanın normal çalışıp çalışmadığını ancak istekleri almaya hazır olmadığını gösterir.
  • Çalışırlık durumu, bir uygulamanın kapatılıp kapatılmadığını ve yeniden başlatılması gerekip gerekmediğini belirtir.

Aşağıdaki örneği göz önünde bulundurun: Bir uygulamanın istekleri işlemeye hazır olması için büyük bir yapılandırma dosyasını indirmesi gerekir. İlk indirme başarısız olursa uygulamayı yeniden başlatmak istemezsiniz çünkü uygulama dosyayı birkaç kez indirmeyi yeniden deneyebilir. Sürecin canlılığını tanımlamak için bir canlılık doğrulayıcısı kullanın, başka hiçbir denetim çalıştırılmaz. Yapılandırma dosyası indirme işlemi başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyorsunuz. İndirme başarılı olana ve uygulama istekleri almaya hazır olana kadar "hazır değil" durumunu belirtmek için hazırlık sondası kullanın.

Aşağıdaki arka plan görevi, yaklaşık 15 saniye süren bir başlangıç işleminin benzetimini yapar. İşlem tamamlandıktan sonra StartupHealthCheck.StartupCompleted görev özelliğini true olarak ayarlar:

public class StartupBackgroundService : BackgroundService
{
    private readonly StartupHealthCheck _healthCheck;

    public StartupBackgroundService(StartupHealthCheck healthCheck)
        => _healthCheck = healthCheck;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // Simulate the effect of a long-running task.
        await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken);

        _healthCheck.StartupCompleted = true;
    }
}

StartupHealthCheck uzun süre çalışan başlangıç görevinin tamamlandığını bildirir ve arka plan hizmetinin ayarladığı StartupCompleted özelliğini kullanıma sunar:

public class StartupHealthCheck : IHealthCheck
{
    private volatile bool _isReady;

    public bool StartupCompleted
    {
        get => _isReady;
        set => _isReady = value;
    }

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        if (StartupCompleted)
        {
            return Task.FromResult(HealthCheckResult.Healthy("The startup task has completed."));
        }

        return Task.FromResult(HealthCheckResult.Unhealthy("That startup task is still running."));
    }
}

Barındırılan hizmetle AddCheck birlikte sistem durumu denetimini de Program.cs kaydedin. Barındırılan hizmet sistem durumu denetiminde özelliğini ayarladığı için, sistem durumu denetimini hizmet kapsayıcısında tekil olarak da kaydedin:

builder.Services.AddHostedService<StartupBackgroundService>();
builder.Services.AddSingleton<StartupHealthCheck>();

builder.Services.AddHealthChecks()
    .AddCheck<StartupHealthCheck>(
        "Startup",
        tags: new[] { "ready" });

İki farklı sağlık kontrolü uç noktası oluşturmak için, çağrısını iki kez yapın.

app.MapHealthChecks("/healthz/ready", new HealthCheckOptions
{
    Predicate = healthCheck => healthCheck.Tags.Contains("ready")
});

app.MapHealthChecks("/healthz/live", new HealthCheckOptions
{
    Predicate = _ => false
});

Yukarıdaki örnek aşağıdaki sistem durumu denetimi uç noktalarını oluşturur:

  • /healthz/ready hazır olma denetimi için. Hazır olma denetimi, ready ile etiketlenen sistem durumu kontrollerini filtreler.
  • /healthz/live canlılık kontrolü için. Canlılık denetimi, tüm sistem durumu denetimlerini false'u HealthCheckOptions.Predicate delegesinde döndürerek filtreler. Sistem durumu denetimlerini filtreleme hakkında daha fazla bilgi için bu makaledeki Sistem durumu denetimlerini filtreleme bölümüne bakın.

Başlangıç görevi tamamlanmadan önce uç /healthz/ready nokta bir Unhealthy durum bildirir. Başlangıç görevi tamamlandıktan sonra bu uç nokta bir Healthy durum bildirir. Uç /healthz/live tüm kontrolleri devre dışı bırakır ve tüm istekler için bir Healthy durumu raporlar.

Kubernetes örneği

Ayrı hazır olma ve canlılık denetimleri kullanmak Kubernetes gibi bir ortamda kullanışlıdır. Kubernetes'te bir uygulamanın, temel alınan veritabanı kullanılabilirliği testi gibi istekleri kabul etmeden önce zaman alan başlangıç çalışmalarını çalıştırması gerekebilir. Düzenleyici, ayrı denetimler kullanarak uygulamanın çalışıp çalışmadığını ancak henüz hazır olmadığını veya uygulamanın başlatılıp başlatılmadığını anlayabilir. Kubernetes'teki hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerindeki Canlılık ve Hazırlık Yoklamalarını Yapılandırma bölümüne bakın.

Aşağıdaki örnekte Kubernetes hazır olma yoklaması yapılandırması gösterilmektedir:

spec:
  template:
  spec:
    readinessProbe:
      # an http probe
      httpGet:
        path: /healthz/ready
        port: 80
      # length of time to wait for a pod to initialize
      # after pod startup, before applying health checking
      initialDelaySeconds: 30
      timeoutSeconds: 1
    ports:
      - containerPort: 80

Sağlık denetimi kitaplığı dağıtma

Bir sağlık kontrolünü (health check) kitaplık olarak dağıtmak için:

  1. IHealthCheck arabirimini bağımsız bir sınıf olarak uygulayan bir sağlık denetimi yazın. sınıfı, yapılandırma verilerine erişmek için bağımlılık ekleme (DI), tür etkinleştirme ve adlandırılmış seçenekleri kullanabilir.

  2. Tüketici uygulamanın Program.cs yönteminde çağıracağı parametrelerle bir uzatma yöntemi yazın. Aşağıdaki örnek sağlık kontrolünü göz önünde bulundurun; bu kontrol, arg1 ve arg2 öğelerini oluşturucu parametreleri olarak kabul etmektedir.

    public SampleHealthCheckWithArgs(int arg1, string arg2)
        => (_arg1, _arg2) = (arg1, arg2);
    

    Yukarıdaki imza, sağlık kontrolünün yoklama mantığını işlemek için özel verilere ihtiyaç duyduğunu gösterir. Veriler, sağlık durumu denetiminin bir uzantı yöntemiyle kaydedildiği zaman sağlık durumu denetimi örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte, çağıran şunları belirtir:

    • arg1: Sağlık durumu denetimi için bir tamsayı veri noktası.
    • arg2: Sistem durumu denetimi için bir dize bağımsız değişkeni.
    • name: İsteğe bağlı bir sağlık kontrolü adı. ise null, varsayılan bir değer kullanılır.
    • failureStatus: Hata durumu için bildirilen isteğe bağlı bir HealthStatus. null ise HealthStatus.Unhealthykullanılır.
    • tags: İsteğe bağlı IEnumerable<string> bir etiket koleksiyonu.
    public static class SampleHealthCheckBuilderExtensions
    {
        private const string DefaultName = "Sample";
    
        public static IHealthChecksBuilder AddSampleHealthCheck(
            this IHealthChecksBuilder healthChecksBuilder,
            int arg1,
            string arg2,
            string? name = null,
            HealthStatus? failureStatus = null,
            IEnumerable<string>? tags = default)
        {
            return healthChecksBuilder.Add(
                new HealthCheckRegistration(
                    name ?? DefaultName,
                    _ => new SampleHealthCheckWithArgs(arg1, arg2),
                    failureStatus,
                    tags));
        }
    }
    

Sağlık Kontrolü Yayınlayıcısı

Hizmet kapsayıcısına bir IHealthCheckPublisher eklendiğinde, sistem durumu denetimi sistemi düzenli aralıklarla sistem durumu denetimlerinizi yürütür ve sonuçla birlikte PublishAsync çağrısı yapar. Bu işlem, her işlemin sistem durumunu belirlemek için izleme sistemini düzenli aralıklarla çağırmasını bekleyen, anında iletme tabanlı sistem durumu izleme sistemi senaryosunda kullanışlıdır.

HealthCheckPublisherOptions aşağıdakileri ayarlamanıza olanak verir:

  • Delay: Uygulama başlatıldıktan sonra IHealthCheckPublisher örneklerini yürütmeden önceki başlangıç gecikmesi. Gecikme başlangıçta bir kez gerçekleşir ve sonraki yinelemeler için geçerli değildir. Varsayılan değer beş saniyedir.
  • Period: IHealthCheckPublisher yürütme süresi. Varsayılan değer 30 saniyedir.
  • Predicate: Predicatenull (varsayılan) ise, sistem durumu denetimi yayımcı hizmeti tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için denetim kümesini filtreleyen bir işlev sağlayın. Öngörü her periyot değerlendirilir.
  • Timeout: Tüm IHealthCheckPublisher örnekleri için sağlık kontrollerini yürütme zaman aşımı. Zaman aşımı olmadan yürütmek için `InfiniteTimeSpan` kullanın. Varsayılan değer 30 saniyedir.

Aşağıdaki örnek, bir sağlık yayımcısının düzenini göstermektedir:

public class SampleHealthCheckPublisher : IHealthCheckPublisher
{
    public Task PublishAsync(HealthReport report, CancellationToken cancellationToken)
    {
        if (report.Status == HealthStatus.Healthy)
        {
            // ...
        }
        else
        {
            // ...
        }

        return Task.CompletedTask;
    }
}

HealthCheckPublisherOptions sınıfı, sağlık denetimi yayımcısının davranışını yapılandırmak için özellikler sağlar.

Aşağıdaki örnek, bir sağlık kontrolü yayımcısını singleton olarak kaydeder ve yapılandırır HealthCheckPublisherOptions:

builder.Services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.FromSeconds(2);
    options.Predicate = healthCheck => healthCheck.Tags.Contains("sample");
});

builder.Services.AddSingleton<IHealthCheckPublisher, SampleHealthCheckPublisher>();

AspNetCore.Diagnostics.HealthChecks:

Bireysel Sağlık Kontrolleri

Her bir 'i ayrı ayrı ayarlayabilirsiniz. ve Bazı sistem durumu denetimlerini içinde HealthCheckPublisherOptionsayarlanan dönemden farklı bir hızda çalıştırmak istediğinizde bu değerleri ayarlayın.

Aşağıdaki kod, Delay ve Period değerlerini SampleHealthCheck1 için ayarlar.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHealthChecks()
   .Add(new HealthCheckRegistration(
       name: "SampleHealthCheck1",
       instance: new SampleHealthCheck(),
       failureStatus: null,
       tags: null,
       timeout: default)
   {
       Delay = TimeSpan.FromSeconds(40),
       Period = TimeSpan.FromSeconds(30)
   });

var app = builder.Build();

app.MapHealthChecks("/healthz");

app.Run();

Bağımlılık Enjeksiyonu ve Sağlık Kontrolleri

Bir Sistem Durumu Denetimi sınıfı içindeki belirli Type bir örneğini kullanmak için bağımlılık ekleme özelliğini kullanmak mümkündür. Bağımlılık ekleme, sistem durumu denetimine seçenekler veya genel yapılandırma eklemek için yararlı olabilir. Bağımlılık enjeksiyonunun kullanılması, Sağlık Kontrollerini yapılandırmak için yaygın bir senaryo değildir. Genellikle, her Health Check, gerçek teste özgüdür ve uzantı yöntemleri kullanılarak IHealthChecksBuilder yapılandırılır.

Aşağıdaki örnekte, bağımlılık ekleme yoluyla bir yapılandırma nesnesi alan örnek bir Sistem Durumu Denetimi gösterilmektedir:

public class SampleHealthCheckWithDI : IHealthCheck
{
    private readonly SampleHealthCheckWithDiConfig _config;

    public SampleHealthCheckWithDI(SampleHealthCheckWithDiConfig config)
        => _config = config;

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        var isHealthy = true;

        // use _config ...

        if (isHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            new HealthCheckResult(
                context.Registration.FailureStatus, "An unhealthy result."));
    }
}

SampleHealthCheckWithDiConfig ve Sağlık kontrolü hizmet kapsayıcısına eklenmelidir.

builder.Services.AddSingleton<SampleHealthCheckWithDiConfig>(new SampleHealthCheckWithDiConfig
{
    BaseUriToCheck = new Uri("https://sample.contoso.com/api/")
});
builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheckWithDI>(
        "With Dependency Injection",
        tags: new[] { "inject" });

UseHealthChecks ile MapHealthChecks karşılaştırması

Sistem durumu denetimlerini arayanlar için iki şekilde erişilebilir hale getirebilirsiniz:

  • UseHealthChecks ara yazılım işlem hattında sistem durumu denetimleri isteklerini işlemek için ara yazılımı kaydeder.
  • MapHealthChecks sağlık denetimleri uç noktasını kaydeder. Uç nokta, uygulamadaki diğer uç noktalarla birlikte eşleştirilir ve yürütülür.

MapHealthChecks yerine UseHealthChecks kullanarak, yetkilendirme gibi uç noktaya duyarlı ara yazılımlar kullanabilir ve eşleştirme politikası üzerinde daha ayrıntılı denetim elde edebilirsiniz. UseHealthChecks yerine MapHealthChecks kullanarak, sistem durumu denetimlerinin ara yazılım işlem hattında tam olarak nerede çalıştığını kontrol edersiniz.

UseHealthChecks:

  • bir istek sistem durumu denetimi uç noktasıyla eşleştiğinde işlem hattını sonlandırır. Kısa devre yapma, günlüğe kaydetme ve diğer ara yazılımlar gibi gereksiz işleri önlediği için genellikle tercih edilir.
  • Öncelikle işlem hattında sistem durumu denetimi ara yazılımını yapılandırmak için kullanılır.
  • Bir null veya boş PathString ile bir bağlantı noktasındaki herhangi bir yolu eşleştirebilir. Belirtilen bağlantı noktasına yapılan herhangi bir istekte sağlık denetimi gerçekleştirmeye izin verir.
  • Kaynak kod

MapHealthChecks izin verir:

  • ShortCircuit çağrısı yaparak, bir istek sistem durumu denetimi uç noktasıyla eşleştiğinde işlem hattını sonlandırmak. Örneğin, app.MapHealthChecks("/healthz").ShortCircuit();. Daha fazla bilgi için, Yönlendirmeden sonra ara yazılımının kısa devre edilmesi kısmına bakın.
  • Sağlık kontrolleri için belirli yolları veya uç noktaları haritalama.
  • Sistem durumu denetimi uç noktasının erişilebilir olduğu URL'nin veya yolun özelleştirilmesi.
  • Farklı yollar veya yapılandırmalarla birden çok sağlık kontrolü uç noktalarını eşleme. Birden çok uç nokta desteği:
    • Farklı sistem durumu denetimleri veya bileşenleri için ayrı uç noktaları etkinleştirir.
    • Uygulamanın sistem durumunun farklı yönlerini ayırt etmek veya sistem durumu denetimlerinin alt kümelerine belirli yapılandırmalar uygulamak için kullanılır.
  • Kaynak kod

Ek kaynaklar

Note

Bu makale, kısmen yapay zeka yardımıyla oluşturulmuştur. Yayımlanmadan önce içerik bir yazar tarafından gözden geçirilmiş ve gereken şekilde düzeltilmiştir. Microsoft Learn'de yapay zeka tarafından oluşturulan içerik kullanma ilkelerimize bakın.

ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için Sistem Durumu Denetimleri Ara Yazılımı ve kitaplıklar sunar.

Uygulama tarafından sağlık kontrolleri HTTP uç noktaları olarak sağlanır. Sistem durumu denetimi uç noktaları çeşitli gerçek zamanlı izleme senaryoları için yapılandırılabilir:

  • Sistem durumu yoklamaları, bir uygulamanın durumunu denetlemek için kapsayıcı düzenleme sistemleri ve yük dengeleyiciler tarafından kullanılabilir. Örneğin, bir kapsayıcı düzenleyicisi, başarısız olan bir sağlık kontrolüne yanıt olarak aşamalı dağıtımı durdurabilir veya bir kapsayıcıyı yeniden başlatabilir. Yük dengeleyici, trafiği hatalı örnekten iyi durumdaki bir örneğe yönlendirerek iyi durumda olmayan bir uygulamaya tepki verebilir.
  • İyi durumda bellek, disk ve diğer fiziksel sunucu kaynaklarının kullanımı izlenebilir.
  • Sistem durumu denetimleri, kullanılabilirliği ve normal çalışma durumunu onaylamak için bir uygulamanın veritabanları ve dış hizmet uç noktaları gibi bağımlılıklarını test edebilir.

Örnek kodu görüntüleme veya indirme (indirme)

Örnek uygulama, bu makalede açıklanan senaryoların örneklerini içerir. Belirli bir senaryo için örnek uygulamayı çalıştırmak için, projenin bir komut kabuğundaki klasöründeki dotnet run komutunu kullanın. Örnek uygulamanın nasıl kullanılacağı hakkında ayrıntılı bilgi için bu makaledeki örnek uygulamanın README.md dosyasına ve senaryo açıklamalarına bakın.

Prerequisites

Sağlık kontrolleri, genellikle bir uygulamanın durumunu kontrol etmek için dış bir izleme hizmeti veya kapsayıcı düzenleyici ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce hangi izleme sisteminin kullanılacağına karar verin. İzleme sistemi, hangi tür sağlık kontrollerinin oluşturulacağını ve endpoint'lerin nasıl yapılandırılacağını belirler.

Pakete Microsoft.AspNetCore.Diagnostics.HealthChecks ASP.NET Core uygulamaları için örtük olarak başvurulur. Entity Framework Core kullanarak sistem durumu denetimlerini çalıştırmak için pakete Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore bir başvuru ekleyin.

Örnek uygulama, çeşitli senaryolara yönelik sistem durumu denetimlerini göstermek için başlangıç kodu sağlar. Veritabanı sondalama senaryosu, AspNetCore.Diagnostics.HealthChecks kullanarak veritabanı bağlantısının durumunu denetler. DbContext prob senaryosu bir EF CoreDbContext kullanarak veritabanını denetler. Veritabanı senaryolarını keşfetmek için örnek uygulama:

Note

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Başka bir sistem durumu denetimi senaryosu, sistem durumu denetimlerini bir yönetim bağlantı noktasına filtrelemeyi gösterir. Örnek uygulama, yönetim URL'sini ve yönetim bağlantı noktasını içeren bir Properties/launchSettings.json dosya oluşturmanızı gerektirir. Daha fazla bilgi için Bağlantı noktasına göre filtreleme bölümüne bakın.

Temel sağlık denetimi

Birçok uygulama için, uygulamanın istekleri işlemek için kullanılabilirliğini (çalışırlık durumu) bildiren temel bir sağlık araştırması yapılandırması, uygulamanın durumunu keşfetmek için yeterlidir.

Temel yapılandırma, sağlık denetimi hizmetlerini kaydeder ve bir URL uç noktasında sağlık yanıtı ile yanıt vermek için Sağlık Denetimleri Ara yazılımını çağırır. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için özgül bir sağlık kontrolü kayıtlı değildir. Uygulama, sistem durumu uç noktası URL'sinde yanıt verebiliyorsa iyi durumda kabul edilir. Varsayılan yanıt yazarı, durumu (HealthStatus) istemciye düz metin yanıtı olarak yazar ve bir HealthStatus.Healthy, HealthStatus.Degraded veya HealthStatus.Unhealthy durumunu belirtir.

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. MapHealthChecks içinde, Startup.Configure arayarak bir sağlık denetimi uç noktası oluşturun.

Örnek uygulamada, sistem durumu denetimi uç noktası şu konumda /health oluşturulur: (BasicStartup.cs):

public class BasicStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHealthChecks();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHealthChecks("/health");
        });
    }
}

Örnek uygulamayı kullanarak temel yapılandırma senaryosunu çalıştırmak için, projenin klasöründeki komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario basic

Docker örneği

Docker , temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu denetlemek için kullanılabilecek yerleşik HEALTHCHECK bir yönerge sunar:

HEALTHCHECK CMD curl --fail http://localhost:5000/health || exit

Sağlık denetimleri oluşturma

Sağlık denetimleri IHealthCheck arabirimi uygulanarak oluşturulur. CheckHealthAsync yöntemi, sağlığı HealthCheckResult, Healthy veya Degraded olarak gösteren bir Unhealthy döndürür. Sonuç, yapılandırılabilir durum koduyla düz metin yanıtı olarak yazılır (yapılandırma, Sistem durumu denetimi seçenekleri bölümünde açıklanmıştır). HealthCheckResult isteğe bağlı anahtar-değer çiftleri de döndürebilir.

Aşağıdaki ExampleHealthCheck sınıf, bir sağlık kontrolünün düzenini gösterir. Sağlık kontrolü mantığı CheckHealthAsync yöntemine yerleştirilir. Aşağıdaki örnek, healthCheckResultHealthytrueolarak bir manken değişkeni ayarlar. Eğer healthCheckResultHealthy değeri false olarak ayarlanırsa, HealthCheckRegistration.FailureStatus durumu döndürülür.

public class ExampleHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        var healthCheckResultHealthy = true;

        if (healthCheckResultHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            new HealthCheckResult(context.Registration.FailureStatus, 
            "An unhealthy result."));
    }
}

Denetim sırasında CheckHealthAsync bir özel durum atarsa, HealthReportEntry tarafından tanımlanan ve başlangıçta denetim hatasına neden olan iç özel durumu da içeren HealthReportEntry.Status ile yeni bir FailureStatus döndürülür (bkz. AddCheck bölümü). Description, özel durumun iletisi olarak ayarlanır.

Sağlık denetimi hizmetlerini kaydetme

Sağlık kontrolü hizmetlerine ExampleHealthCheck türü, AddCheck ile Startup.ConfigureServices eklenir.

services.AddHealthChecks()
    .AddCheck<ExampleHealthCheck>("example_health_check");

AddCheck Aşağıdaki örnekte gösterilen aşırı yükleme, sistem durumu denetimi hata bildirdiğinde hata durumunu (HealthStatus) bildirecek şekilde ayarlar. Hata durumu (varsayılan) null olarak ayarlanırsa HealthStatus.Unhealthy raporlanır. Bu aşırı yükleme, kitaplık yazarları için yararlı bir senaryodur; sağlık denetimi uygulaması ayarı kabul ederse, sağlık denetimi hatası durumunda kitaplık tarafından belirtilen hata durumunun uygulama tarafından zorunlu kılındığı bir durumdur.

Etiketler, sistem durumu denetimlerini filtrelemek için kullanılabilir (Sistem durumu denetimlerini filtrele bölümünde daha ayrıntılı olarak açıklanmıştır).

services.AddHealthChecks()
    .AddCheck<ExampleHealthCheck>(
        "example_health_check",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "example" });

AddCheck bir lambda işlevini de yürütebilir. Aşağıdaki örnekte, sistem durumu denetimi adı olarak Example belirtilir ve denetim her zaman iyi durumda bir durum döndürür:

services.AddHealthChecks()
    .AddCheck("Example", () =>
        HealthCheckResult.Healthy("Example is OK!"), tags: new[] { "example" });

Argümanları bir sağlık kontrolü uygulamasına geçirmek için AddTypeActivatedCheck çağırın. Aşağıdaki örnekte, TestHealthCheckWithArgs çağrıldığında CheckHealthAsync kullanılmak üzere bir tamsayı ve dize kabul eder:

private class TestHealthCheckWithArgs : IHealthCheck
{
    public TestHealthCheckWithArgs(int i, string s)
    {
        I = i;
        S = s;
    }

    public int I { get; set; }

    public string S { get; set; }

    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, 
        CancellationToken cancellationToken = default)
    {
        ...
    }
}

TestHealthCheckWithArgs, uygulamaya iletilen tamsayı ve dize ile AddTypeActivatedCheck çağrılarak kaydedilir.

services.AddHealthChecks()
    .AddTypeActivatedCheck<TestHealthCheckWithArgs>(
        "test", 
        failureStatus: HealthStatus.Degraded, 
        tags: new[] { "example" }, 
        args: new object[] { 5, "string" });

Sağlık Kontrolleri Yönlendirmesini Kullanma

Startup.Configure içinde, uç nokta URL'si veya göreli yolu ile uç nokta oluşturucusunda MapHealthChecks çağırın.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

Konağı gerektir

Sistem durumu denetimi uç noktası için bir veya daha fazla izin verilen konak belirtmek için çağrısı RequireHost yapın. Hostlar punycode yerine Unicode olmalıdır ve bir port içerebilir. Koleksiyon sağlanmazsa, herhangi bir konak kabul edilir.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health").RequireHost("www.contoso.com:5001");
});

Daha fazla bilgi için Bağlantı noktasına göre filtreleme bölümüne bakın.

Yetkilendirme gerektir

RequireAuthorization öğesini durum denetimi istek uç noktasında Yetkilendirme Ara Yazılımını çalıştırmak için çağırın. Aşırı RequireAuthorization yükleme bir veya daha fazla yetkilendirme ilkesi kabul eder. İlke sağlanmazsa, varsayılan yetkilendirme ilkesi kullanılır.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health").RequireAuthorization();
});

Kaynaklar Arası İstekleri (CORS) etkinleştirme

Sistem durumu denetimlerini tarayıcıda el ile çalıştırmak yaygın bir kullanım senaryosu olmasa da, CORS Ara Yazılımı sistem durumu denetimleri uç noktalarına çağrılarak RequireCors etkinleştirilebilir. Aşırı RequireCors yükleme, CORS ilke oluşturucu temsilcisini (CorsPolicyBuilder) veya ilke adını kabul eder. İlke sağlanmazsa, varsayılan CORS ilkesi kullanılır. Daha fazla bilgi için ASP.NET Core'da Kaynaklar Arası İstekler (CORS) Etkinleştirme başlıklı sayfaya bakın.

Sağlık kontrolü seçenekleri

HealthCheckOptions sistem durumu denetimi davranışını özelleştirme fırsatı sağlar:

Sağlık kontrollerini filtrele

Varsayılan olarak, Sistem Durumu Denetimleri Ara Yazılımı tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için seçeneğine Predicate boole döndüren bir işlev sağlayın. Aşağıdaki örnekte, sistem durumu denetimi işlevin Bar koşullu deyiminde etiketine (bar_tag) göre filtrelenmiştir; burada true yalnızca sistem durumu denetiminin Tags özelliği veya foo_tagile eşleşirse baz_tag döndürülür:

Startup.ConfigureServices içinde:

services.AddHealthChecks()
    .AddCheck("Foo", () =>
        HealthCheckResult.Healthy("Foo is OK!"), tags: new[] { "foo_tag" })
    .AddCheck("Bar", () =>
        HealthCheckResult.Unhealthy("Bar is unhealthy!"), tags: new[] { "bar_tag" })
    .AddCheck("Baz", () =>
        HealthCheckResult.Healthy("Baz is OK!"), tags: new[] { "baz_tag" });

Startup.Configure içinde, Predicate 'Bar' sistem durumu denetimini filtreler. Yalnızca Foo ve Baz yürütülür:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        Predicate = (check) => check.Tags.Contains("foo_tag") ||
            check.Tags.Contains("baz_tag")
    });
});

HTTP durum kodunu özelleştirme

HTTP durum kodlarına sağlık durumunun eşlemeyi özelleştirmek için ResultStatusCodes kullanın. Aşağıdaki StatusCodes atamalar ara yazılım tarafından kullanılan varsayılan değerlerdir. Durum kodu değerlerini gereksinimlerinizi karşılayacak şekilde değiştirin.

Startup.Configure içinde:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResultStatusCodes =
        {
            [HealthStatus.Healthy] = StatusCodes.Status200OK,
            [HealthStatus.Degraded] = StatusCodes.Status200OK,
            [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
        }
    });
});

Önbellek üst bilgilerini gizleme

AllowCachingResponses Durum Denetimleri Ara Yazılımının yanıt önbelleğe almayı önlemek için yoklama yanıtına HTTP üst bilgileri ekleyip eklemediğini denetler. Değer false (varsayılan) ise, ara yazılım, Cache-Control, Expires ve Pragma üst bilgilerini ayarlar veya geçersiz kılarak yanıt önbelleğe almayı önler. Değer true ise, ara yazılım yanıtın önbellek başlıklarını değiştirmez.

Startup.Configure içinde:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        AllowCachingResponses = true
    });
});

Çıktıyı özelleştirme

Startup.Configure içinde, HealthCheckOptions.ResponseWriter seçeneğini yanıtı yazmak için bir temsilci olarak ayarlayın.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResponseWriter = WriteResponse
    });
});

Varsayılan temsilci, dize değeriyle en düşük düz metin yanıtını HealthReport.Statusyazar. Aşağıdaki özel temsilciler özel bir JSON yanıtı verir.

Örnek uygulamadaki ilk örnekte nasıl kullanılacağı System.Text.Jsongösterilmektedir:

private static Task WriteResponse(HttpContext context, HealthReport result)
{
    context.Response.ContentType = "application/json; charset=utf-8";

    var options = new JsonWriterOptions
    {
        Indented = true
    };

    using (var stream = new MemoryStream())
    {
        using (var writer = new Utf8JsonWriter(stream, options))
        {
            writer.WriteStartObject();
            writer.WriteString("status", result.Status.ToString());
            writer.WriteStartObject("results");
            foreach (var entry in result.Entries)
            {
                writer.WriteStartObject(entry.Key);
                writer.WriteString("status", entry.Value.Status.ToString());
                writer.WriteString("description", entry.Value.Description);
                writer.WriteStartObject("data");
                foreach (var item in entry.Value.Data)
                {
                    writer.WritePropertyName(item.Key);
                    JsonSerializer.Serialize(
                        writer, item.Value, item.Value?.GetType() ??
                        typeof(object));
                }
                writer.WriteEndObject();
                writer.WriteEndObject();
            }
            writer.WriteEndObject();
            writer.WriteEndObject();
        }

        var json = Encoding.UTF8.GetString(stream.ToArray());

        return context.Response.WriteAsync(json);
    }
}

İkinci örnekte nasıl kullanılacağı Newtonsoft.Jsongösterilmektedir:

private static Task WriteResponse(HttpContext context, HealthReport result)
{
    context.Response.ContentType = "application/json";

    var json = new JObject(
        new JProperty("status", result.Status.ToString()),
        new JProperty("results", new JObject(result.Entries.Select(pair =>
            new JProperty(pair.Key, new JObject(
                new JProperty("status", pair.Value.Status.ToString()),
                new JProperty("description", pair.Value.Description),
                new JProperty("data", new JObject(pair.Value.Data.Select(
                    p => new JProperty(p.Key, p.Value))))))))));

    return context.Response.WriteAsync(
        json.ToString(Formatting.Indented));
}

Örnek uygulamada, SYSTEM_TEXT_JSONön işleme yönergesiniCustomWriterStartup.cs açıklama satırı yaparak Newtonsoft.JsonWriteResponse.

Sistem durumu denetimleri API'si, karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz çünkü biçim, seçtiğiniz izleme sistemine özgüdür. Yukarıdaki örneklerde verilen yanıtı gerektiği gibi özelleştirin. JSON serileştirme hakkında daha fazla bilgi için, System.Text.Json konusuna bakın.

Veritabanı yoklaması

Sistem durumu denetimi, veritabanının normal yanıt verdiğini belirtmek için boole testi olarak çalıştırılacak bir veritabanı sorgusu belirtebilir.

Örnek uygulama, SQL Server veritabanında sistem durumu denetimi çalıştırmak için ASP.NET Core uygulamaları için bir sistem durumu denetimi kitaplığı kullanır AspNetCore.Diagnostics.HealthChecks. AspNetCore.Diagnostics.HealthChecks veritabanı bağlantısının iyi durumda olduğunu onaylamak için veritabanına karşı bir SELECT 1 sorgu yürütür.

Warning

Bir sorguyla veritabanı bağlantısını denetlerken, hızlı bir şekilde döndüren bir sorgu seçin. Sorgu yaklaşımı veritabanını aşırı yükleme ve performansını düşürme riskini çalıştırır. Çoğu durumda test sorgusu çalıştırmak gerekli değildir. Yalnızca veritabanıyla başarılı bir bağlantı oluşturmak yeterlidir. Sorgu çalıştırmayı gerekli bulursanız, gibi SELECT 1basit bir SELECT sorgusu seçin.

Bir paket referansı AspNetCore.HealthChecks.SqlServer ekleyin.

Örnek uygulamanın appsettings.json dosyasında geçerli bir veritabanı bağlantı dizesi sağlayın. Uygulama adlı HealthCheckSamplebir SQL Server veritabanı kullanır:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=HealthCheckSample;Trusted_Connection=True;MultipleActiveResultSets=true;ConnectRetryCount=0"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "Console": {
      "IncludeScopes": "true"
    }
  },
  "AllowedHosts": "*"
}

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. Örnek uygulama, veritabanının bağlantı dizesiyle (AddSqlServer) DbHealthStartup.cs yöntemini çağırır.

services.AddHealthChecks()
    .AddSqlServer(Configuration["ConnectionStrings:DefaultConnection"]);

MapHealthChecks fonksiyonunu Startup.Configure içinde çağırarak bir sistem sağlığı denetimi uç noktası oluşturulur.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
}

Örnek uygulamayı kullanarak veritabanı yoklaması senaryosunu çalıştırmak için, projenin klasöründeki komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario db

Note

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Entity Framework Core DbContext araştırması

Denetim, uygulamanın DbContextEF Core için yapılandırılan veritabanıyla iletişim kurabildiğini DbContext onaylar. Aşağıdaki uygulamalarda DbContext denetimi desteklenir:

için bir sağlık kontrolü kaydeder. Yöntemine DbContext olarak TContext sağlanır. Hata durumunu, etiketleri ve özel test sorgusunu yapılandırmak için bir overload işlevi kullanılabilir.

Varsayılan olarak:

  • DbContextHealthCheck, EF Core'nin CanConnectAsync yöntemini çağırır. Yöntem aşırı yüklemelerini kullanarak AddDbContextCheck sistem durumu denetlenirken çalıştırılacak işlemi özelleştirebilirsiniz.
  • Sağlık durumu kontrolünün adı, TContext türünün adıdır.

Örnek uygulamada, AppDbContext, AddDbContextCheck'e sağlanır ve Startup.ConfigureServices içinde bir hizmet olarak DbContextHealthStartup.cs kaydedilir:

services.AddHealthChecks()
    .AddDbContextCheck<AppDbContext>();

services.AddDbContext<AppDbContext>(options =>
{
    options.UseSqlServer(
        Configuration["ConnectionStrings:DefaultConnection"]);
});

MapHealthChecks fonksiyonunu Startup.Configure içinde çağırarak bir sistem sağlığı denetimi uç noktası oluşturulur.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
}

Örnek uygulamayı kullanarak araştırma senaryosunu DbContext çalıştırmak için, bağlantı dizesi tarafından belirtilen veritabanının SQL Server örneğinde mevcut olmadığını onaylayın. Veritabanı varsa silin.

Aşağıdaki komutu projenin klasörü içinde komut satırında yürütün:

dotnet run --scenario dbcontext

Uygulama çalıştırıldıktan sonra tarayıcıda /health uç noktasına istekte bulunarak sağlık durumunu denetleyin. Veritabanı AppDbContext mevcut olmadığından, uygulama aşağıdaki yanıtı sağlar:

Unhealthy

Veritabanını oluşturmak için örnek uygulamayı tetikleyin. Bir talepte bulunmak için /createdatabase adresini kullanın. Uygulama yanıt verir:

Creating the database...
Done!
Navigate to /health to see the health status.

/health endpointine bir istekte bulunun. Veritabanı ve bağlam mevcut olduğundan uygulama şunları yanıtlar:

Healthy

Veritabanını silmek için örnek uygulamayı tetikleyin. Bir talepte bulunmak için /deletedatabase adresini kullanın. Uygulama yanıt verir:

Deleting the database...
Done!
Navigate to /health to see the health status.

/health endpointine bir istekte bulunun. Uygulama sağlıksız bir yanıt verir.

Unhealthy

Ayrı hazırlık ve canlılık yoklamaları

Bazı barındırma senaryolarında, iki uygulama durumunu ayırt etmek için bir çift sistem durumu denetimi kullanılır:

  • Hazır olma, uygulamanın normal çalışıp çalışmadığını ancak istekleri almaya hazır olmadığını gösterir.
  • Çalışırlık durumu, bir uygulamanın kapatılıp kapatılmadığını ve yeniden başlatılması gerekip gerekmediğini belirtir.

Aşağıdaki örneği göz önünde bulundurun: Bir uygulamanın istekleri işlemeye hazır olması için büyük bir yapılandırma dosyasını indirmesi gerekir. İlk indirme başarısız olursa uygulamanın yeniden başlatılmasını istemiyoruz çünkü uygulama dosyayı birkaç kez indirmeyi yeniden deneyebilir. İşlemin canlılığını açıklamak için bir canlılık probu kullanırız, başka hiçbir denetim çalıştırılmaz. Yapılandırma dosyası indirme başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyoruz. Başarılı indirme gerçekleşene ve uygulama istekleri almaya hazır olana kadar, bir hazır olma kontrolü kullanarak "hazır değil" durumunu belirtiriz.

Örnek uygulama, Barındırılan Hizmette uzun süre çalışan başlangıç görevinin tamamlanmasını raporlamak için bir sistem durumu denetimi içerir. , StartupHostedServiceHealthCheck barındırılan hizmetin uzun süre çalışan görevi tamamlandığında ayarlayabildiği StartupTaskCompleted bir özelliğini truekullanıma sunar (StartupHostedServiceHealthCheck.cs):

public class StartupHostedServiceHealthCheck : IHealthCheck
{
    private volatile bool _startupTaskCompleted = false;

    public string Name => "slow_dependency_check";

    public bool StartupTaskCompleted
    {
        get => _startupTaskCompleted;
        set => _startupTaskCompleted = value;
    }

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        if (StartupTaskCompleted)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("The startup task is finished."));
        }

        return Task.FromResult(
            HealthCheckResult.Unhealthy("The startup task is still running."));
    }
}

Uzun süre çalışan arka plan görevi, Barındırılan Hizmet (Services/StartupHostedService ) tarafından başlatılır. Görevin sonunda StartupHostedServiceHealthCheck.StartupTaskCompleted, true olarak ayarlanır.

public class StartupHostedService : IHostedService, IDisposable
{
    private readonly int _delaySeconds = 15;
    private readonly ILogger _logger;
    private readonly StartupHostedServiceHealthCheck _startupHostedServiceHealthCheck;

    public StartupHostedService(ILogger<StartupHostedService> logger,
        StartupHostedServiceHealthCheck startupHostedServiceHealthCheck)
    {
        _logger = logger;
        _startupHostedServiceHealthCheck = startupHostedServiceHealthCheck;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Startup Background Service is starting.");

        // Simulate the effect of a long-running startup task.
        Task.Run(async () =>
        {
            await Task.Delay(_delaySeconds * 1000);

            _startupHostedServiceHealthCheck.StartupTaskCompleted = true;

            _logger.LogInformation("Startup Background Service has started.");
        });

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Startup Background Service is stopping.");

        return Task.CompletedTask;
    }

    public void Dispose()
    {
    }
}

Sistem durumu denetimi, barındırılan hizmetle birlikte AddCheckStartup.ConfigureServices ile kaydedilir. Barındırılan hizmet, sağlık kontrolünde özelliği ayarlamak zorunda olduğundan, sağlık kontrolü de hizmet kapsayıcısında (LivenessProbeStartup.cs) kayıtlıdır.

services.AddHostedService<StartupHostedService>();
services.AddSingleton<StartupHostedServiceHealthCheck>();

services.AddHealthChecks()
    .AddCheck<StartupHostedServiceHealthCheck>(
        "hosted_service_startup",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "ready" });

services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.FromSeconds(2);
    options.Predicate = (check) => check.Tags.Contains("ready");
});

services.AddSingleton<IHealthCheckPublisher, ReadinessPublisher>();

MapHealthChecks Startup.Configure içinde çağrılarak bir sağlık kontrolü uç noktası oluşturulur. Örnek uygulamada sistem durumu denetimi uç noktaları şu konumda oluşturulur:

  • /health/ready hazır olma denetimi için. Hazır olma denetimi, durum denetimlerini ready etiketli sağlık denetimine filtreler.
  • /health/live canlılık kontrolü için. Canlılık kontrolü, StartupHostedServiceHealthCheckfalse içinde geri döndürerek filtreler (daha fazla bilgi için bkz. HealthCheckOptions.Predicate)

Aşağıdaki örnek kodda:

  • Hazır olma denetimi , 'hazır' etiketiyle tüm kayıtlı denetimleri kullanır.
  • tüm Predicate denetimleri dışlar ve 200-Tamam döndürür.
app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions()
    {
        Predicate = (check) => check.Tags.Contains("ready"),
    });

    endpoints.MapHealthChecks("/health/live", new HealthCheckOptions()
    {
        Predicate = (_) => false
    });
}

Hazırlık/canlılık yapılandırma senaryosunu örnek uygulamayı kullanarak çalıştırmak için, projenin klasöründeki komut kabuğunda aşağıdaki komutu yürütür:

dotnet run --scenario liveness

Tarayıcıda, 15 saniye geçene kadar /health/ready sayfasını birkaç kez ziyaret edin. İlk 15 saniye için sağlık kontrolü raporları Unhealthy. 15 saniye sonra, uç nokta, barındırılan hizmet tarafından uzun süre çalışan bir görevin tamamlandığını yansıtan değeri Healthy olarak raporlar.

Bu örnek ayrıca iki saniyelik bir gecikmeyle ilk hazırlık kontrolünü gerçekleştiren bir Sağlık Kontrol Yayımlayıcı (IHealthCheckPublisher uygulaması) oluşturur. Daha fazla bilgi için Sağlık Kontrolü Yayımcısı bölümüne bakın.

Kubernetes örneği

Ayrı hazır olma ve canlılık denetimleri kullanmak Kubernetes gibi bir ortamda kullanışlıdır. Kubernetes'te, temel alınan veritabanı kullanılabilirliği testi gibi istekleri kabul etmeden önce zaman alan başlangıç çalışmalarını çalıştırmak için bir uygulama gerekebilir. Ayrı denetimler kullanmak, düzenleyicinin uygulamanın çalışıp çalışmadığını ancak henüz hazır olup olmadığını veya uygulamanın başlatılamadığını ayırt etmesini sağlar. Kubernetes'teki hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerindeki Canlılık ve Hazırlık Yoklamalarını Yapılandırma bölümüne bakın.

Aşağıdaki örnekte Kubernetes hazır olma yoklaması yapılandırması gösterilmektedir:

spec:
  template:
  spec:
    readinessProbe:
      # an http probe
      httpGet:
        path: /health/ready
        port: 80
      # length of time to wait for a pod to initialize
      # after pod startup, before applying health checking
      initialDelaySeconds: 30
      timeoutSeconds: 1
    ports:
      - containerPort: 80

Özel yanıt yazıcısı ile ölçüm tabanlı yoklama

Örnek uygulama, özel yanıt yazıcısı ile bir bellek durumu denetimi gösterir.

MemoryHealthCheck uygulama belirli bir bellek eşiğinden (örnek uygulamada 1 GB) daha fazla kullanıyorsa düzeyi düşürülmüş durumu bildirir. , HealthCheckResult uygulama için Çöp Toplayıcı (GC) bilgilerini içerir (MemoryHealthCheck.cs):

public class MemoryHealthCheck : IHealthCheck
{
    private readonly IOptionsMonitor<MemoryCheckOptions> _options;

    public MemoryHealthCheck(IOptionsMonitor<MemoryCheckOptions> options)
    {
        _options = options;
    }

    public string Name => "memory_check";

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        var options = _options.Get(context.Registration.Name);

        // Include GC information in the reported diagnostics.
        var allocated = GC.GetTotalMemory(forceFullCollection: false);
        var data = new Dictionary<string, object>()
        {
            { "AllocatedBytes", allocated },
            { "Gen0Collections", GC.CollectionCount(0) },
            { "Gen1Collections", GC.CollectionCount(1) },
            { "Gen2Collections", GC.CollectionCount(2) },
        };
        var status = (allocated < options.Threshold) ?
            HealthStatus.Healthy : context.Registration.FailureStatus;

        return Task.FromResult(new HealthCheckResult(
            status,
            description: "Reports degraded status if allocated bytes " +
                $">= {options.Threshold} bytes.",
            exception: null,
            data: data));
    }
}

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. Sağlık kontrolünü AddCheck'ye geçirerek etkinleştirmek yerine, MemoryHealthCheck bir hizmet olarak kaydedilir. Tüm IHealthCheck kayıtlı hizmetler sistem durumu kontrol hizmetleri ve ara yazılım tarafından kullanılabilir. Sistem durumu denetimi hizmetlerini Singleton hizmetler olarak kaydetmenizi öneririz.

Örnek uygulamanın CustomWriterStartup.cs içinde:

services.AddHealthChecks()
    .AddMemoryHealthCheck("memory");

MapHealthChecks Startup.Configure içinde çağrılarak bir sağlık kontrolü uç noktası oluşturulur. WriteResponse özelliğine, sistem sağlığı kontrolü yürütüldüğünde özel bir JSON yanıtı vermesi için bir temsilci sağlanırResponseWriter.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResponseWriter = WriteResponse
    });
}

Temsilci, WriteResponse öğesini CompositeHealthCheckResult bir JSON nesnesine biçimlendirip sistem durumu denetimi yanıtı için JSON çıkışı verir. Daha fazla bilgi için Çıkışı özelleştirme bölümüne bakın.

Örnek uygulamayı kullanarak ölçüm tabanlı araştırmayı özel yanıt yazıcı çıkışıyla çalıştırmak için, projenin klasöründen bir komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario writer

Note

AspNetCore.Diagnostics.HealthChecks disk depolama ve maksimum değer canlılık denetimleri dahil olmak üzere ölçüm tabanlı sistem durumu denetimi senaryolarını içerir.

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Bağlantı noktasına göre filtrele

RequireHost, bir bağlantı noktası belirten bir URL deseniyle MapHealthChecks üzerinde çağırarak sistem durumu denetimi isteklerini belirtilen bağlantı noktasına kısıtlayın. Bu yaklaşım genellikle izleme hizmetleri için bir bağlantı noktasını kullanıma sunma amacıyla kapsayıcı ortamında kullanılır.

Örnek uygulama, Ortam Değişkeni Yapılandırma Sağlayıcısı'nı kullanarak bağlantı noktasını yapılandırıyor. Bağlantı noktası dosyasında ayarlanır launchSettings.json ve bir ortam değişkeni aracılığıyla yapılandırma sağlayıcısına geçirilir. Ayrıca sunucuyu yönetim bağlantı noktasındaki istekleri dinleyecek şekilde yapılandırmanız gerekir.

Yönetim bağlantı noktası yapılandırmasını göstermek üzere örnek uygulamayı kullanmak için dosyayı bir launchSettings.json klasörde oluşturunProperties.

Örnek uygulamadaki aşağıdaki Properties/launchSettings.json dosya, örnek uygulamanın proje dosyalarına dahil değildir ve el ile oluşturulmalıdır:

{
  "profiles": {
    "SampleApp": {
      "commandName": "Project",
      "commandLineArgs": "",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "http://localhost:5000/;http://localhost:5001/",
        "ASPNETCORE_MANAGEMENTPORT": "5001"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. MapHealthChecks içinde, Startup.Configure arayarak bir sağlık denetimi uç noktası oluşturun.

Örnek uygulamada, RequireHost üzerinde Startup.Configure çağrısı, yapılandırmadan yönetim bağlantı noktasını belirtir:

endpoints.MapHealthChecks("/health")
    .RequireHost($"*:{Configuration["ManagementPort"]}");

Örnek uygulamada uç noktalar Startup.Configure içinde oluşturulur. Aşağıdaki örnek kodda:

  • Hazır olma denetimi , 'hazır' etiketiyle tüm kayıtlı denetimleri kullanır.
  • tüm Predicate denetimleri dışlar ve 200-Tamam döndürür.
app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions()
    {
        Predicate = (check) => check.Tags.Contains("ready"),
    });

    endpoints.MapHealthChecks("/health/live", new HealthCheckOptions()
    {
        Predicate = (_) => false
    });
}

Note

Örnek uygulamada launchSettings.json dosyasını oluşturmaktan kaçınmak için yönetim bağlantı noktasını kodda açıkça ayarlayabilirsiniz. Program.cs öğesinin oluşturulduğu yerde, HostBuilder öğesine bir çağrı yapmak için ListenAnyIP ekleyin ve uygulamanın yönetim portu uç noktasını sağlayın. Configure içindeki ManagementPortStartup.cs'de, yönetim bağlantı noktasını RequireHost ile belirtin.

Program.cs:

return new HostBuilder()
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseKestrel()
            .ConfigureKestrel(serverOptions =>
            {
                serverOptions.ListenAnyIP(5001);
            })
            .UseStartup(startupType);
    })
    .Build();

ManagementPortStartup.cs:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health").RequireHost("*:5001");
});

Örnek uygulamayı kullanarak yönetim bağlantı noktası yapılandırma senaryosunu çalıştırmak için, projenin klasöründen bir komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario port

Sağlık denetimi kitaplığı dağıtma

Bir sağlık kontrolünü (health check) kitaplık olarak dağıtmak için:

  1. IHealthCheck arabirimini bağımsız bir sınıf olarak uygulayan bir sağlık denetimi yazın. sınıfı, yapılandırma verilerine erişmek için bağımlılık ekleme (DI), tür etkinleştirme ve adlandırılmış seçenekleri kullanabilir.

    sağlık kontrolü mantığında CheckHealthAsync:

    • data1 ve data2, yoklamanın sağlık kontrolü mantığını çalıştırmak için kullanılan yöntemdir.
    • AccessViolationException işlenir.

    AccessViolationException bir oluştuğunda, FailureStatus ile birlikte HealthCheckResult döndürülür ve bu, kullanıcıların sağlık kontrolü hata durumunu yapılandırmasına olanak tanır.

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Extensions.Diagnostics.HealthChecks;
    
    namespace SampleApp
    {
        public class ExampleHealthCheck : IHealthCheck
        {
            private readonly string _data1;
            private readonly int? _data2;
    
            public ExampleHealthCheck(string data1, int? data2)
            {
                _data1 = data1 ?? throw new ArgumentNullException(nameof(data1));
                _data2 = data2 ?? throw new ArgumentNullException(nameof(data2));
            }
    
            public async Task<HealthCheckResult> CheckHealthAsync(
                HealthCheckContext context, CancellationToken cancellationToken)
            {
                try
                {
                    return HealthCheckResult.Healthy();
                }
                catch (AccessViolationException ex)
                {
                    return new HealthCheckResult(
                        context.Registration.FailureStatus,
                        description: "An access violation occurred during the check.",
                        exception: ex,
                        data: null);
                }
            }
        }
    }
    
  2. Tüketici uygulamanın Startup.Configure yönteminde çağıracağı parametrelerle bir uzatma yöntemi yazın. Aşağıdaki örnekte, aşağıdaki sağlık kontrolü yöntemi imzasını varsayın:

    ExampleHealthCheck(string, string, int )
    

    Önceki imza, ExampleHealthCheck öğesinin sağlık kontrolü sonda mantığını işlemek için ek veri gerektirdiğini gösterir. Veriler, sağlık durumu denetiminin bir uzantı yöntemiyle kaydedildiği zaman sağlık durumu denetimi örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte, çağıran kişi isteğe bağlı bir parametre belirtir.

    • sağlık kontrolü adı (name) null ise example_health_checkkullanılır.
    • sağlık kontrolü için dize veri noktası (data1).
    • sağlık kontrolü için tamsayı veri noktası data2. null ise 1kullanılır.
    • hata durumu (HealthStatus). Varsayılan değer: null. Eğer null olursa, HealthStatus.Unhealthy bir hata durumu için bildirilir.
    • etiketler (IEnumerable<string>)
    using System.Collections.Generic;
    using Microsoft.Extensions.Diagnostics.HealthChecks;
    
    public static class ExampleHealthCheckBuilderExtensions
    {
        const string DefaultName = "example_health_check";
    
        public static IHealthChecksBuilder AddExampleHealthCheck(
            this IHealthChecksBuilder builder,
            string name = default,
            string data1,
            int data2 = 1,
            HealthStatus? failureStatus = default,
            IEnumerable<string> tags = default)
        {
            return builder.Add(new HealthCheckRegistration(
                name ?? DefaultName,
                sp => new ExampleHealthCheck(data1, data2),
                failureStatus,
                tags));
        }
    }
    

Sağlık Kontrolü Yayınlayıcısı

Hizmet kapsayıcısına bir IHealthCheckPublisher eklendiğinde, sistem durumu denetimi sistemi düzenli aralıklarla sistem durumu denetimlerinizi yürütür ve sonuçla birlikte PublishAsync çağrısı yapar. Bu, her işlemin sistem durumunu belirlemek için izleme sistemini düzenli aralıklarla çağırmasını bekleyen, anında iletme tabanlı sistem durumu izleme sistemi senaryosunda kullanışlıdır.

Arabirimin IHealthCheckPublisher tek bir yöntemi vardır:

Task PublishAsync(HealthReport report, CancellationToken cancellationToken);

HealthCheckPublisherOptions şunları ayarlamanıza izin verir:

  • Delay: IHealthCheckPublisher örnekleri çalıştırılmadan önce, uygulama başlatıldıktan sonra uygulanan başlangıç gecikmesi. Gecikme başlangıçta bir kez uygulanır ve sonraki yinelemeler için geçerli değildir. Varsayılan değer beş saniyedir.
  • Period: IHealthCheckPublisher yürütme süresi. Varsayılan değer 30 saniyedir.
  • Predicate: Predicatenull (varsayılan) ise, sistem durumu denetimi yayımcı hizmeti tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için denetim kümesini filtreleyen bir işlev sağlayın. Öngörü her periyot değerlendirilir.
  • Timeout: Tüm IHealthCheckPublisher örnekleri için sağlık kontrollerini yürütme zaman aşımı. Zaman aşımı olmadan yürütmek için `InfiniteTimeSpan` kullanın. Varsayılan değer 30 saniyedir.

Örnek uygulamada ReadinessPublisher bir IHealthCheckPublisher uygulamadır. Sağlık kontrolü durumu, her kontrol için şu günlük seviyesinde günlüğe kaydedilir:

public class ReadinessPublisher : IHealthCheckPublisher
{
    private readonly ILogger _logger;

    public ReadinessPublisher(ILogger<ReadinessPublisher> logger)
    {
        _logger = logger;
    }

    // The following example is for demonstration purposes only. Health Checks
    // Middleware already logs health checks results. A real-world readiness
    // check in a production app might perform a set of more expensive or
    // time-consuming checks to determine if other resources are responding
    // properly.
    public Task PublishAsync(HealthReport report,
        CancellationToken cancellationToken)
    {
        if (report.Status == HealthStatus.Healthy)
        {
            _logger.LogInformation("{Timestamp} Readiness Probe Status: {Result}",
                DateTime.UtcNow, report.Status);
        }
        else
        {
            _logger.LogError("{Timestamp} Readiness Probe Status: {Result}",
                DateTime.UtcNow, report.Status);
        }

        cancellationToken.ThrowIfCancellationRequested();

        return Task.CompletedTask;
    }
}

Örnek uygulamanın LivenessProbeStartup örneğinde, hazırlık denetiminin StartupHostedService iki saniyelik başlatma gecikmesi vardır ve denetimi 30 saniyede bir çalıştırır. IHealthCheckPublisher uygulamasını etkinleştirmek için örnek, ReadinessPublisher'i bağımlılık ekleme (DI) konteynerinde tek bir hizmet olarak kaydeder.

services.AddHostedService<StartupHostedService>();
services.AddSingleton<StartupHostedServiceHealthCheck>();

services.AddHealthChecks()
    .AddCheck<StartupHostedServiceHealthCheck>(
        "hosted_service_startup",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "ready" });

services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.FromSeconds(2);
    options.Predicate = (check) => check.Tags.Contains("ready");
});

services.AddSingleton<IHealthCheckPublisher, ReadinessPublisher>();

Note

AspNetCore.Diagnostics.HealthChecks Application Insights dahil olmak üzere çeşitli sistemler için yayımcılar içerir.

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

MapWhen ile sistem durumu denetimlerini kısıtlama

Sağlık kontrolü uç noktaları için istek işlem hattını koşullu olarak dallara ayırmak üzere MapWhen kullanın.

Aşağıdaki örnekte, bir GET isteği MapWhen uç noktasına alındığında, istek işlem hattını dallayarak Sağlık Kontrolleri Middleware'ini etkinleştirir api/HealthCheck.

app.MapWhen(
    context => context.Request.Method == HttpMethod.Get.Method && 
        context.Request.Path.StartsWith("/api/HealthCheck"),
    builder => builder.UseHealthChecks());

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});

Daha fazla bilgi için, bkz. ASP.NET Core Ara Yazılımı.

ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için Sistem Durumu Denetimleri Ara Yazılımı ve kitaplıklar sunar.

Uygulama tarafından sağlık kontrolleri HTTP uç noktaları olarak sağlanır. Sistem durumu denetimi uç noktaları çeşitli gerçek zamanlı izleme senaryoları için yapılandırılabilir:

  • Sistem durumu yoklamaları, bir uygulamanın durumunu denetlemek için kapsayıcı düzenleme sistemleri ve yük dengeleyiciler tarafından kullanılabilir. Örneğin, bir kapsayıcı düzenleyicisi, başarısız olan bir sağlık kontrolüne yanıt olarak aşamalı dağıtımı durdurabilir veya bir kapsayıcıyı yeniden başlatabilir. Yük dengeleyici, trafiği hatalı örnekten iyi durumdaki bir örneğe yönlendirerek iyi durumda olmayan bir uygulamaya tepki verebilir.
  • İyi durumda bellek, disk ve diğer fiziksel sunucu kaynaklarının kullanımı izlenebilir.
  • Sistem durumu denetimleri, kullanılabilirliği ve normal çalışma durumunu onaylamak için bir uygulamanın veritabanları ve dış hizmet uç noktaları gibi bağımlılıklarını test edebilir.

Örnek kodu görüntüleme veya indirme (indirme)

Örnek uygulama, bu makalede açıklanan senaryoların örneklerini içerir. Belirli bir senaryo için örnek uygulamayı çalıştırmak için, projenin bir komut kabuğundaki klasöründeki dotnet run komutunu kullanın. Örnek uygulamanın nasıl kullanılacağı hakkında ayrıntılı bilgi için bu makaledeki örnek uygulamanın README.md dosyasına ve senaryo açıklamalarına bakın.

Prerequisites

Sağlık kontrolleri, genellikle bir uygulamanın durumunu kontrol etmek için dış bir izleme hizmeti veya kapsayıcı düzenleyici ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce hangi izleme sisteminin kullanılacağına karar verin. İzleme sistemi, hangi tür sağlık kontrollerinin oluşturulacağını ve endpoint'lerin nasıl yapılandırılacağını belirler.

Pakete Microsoft.AspNetCore.Diagnostics.HealthChecks ASP.NET Core uygulamaları için örtük olarak başvurulur. Entity Framework Core kullanarak sistem durumu denetimlerini çalıştırmak için pakete Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore bir paket başvurusu ekleyin.

Örnek uygulama, çeşitli senaryolara yönelik sistem durumu denetimlerini göstermek için başlangıç kodu sağlar. Veritabanı sondalama senaryosu, AspNetCore.Diagnostics.HealthChecks kullanarak veritabanı bağlantısının durumunu denetler. DbContext prob senaryosu bir EF CoreDbContext kullanarak veritabanını denetler. Veritabanı senaryolarını keşfetmek için örnek uygulama:

Note

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Başka bir sistem durumu denetimi senaryosu, sistem durumu denetimlerini bir yönetim bağlantı noktasına filtrelemeyi gösterir. Örnek uygulama, yönetim URL'sini ve yönetim bağlantı noktasını içeren bir Properties/launchSettings.json dosya oluşturmanızı gerektirir. Daha fazla bilgi için Bağlantı noktasına göre filtreleme bölümüne bakın.

Temel sağlık denetimi

Birçok uygulama için, uygulamanın istekleri işlemek için kullanılabilirliğini (çalışırlık durumu) bildiren temel bir sağlık araştırması yapılandırması, uygulamanın durumunu keşfetmek için yeterlidir.

Temel yapılandırma, sağlık denetimi hizmetlerini kaydeder ve bir URL uç noktasında sağlık yanıtı ile yanıt vermek için Sağlık Denetimleri Ara yazılımını çağırır. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için özgül bir sağlık kontrolü kayıtlı değildir. Uygulama, sistem durumu uç noktası URL'sinde yanıt verebiliyorsa iyi durumda kabul edilir. Varsayılan yanıt yazarı, durumu (HealthStatus) istemciye düz metin yanıtı olarak yazar ve bir HealthStatus.Healthy, HealthStatus.Degraded veya HealthStatus.Unhealthy durumunu belirtir.

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. MapHealthChecks içinde, Startup.Configure arayarak bir sağlık denetimi uç noktası oluşturun.

Örnek uygulamada, sistem durumu denetimi uç noktası şu konumda /health oluşturulur: (BasicStartup.cs):

public class BasicStartup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHealthChecks();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHealthChecks("/health");
        });
    }
}

Örnek uygulamayı kullanarak temel yapılandırma senaryosunu çalıştırmak için, projenin klasöründeki komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario basic

Docker örneği

Docker , temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu denetlemek için kullanılabilecek yerleşik HEALTHCHECK bir yönerge sunar:

HEALTHCHECK CMD curl --fail http://localhost:5000/health || exit

Sağlık denetimleri oluşturma

Sağlık denetimleri IHealthCheck arabirimi uygulanarak oluşturulur. CheckHealthAsync yöntemi, sağlığı HealthCheckResult, Healthy veya Degraded olarak gösteren bir Unhealthy döndürür. Sonuç, yapılandırılabilir durum koduyla düz metin yanıtı olarak yazılır (yapılandırma, Sistem durumu denetimi seçenekleri bölümünde açıklanmıştır). HealthCheckResult isteğe bağlı anahtar-değer çiftleri de döndürebilir.

Aşağıdaki ExampleHealthCheck sınıf, bir sağlık kontrolünün düzenini gösterir. Sağlık kontrolü mantığı CheckHealthAsync yöntemine yerleştirilir. Aşağıdaki örnek, healthCheckResultHealthytrueolarak bir manken değişkeni ayarlar. Eğer healthCheckResultHealthy değeri false olarak ayarlanırsa, HealthCheckResult.Unhealthy durumu döndürülür.

public class ExampleHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        var healthCheckResultHealthy = true;

        if (healthCheckResultHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            HealthCheckResult.Unhealthy("An unhealthy result."));
    }
}

Sağlık denetimi hizmetlerini kaydetme

Sağlık kontrolü hizmetlerine ExampleHealthCheck türü, AddCheck ile Startup.ConfigureServices eklenir.

services.AddHealthChecks()
    .AddCheck<ExampleHealthCheck>("example_health_check");

AddCheck Aşağıdaki örnekte gösterilen aşırı yükleme, sistem durumu denetimi hata bildirdiğinde hata durumunu (HealthStatus) bildirecek şekilde ayarlar. Hata durumu (varsayılan) null olarak ayarlanırsa HealthStatus.Unhealthy raporlanır. Bu aşırı yükleme, kitaplık yazarları için yararlı bir senaryodur; sağlık denetimi uygulaması ayarı kabul ederse, sağlık denetimi hatası durumunda kitaplık tarafından belirtilen hata durumunun uygulama tarafından zorunlu kılındığı bir durumdur.

Etiketler, sistem durumu denetimlerini filtrelemek için kullanılabilir (Sistem durumu denetimlerini filtrele bölümünde daha ayrıntılı olarak açıklanmıştır).

services.AddHealthChecks()
    .AddCheck<ExampleHealthCheck>(
        "example_health_check",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "example" });

AddCheck bir lambda işlevini de yürütebilir. Aşağıdaki örnekte, sistem durumu denetimi adı olarak Example belirtilir ve denetim her zaman iyi durumda bir durum döndürür:

services.AddHealthChecks()
    .AddCheck("Example", () =>
        HealthCheckResult.Healthy("Example is OK!"), tags: new[] { "example" });

Argümanları bir sağlık kontrolü uygulamasına geçirmek için AddTypeActivatedCheck çağırın. Aşağıdaki örnekte, TestHealthCheckWithArgs çağrıldığında CheckHealthAsync kullanılmak üzere bir tamsayı ve dize kabul eder:

private class TestHealthCheckWithArgs : IHealthCheck
{
    public TestHealthCheckWithArgs(int i, string s)
    {
        I = i;
        S = s;
    }

    public int I { get; set; }

    public string S { get; set; }

    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, 
        CancellationToken cancellationToken = default)
    {
        ...
    }
}

TestHealthCheckWithArgs, uygulamaya iletilen tamsayı ve dize ile AddTypeActivatedCheck çağrılarak kaydedilir.

services.AddHealthChecks()
    .AddTypeActivatedCheck<TestHealthCheckWithArgs>(
        "test", 
        failureStatus: HealthStatus.Degraded, 
        tags: new[] { "example" }, 
        args: new object[] { 5, "string" });

Sağlık Kontrolleri Yönlendirmesini Kullanma

Startup.Configure içinde, uç nokta URL'si veya göreli yolu ile uç nokta oluşturucusunda MapHealthChecks çağırın.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
});

Konağı gerektir

Sistem durumu denetimi uç noktası için bir veya daha fazla izin verilen konak belirtmek için çağrısı RequireHost yapın. Hostlar punycode yerine Unicode olmalıdır ve bir port içerebilir. Koleksiyon sağlanmazsa, herhangi bir konak kabul edilir.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health").RequireHost("www.contoso.com:5001");
});

Daha fazla bilgi için Bağlantı noktasına göre filtreleme bölümüne bakın.

Yetkilendirme gerektir

RequireAuthorization öğesini durum denetimi istek uç noktasında Yetkilendirme Ara Yazılımını çalıştırmak için çağırın. Aşırı RequireAuthorization yükleme bir veya daha fazla yetkilendirme ilkesi kabul eder. İlke sağlanmazsa, varsayılan yetkilendirme ilkesi kullanılır.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health").RequireAuthorization();
});

Kaynaklar Arası İstekleri (CORS) etkinleştirme

Sistem durumu denetimlerini tarayıcıda el ile çalıştırmak yaygın bir kullanım senaryosu olmasa da, CORS Ara Yazılımı sistem durumu denetimleri uç noktalarına çağrılarak RequireCors etkinleştirilebilir. Aşırı RequireCors yükleme, CORS ilke oluşturucu temsilcisini (CorsPolicyBuilder) veya ilke adını kabul eder. İlke sağlanmazsa, varsayılan CORS ilkesi kullanılır. Daha fazla bilgi için ASP.NET Core'da Kaynaklar Arası İstekler (CORS) Etkinleştirme başlıklı sayfaya bakın.

Sağlık kontrolü seçenekleri

HealthCheckOptions sistem durumu denetimi davranışını özelleştirme fırsatı sağlar:

Sağlık kontrollerini filtrele

Varsayılan olarak, Sistem Durumu Denetimleri Ara Yazılımı tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için seçeneğine Predicate boole döndüren bir işlev sağlayın. Aşağıdaki örnekte, sistem durumu denetimi işlevin Bar koşullu deyiminde etiketine (bar_tag) göre filtrelenmiştir; burada true yalnızca sistem durumu denetiminin Tags özelliği veya foo_tagile eşleşirse baz_tag döndürülür:

Startup.ConfigureServices içinde:

services.AddHealthChecks()
    .AddCheck("Foo", () =>
        HealthCheckResult.Healthy("Foo is OK!"), tags: new[] { "foo_tag" })
    .AddCheck("Bar", () =>
        HealthCheckResult.Unhealthy("Bar is unhealthy!"), tags: new[] { "bar_tag" })
    .AddCheck("Baz", () =>
        HealthCheckResult.Healthy("Baz is OK!"), tags: new[] { "baz_tag" });

Startup.Configure içinde, Predicate 'Bar' sistem durumu denetimini filtreler. Yalnızca Foo ve Baz yürütülür:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        Predicate = (check) => check.Tags.Contains("foo_tag") ||
            check.Tags.Contains("baz_tag")
    });
});

HTTP durum kodunu özelleştirme

HTTP durum kodlarına sağlık durumunun eşlemeyi özelleştirmek için ResultStatusCodes kullanın. Aşağıdaki StatusCodes atamalar ara yazılım tarafından kullanılan varsayılan değerlerdir. Durum kodu değerlerini gereksinimlerinizi karşılayacak şekilde değiştirin.

Startup.Configure içinde:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResultStatusCodes =
        {
            [HealthStatus.Healthy] = StatusCodes.Status200OK,
            [HealthStatus.Degraded] = StatusCodes.Status200OK,
            [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
        }
    });
});

Önbellek üst bilgilerini gizleme

AllowCachingResponses Durum Denetimleri Ara Yazılımının yanıt önbelleğe almayı önlemek için yoklama yanıtına HTTP üst bilgileri ekleyip eklemediğini denetler. Değer false (varsayılan) ise, ara yazılım, Cache-Control, Expires ve Pragma üst bilgilerini ayarlar veya geçersiz kılarak yanıt önbelleğe almayı önler. Değer true ise, ara yazılım yanıtın önbellek başlıklarını değiştirmez.

Startup.Configure içinde:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        AllowCachingResponses = true
    });
});

Çıktıyı özelleştirme

Startup.Configure içinde, HealthCheckOptions.ResponseWriter seçeneğini yanıtı yazmak için bir temsilci olarak ayarlayın.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResponseWriter = WriteResponse
    });
});

Varsayılan temsilci, dize değeriyle en düşük düz metin yanıtını HealthReport.Statusyazar. Aşağıdaki özel temsilciler özel bir JSON yanıtı verir.

Örnek uygulamadaki ilk örnekte nasıl kullanılacağı System.Text.Jsongösterilmektedir:

private static Task WriteResponse(HttpContext context, HealthReport result)
{
    context.Response.ContentType = "application/json; charset=utf-8";

    var options = new JsonWriterOptions
    {
        Indented = true
    };

    using (var stream = new MemoryStream())
    {
        using (var writer = new Utf8JsonWriter(stream, options))
        {
            writer.WriteStartObject();
            writer.WriteString("status", result.Status.ToString());
            writer.WriteStartObject("results");
            foreach (var entry in result.Entries)
            {
                writer.WriteStartObject(entry.Key);
                writer.WriteString("status", entry.Value.Status.ToString());
                writer.WriteString("description", entry.Value.Description);
                writer.WriteStartObject("data");
                foreach (var item in entry.Value.Data)
                {
                    writer.WritePropertyName(item.Key);
                    JsonSerializer.Serialize(
                        writer, item.Value, item.Value?.GetType() ??
                        typeof(object));
                }
                writer.WriteEndObject();
                writer.WriteEndObject();
            }
            writer.WriteEndObject();
            writer.WriteEndObject();
        }

        var json = Encoding.UTF8.GetString(stream.ToArray());

        return context.Response.WriteAsync(json);
    }
}

İkinci örnekte Newtonsoft.Json dosyasının nasıl kullanılacağı gösterilmektedir:

private static Task WriteResponse(HttpContext context, HealthReport result)
{
    context.Response.ContentType = "application/json";

    var json = new JObject(
        new JProperty("status", result.Status.ToString()),
        new JProperty("results", new JObject(result.Entries.Select(pair =>
            new JProperty(pair.Key, new JObject(
                new JProperty("status", pair.Value.Status.ToString()),
                new JProperty("description", pair.Value.Description),
                new JProperty("data", new JObject(pair.Value.Data.Select(
                    p => new JProperty(p.Key, p.Value))))))))));

    return context.Response.WriteAsync(
        json.ToString(Formatting.Indented));
}

Örnek uygulamada, SYSTEM_TEXT_JSONön işleme yönergesiniCustomWriterStartup.cs açıklama satırı yaparak Newtonsoft.JsonWriteResponse.

Sistem durumu denetimleri API'si, karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz çünkü biçim, seçtiğiniz izleme sistemine özgüdür. Yukarıdaki örneklerde verilen yanıtı gerektiği gibi özelleştirin. JSON serileştirme hakkında daha fazla bilgi için, System.Text.Json konusuna bakın.

Veritabanı yoklaması

Sistem durumu denetimi, veritabanının normal yanıt verdiğini belirtmek için boole testi olarak çalıştırılacak bir veritabanı sorgusu belirtebilir.

Örnek uygulama, SQL Server veritabanında sistem durumu denetimi çalıştırmak için ASP.NET Core uygulamaları için bir sistem durumu denetimi kitaplığı kullanır AspNetCore.Diagnostics.HealthChecks. AspNetCore.Diagnostics.HealthChecks veritabanı bağlantısının iyi durumda olduğunu onaylamak için veritabanına karşı bir SELECT 1 sorgu yürütür.

Warning

Bir sorguyla veritabanı bağlantısını denetlerken, hızlı bir şekilde döndüren bir sorgu seçin. Sorgu yaklaşımı veritabanını aşırı yükleme ve performansını düşürme riskini çalıştırır. Çoğu durumda test sorgusu çalıştırmak gerekli değildir. Yalnızca veritabanıyla başarılı bir bağlantı oluşturmak yeterlidir. Sorgu çalıştırmayı gerekli bulursanız, gibi SELECT 1basit bir SELECT sorgusu seçin.

Bir paket referansı AspNetCore.HealthChecks.SqlServer ekleyin.

Örnek uygulamanın appsettings.json dosyasında geçerli bir veritabanı bağlantı dizesi sağlayın. Uygulama adlı HealthCheckSamplebir SQL Server veritabanı kullanır:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=HealthCheckSample;Trusted_Connection=True;MultipleActiveResultSets=true;ConnectRetryCount=0"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "Console": {
      "IncludeScopes": "true"
    }
  },
  "AllowedHosts": "*"
}

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. Örnek uygulama, veritabanının bağlantı dizesiyle (AddSqlServer) DbHealthStartup.cs yöntemini çağırır.

services.AddHealthChecks()
    .AddSqlServer(Configuration["ConnectionStrings:DefaultConnection"]);

MapHealthChecks fonksiyonunu Startup.Configure içinde çağırarak bir sistem sağlığı denetimi uç noktası oluşturulur.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
}

Örnek uygulamayı kullanarak veritabanı yoklaması senaryosunu çalıştırmak için, projenin klasöründeki komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario db

Note

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Entity Framework Core DbContext araştırması

Denetim, uygulamanın DbContextEF Core için yapılandırılan veritabanıyla iletişim kurabildiğini DbContext onaylar. Aşağıdaki uygulamalarda DbContext denetimi desteklenir:

için bir sağlık kontrolü kaydeder. Yöntemine DbContext olarak TContext sağlanır. Hata durumunu, etiketleri ve özel test sorgusunu yapılandırmak için bir overload işlevi kullanılabilir.

Varsayılan olarak:

  • DbContextHealthCheck, EF Core'nin CanConnectAsync yöntemini çağırır. Yöntem aşırı yüklemelerini kullanarak AddDbContextCheck sistem durumu denetlenirken çalıştırılacak işlemi özelleştirebilirsiniz.
  • Sağlık durumu kontrolünün adı, TContext türünün adıdır.

Örnek uygulamada, AppDbContext, AddDbContextCheck'e sağlanır ve Startup.ConfigureServices içinde bir hizmet olarak DbContextHealthStartup.cs kaydedilir:

services.AddHealthChecks()
    .AddDbContextCheck<AppDbContext>();

services.AddDbContext<AppDbContext>(options =>
{
    options.UseSqlServer(
        Configuration["ConnectionStrings:DefaultConnection"]);
});

MapHealthChecks fonksiyonunu Startup.Configure içinde çağırarak bir sistem sağlığı denetimi uç noktası oluşturulur.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health");
}

Örnek uygulamayı kullanarak araştırma senaryosunu DbContext çalıştırmak için, bağlantı dizesi tarafından belirtilen veritabanının SQL Server örneğinde mevcut olmadığını onaylayın. Veritabanı varsa silin.

Aşağıdaki komutu projenin klasörü içinde komut satırında yürütün:

dotnet run --scenario dbcontext

Uygulama çalıştırıldıktan sonra tarayıcıda /health uç noktasına istekte bulunarak sağlık durumunu denetleyin. Veritabanı AppDbContext mevcut olmadığından, uygulama aşağıdaki yanıtı sağlar:

Unhealthy

Veritabanını oluşturmak için örnek uygulamayı tetikleyin. Bir talepte bulunmak için /createdatabase adresini kullanın. Uygulama yanıt verir:

Creating the database...
Done!
Navigate to /health to see the health status.

/health endpointine bir istekte bulunun. Veritabanı ve bağlam mevcut olduğundan uygulama şunları yanıtlar:

Healthy

Veritabanını silmek için örnek uygulamayı tetikleyin. Bir talepte bulunmak için /deletedatabase adresini kullanın. Uygulama yanıt verir:

Deleting the database...
Done!
Navigate to /health to see the health status.

/health endpointine bir istekte bulunun. Uygulama sağlıksız bir yanıt verir.

Unhealthy

Ayrı hazırlık ve canlılık yoklamaları

Bazı barındırma senaryolarında, iki uygulama durumunu ayırt etmek için bir çift sistem durumu denetimi kullanılır:

  • Hazır olma, uygulamanın normal çalışıp çalışmadığını ancak istekleri almaya hazır olmadığını gösterir.
  • Çalışırlık durumu, bir uygulamanın kapatılıp kapatılmadığını ve yeniden başlatılması gerekip gerekmediğini belirtir.

Aşağıdaki örneği göz önünde bulundurun: Bir uygulamanın istekleri işlemeye hazır olması için büyük bir yapılandırma dosyasını indirmesi gerekir. İlk indirme başarısız olursa uygulamanın yeniden başlatılmasını istemiyoruz çünkü uygulama dosyayı birkaç kez indirmeyi yeniden deneyebilir. İşlemin canlılığını açıklamak için bir canlılık probu kullanırız, başka hiçbir denetim çalıştırılmaz. Yapılandırma dosyası indirme başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyoruz. Başarılı indirme gerçekleşene ve uygulama istekleri almaya hazır olana kadar, bir hazır olma kontrolü kullanarak "hazır değil" durumunu belirtiriz.

Örnek uygulama, Barındırılan Hizmette uzun süre çalışan başlangıç görevinin tamamlanmasını raporlamak için bir sistem durumu denetimi içerir. , StartupHostedServiceHealthCheck barındırılan hizmetin uzun süre çalışan görevi tamamlandığında ayarlayabildiği StartupTaskCompleted bir özelliğini truekullanıma sunar (StartupHostedServiceHealthCheck.cs):

public class StartupHostedServiceHealthCheck : IHealthCheck
{
    private volatile bool _startupTaskCompleted = false;

    public string Name => "slow_dependency_check";

    public bool StartupTaskCompleted
    {
        get => _startupTaskCompleted;
        set => _startupTaskCompleted = value;
    }

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        if (StartupTaskCompleted)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("The startup task is finished."));
        }

        return Task.FromResult(
            HealthCheckResult.Unhealthy("The startup task is still running."));
    }
}

Uzun süre çalışan arka plan görevi, Barındırılan Hizmet (Services/StartupHostedService ) tarafından başlatılır. Görevin sonunda StartupHostedServiceHealthCheck.StartupTaskCompleted, true olarak ayarlanır.

public class StartupHostedService : IHostedService, IDisposable
{
    private readonly int _delaySeconds = 15;
    private readonly ILogger _logger;
    private readonly StartupHostedServiceHealthCheck _startupHostedServiceHealthCheck;

    public StartupHostedService(ILogger<StartupHostedService> logger,
        StartupHostedServiceHealthCheck startupHostedServiceHealthCheck)
    {
        _logger = logger;
        _startupHostedServiceHealthCheck = startupHostedServiceHealthCheck;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Startup Background Service is starting.");

        // Simulate the effect of a long-running startup task.
        Task.Run(async () =>
        {
            await Task.Delay(_delaySeconds * 1000);

            _startupHostedServiceHealthCheck.StartupTaskCompleted = true;

            _logger.LogInformation("Startup Background Service has started.");
        });

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Startup Background Service is stopping.");

        return Task.CompletedTask;
    }

    public void Dispose()
    {
    }
}

Sistem durumu denetimi, barındırılan hizmetle birlikte AddCheckStartup.ConfigureServices ile kaydedilir. Barındırılan hizmet, sağlık kontrolünde özelliği ayarlamak zorunda olduğundan, sağlık kontrolü de hizmet kapsayıcısında (LivenessProbeStartup.cs) kayıtlıdır.

services.AddHostedService<StartupHostedService>();
services.AddSingleton<StartupHostedServiceHealthCheck>();

services.AddHealthChecks()
    .AddCheck<StartupHostedServiceHealthCheck>(
        "hosted_service_startup",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "ready" });

services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.FromSeconds(2);
    options.Predicate = (check) => check.Tags.Contains("ready");
});

services.AddSingleton<IHealthCheckPublisher, ReadinessPublisher>();

MapHealthChecks Startup.Configure içinde çağrılarak bir sağlık kontrolü uç noktası oluşturulur. Örnek uygulamada sistem durumu denetimi uç noktaları şu konumda oluşturulur:

  • /health/ready hazır olma denetimi için. Hazır olma denetimi, durum denetimlerini ready etiketli sağlık denetimine filtreler.
  • /health/live canlılık kontrolü için. Canlılık kontrolü, StartupHostedServiceHealthCheckfalse içinde geri döndürerek filtreler (daha fazla bilgi için bkz. HealthCheckOptions.Predicate)

Aşağıdaki örnek kodda:

  • Hazır olma denetimi , 'hazır' etiketiyle tüm kayıtlı denetimleri kullanır.
  • tüm Predicate denetimleri dışlar ve 200-Tamam döndürür.
app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions()
    {
        Predicate = (check) => check.Tags.Contains("ready"),
    });

    endpoints.MapHealthChecks("/health/live", new HealthCheckOptions()
    {
        Predicate = (_) => false
    });
}

Hazırlık/canlılık yapılandırma senaryosunu örnek uygulamayı kullanarak çalıştırmak için, projenin klasöründeki komut kabuğunda aşağıdaki komutu yürütür:

dotnet run --scenario liveness

Tarayıcıda, 15 saniye geçene kadar /health/ready sayfasını birkaç kez ziyaret edin. İlk 15 saniye için sağlık kontrolü raporları Unhealthy. 15 saniye sonra, uç nokta, barındırılan hizmet tarafından uzun süre çalışan bir görevin tamamlandığını yansıtan değeri Healthy olarak raporlar.

Bu örnek ayrıca iki saniyelik bir gecikmeyle ilk hazırlık kontrolünü gerçekleştiren bir Sağlık Kontrol Yayımlayıcı (IHealthCheckPublisher uygulaması) oluşturur. Daha fazla bilgi için Sağlık Kontrolü Yayımcısı bölümüne bakın.

Kubernetes örneği

Ayrı hazır olma ve canlılık denetimleri kullanmak Kubernetes gibi bir ortamda kullanışlıdır. Kubernetes'te, temel alınan veritabanı kullanılabilirliği testi gibi istekleri kabul etmeden önce zaman alan başlangıç çalışmalarını çalıştırmak için bir uygulama gerekebilir. Ayrı denetimler kullanmak, düzenleyicinin uygulamanın çalışıp çalışmadığını ancak henüz hazır olup olmadığını veya uygulamanın başlatılamadığını ayırt etmesini sağlar. Kubernetes'teki hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerindeki Canlılık ve Hazırlık Yoklamalarını Yapılandırma bölümüne bakın.

Aşağıdaki örnekte Kubernetes hazır olma yoklaması yapılandırması gösterilmektedir:

spec:
  template:
  spec:
    readinessProbe:
      # an http probe
      httpGet:
        path: /health/ready
        port: 80
      # length of time to wait for a pod to initialize
      # after pod startup, before applying health checking
      initialDelaySeconds: 30
      timeoutSeconds: 1
    ports:
      - containerPort: 80

Özel yanıt yazıcısı ile ölçüm tabanlı yoklama

Örnek uygulama, özel yanıt yazıcısı ile bir bellek durumu denetimi gösterir.

MemoryHealthCheck uygulama belirli bir bellek eşiğinden (örnek uygulamada 1 GB) daha fazla kullanıyorsa düzeyi düşürülmüş durumu bildirir. , HealthCheckResult uygulama için Çöp Toplayıcı (GC) bilgilerini içerir (MemoryHealthCheck.cs):

public class MemoryHealthCheck : IHealthCheck
{
    private readonly IOptionsMonitor<MemoryCheckOptions> _options;

    public MemoryHealthCheck(IOptionsMonitor<MemoryCheckOptions> options)
    {
        _options = options;
    }

    public string Name => "memory_check";

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,
        CancellationToken cancellationToken = default(CancellationToken))
    {
        var options = _options.Get(context.Registration.Name);

        // Include GC information in the reported diagnostics.
        var allocated = GC.GetTotalMemory(forceFullCollection: false);
        var data = new Dictionary<string, object>()
        {
            { "AllocatedBytes", allocated },
            { "Gen0Collections", GC.CollectionCount(0) },
            { "Gen1Collections", GC.CollectionCount(1) },
            { "Gen2Collections", GC.CollectionCount(2) },
        };
        var status = (allocated < options.Threshold) ?
            HealthStatus.Healthy : context.Registration.FailureStatus;

        return Task.FromResult(new HealthCheckResult(
            status,
            description: "Reports degraded status if allocated bytes " +
                $">= {options.Threshold} bytes.",
            exception: null,
            data: data));
    }
}

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. Sağlık kontrolünü AddCheck'ye geçirerek etkinleştirmek yerine, MemoryHealthCheck bir hizmet olarak kaydedilir. Tüm IHealthCheck kayıtlı hizmetler sistem durumu kontrol hizmetleri ve ara yazılım tarafından kullanılabilir. Sistem durumu denetimi hizmetlerini Singleton hizmetler olarak kaydetmenizi öneririz.

Örnek uygulamanın CustomWriterStartup.cs içinde:

services.AddHealthChecks()
    .AddMemoryHealthCheck("memory");

MapHealthChecks Startup.Configure içinde çağrılarak bir sağlık kontrolü uç noktası oluşturulur. WriteResponse özelliğine, sistem sağlığı kontrolü yürütüldüğünde özel bir JSON yanıtı vermesi için bir temsilci sağlanırResponseWriter.

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResponseWriter = WriteResponse
    });
}

Temsilci, WriteResponse öğesini CompositeHealthCheckResult bir JSON nesnesine biçimlendirip sistem durumu denetimi yanıtı için JSON çıkışı verir. Daha fazla bilgi için Çıkışı özelleştirme bölümüne bakın.

Örnek uygulamayı kullanarak ölçüm tabanlı araştırmayı özel yanıt yazıcı çıkışıyla çalıştırmak için, projenin klasöründen bir komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario writer

Note

AspNetCore.Diagnostics.HealthChecks disk depolama ve maksimum değer canlılık denetimleri dahil olmak üzere ölçüm tabanlı sistem durumu denetimi senaryolarını içerir.

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Bağlantı noktasına göre filtrele

RequireHost, bir bağlantı noktası belirten bir URL deseniyle MapHealthChecks üzerinde çağırarak sistem durumu denetimi isteklerini belirtilen bağlantı noktasına kısıtlayın. Bu yaklaşım genellikle izleme hizmetleri için bir bağlantı noktasını kullanıma sunma amacıyla kapsayıcı ortamında kullanılır.

Örnek uygulama, Ortam Değişkeni Yapılandırma Sağlayıcısı'nı kullanarak bağlantı noktasını yapılandırıyor. Bağlantı noktası dosyasında ayarlanır launchSettings.json ve bir ortam değişkeni aracılığıyla yapılandırma sağlayıcısına geçirilir. Ayrıca sunucuyu yönetim bağlantı noktasındaki istekleri dinleyecek şekilde yapılandırmanız gerekir.

Yönetim bağlantı noktası yapılandırmasını göstermek üzere örnek uygulamayı kullanmak için dosyayı bir launchSettings.json klasörde oluşturunProperties.

Örnek uygulamadaki aşağıdaki Properties/launchSettings.json dosya, örnek uygulamanın proje dosyalarına dahil değildir ve el ile oluşturulmalıdır:

{
  "profiles": {
    "SampleApp": {
      "commandName": "Project",
      "commandLineArgs": "",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "http://localhost:5000/;http://localhost:5001/",
        "ASPNETCORE_MANAGEMENTPORT": "5001"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

Sağlık denetimi hizmetlerini AddHealthChecks içinde Startup.ConfigureServices kaydedin. MapHealthChecks içinde, Startup.Configure arayarak bir sağlık denetimi uç noktası oluşturun.

Örnek uygulamada, RequireHost üzerinde Startup.Configure çağrısı, yapılandırmadan yönetim bağlantı noktasını belirtir:

endpoints.MapHealthChecks("/health")
    .RequireHost($"*:{Configuration["ManagementPort"]}");

Örnek uygulamada uç noktalar Startup.Configure içinde oluşturulur. Aşağıdaki örnek kodda:

  • Hazır olma denetimi , 'hazır' etiketiyle tüm kayıtlı denetimleri kullanır.
  • tüm Predicate denetimleri dışlar ve 200-Tamam döndürür.
app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions()
    {
        Predicate = (check) => check.Tags.Contains("ready"),
    });

    endpoints.MapHealthChecks("/health/live", new HealthCheckOptions()
    {
        Predicate = (_) => false
    });
}

Note

Örnek uygulamada launchSettings.json dosyasını oluşturmaktan kaçınmak için yönetim bağlantı noktasını kodda açıkça ayarlayabilirsiniz. Program.cs öğesinin oluşturulduğu yerde, HostBuilder öğesine bir çağrı yapmak için ListenAnyIP ekleyin ve uygulamanın yönetim portu uç noktasını sağlayın. Configure içindeki ManagementPortStartup.cs'de, yönetim bağlantı noktasını RequireHost ile belirtin.

Program.cs:

return new HostBuilder()
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseKestrel()
            .ConfigureKestrel(serverOptions =>
            {
                serverOptions.ListenAnyIP(5001);
            })
            .UseStartup(startupType);
    })
    .Build();

ManagementPortStartup.cs:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHealthChecks("/health").RequireHost("*:5001");
});

Örnek uygulamayı kullanarak yönetim bağlantı noktası yapılandırma senaryosunu çalıştırmak için, projenin klasöründen bir komut kabuğunda aşağıdaki komutu yürütebilirsiniz:

dotnet run --scenario port

Sağlık denetimi kitaplığı dağıtma

Bir sağlık kontrolünü (health check) kitaplık olarak dağıtmak için:

  1. IHealthCheck arabirimini bağımsız bir sınıf olarak uygulayan bir sağlık denetimi yazın. sınıfı, yapılandırma verilerine erişmek için bağımlılık ekleme (DI), tür etkinleştirme ve adlandırılmış seçenekleri kullanabilir.

    sağlık kontrolü mantığında CheckHealthAsync:

    • data1 ve data2, yoklamanın sağlık kontrolü mantığını çalıştırmak için kullanılan yöntemdir.
    • AccessViolationException işlenir.

    AccessViolationException bir oluştuğunda, FailureStatus ile birlikte HealthCheckResult döndürülür ve bu, kullanıcıların sağlık kontrolü hata durumunu yapılandırmasına olanak tanır.

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Extensions.Diagnostics.HealthChecks;
    
    namespace SampleApp
    {
        public class ExampleHealthCheck : IHealthCheck
        {
            private readonly string _data1;
            private readonly int? _data2;
    
            public ExampleHealthCheck(string data1, int? data2)
            {
                _data1 = data1 ?? throw new ArgumentNullException(nameof(data1));
                _data2 = data2 ?? throw new ArgumentNullException(nameof(data2));
            }
    
            public async Task<HealthCheckResult> CheckHealthAsync(
                HealthCheckContext context, CancellationToken cancellationToken)
            {
                try
                {
                    return HealthCheckResult.Healthy();
                }
                catch (AccessViolationException ex)
                {
                    return new HealthCheckResult(
                        context.Registration.FailureStatus,
                        description: "An access violation occurred during the check.",
                        exception: ex,
                        data: null);
                }
            }
        }
    }
    
  2. Tüketici uygulamanın Startup.Configure yönteminde çağıracağı parametrelerle bir uzatma yöntemi yazın. Aşağıdaki örnekte, aşağıdaki sağlık kontrolü yöntemi imzasını varsayın:

    ExampleHealthCheck(string, string, int )
    

    Önceki imza, ExampleHealthCheck öğesinin sağlık kontrolü sonda mantığını işlemek için ek veri gerektirdiğini gösterir. Veriler, sağlık durumu denetiminin bir uzantı yöntemiyle kaydedildiği zaman sağlık durumu denetimi örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte, çağıran kişi isteğe bağlı bir parametre belirtir.

    • sağlık kontrolü adı (name) null ise example_health_checkkullanılır.
    • sağlık kontrolü için dize veri noktası (data1).
    • sağlık kontrolü için tamsayı veri noktası data2. null ise 1kullanılır.
    • hata durumu (HealthStatus). Varsayılan değer: null. Eğer null olursa, HealthStatus.Unhealthy bir hata durumu için bildirilir.
    • etiketler (IEnumerable<string>)
    using System.Collections.Generic;
    using Microsoft.Extensions.Diagnostics.HealthChecks;
    
    public static class ExampleHealthCheckBuilderExtensions
    {
        const string DefaultName = "example_health_check";
    
        public static IHealthChecksBuilder AddExampleHealthCheck(
            this IHealthChecksBuilder builder,
            string name = default,
            string data1,
            int data2 = 1,
            HealthStatus? failureStatus = default,
            IEnumerable<string> tags = default)
        {
            return builder.Add(new HealthCheckRegistration(
                name ?? DefaultName,
                sp => new ExampleHealthCheck(data1, data2),
                failureStatus,
                tags));
        }
    }
    

Sağlık Kontrolü Yayınlayıcısı

Hizmet kapsayıcısına bir IHealthCheckPublisher eklendiğinde, sistem durumu denetimi sistemi düzenli aralıklarla sistem durumu denetimlerinizi yürütür ve sonuçla birlikte PublishAsync çağrısı yapar. Bu, her işlemin sistem durumunu belirlemek için izleme sistemini düzenli aralıklarla çağırmasını bekleyen, anında iletme tabanlı sistem durumu izleme sistemi senaryosunda kullanışlıdır.

Arabirimin IHealthCheckPublisher tek bir yöntemi vardır:

Task PublishAsync(HealthReport report, CancellationToken cancellationToken);

HealthCheckPublisherOptions şunları ayarlamanıza izin verir:

  • Delay: IHealthCheckPublisher örnekleri çalıştırılmadan önce, uygulama başlatıldıktan sonra uygulanan başlangıç gecikmesi. Gecikme başlangıçta bir kez uygulanır ve sonraki yinelemeler için geçerli değildir. Varsayılan değer beş saniyedir.
  • Period: IHealthCheckPublisher yürütme süresi. Varsayılan değer 30 saniyedir.
  • Predicate: Predicatenull (varsayılan) ise, sistem durumu denetimi yayımcı hizmeti tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için denetim kümesini filtreleyen bir işlev sağlayın. Öngörü her periyot değerlendirilir.
  • Timeout: Tüm IHealthCheckPublisher örnekleri için sağlık kontrollerini yürütme zaman aşımı. Zaman aşımı olmadan yürütmek için `InfiniteTimeSpan` kullanın. Varsayılan değer 30 saniyedir.

Örnek uygulamada ReadinessPublisher bir IHealthCheckPublisher uygulamadır. Sağlık kontrolü durumu, her kontrol için şu günlük seviyesinde günlüğe kaydedilir:

public class ReadinessPublisher : IHealthCheckPublisher
{
    private readonly ILogger _logger;

    public ReadinessPublisher(ILogger<ReadinessPublisher> logger)
    {
        _logger = logger;
    }

    // The following example is for demonstration purposes only. Health Checks
    // Middleware already logs health checks results. A real-world readiness
    // check in a production app might perform a set of more expensive or
    // time-consuming checks to determine if other resources are responding
    // properly.
    public Task PublishAsync(HealthReport report,
        CancellationToken cancellationToken)
    {
        if (report.Status == HealthStatus.Healthy)
        {
            _logger.LogInformation("{Timestamp} Readiness Probe Status: {Result}",
                DateTime.UtcNow, report.Status);
        }
        else
        {
            _logger.LogError("{Timestamp} Readiness Probe Status: {Result}",
                DateTime.UtcNow, report.Status);
        }

        cancellationToken.ThrowIfCancellationRequested();

        return Task.CompletedTask;
    }
}

Örnek uygulamanın LivenessProbeStartup örneğinde, hazırlık denetiminin StartupHostedService iki saniyelik başlatma gecikmesi vardır ve denetimi 30 saniyede bir çalıştırır. IHealthCheckPublisher uygulamasını etkinleştirmek için örnek, ReadinessPublisher'i bağımlılık ekleme (DI) konteynerinde tek bir hizmet olarak kaydeder.

services.AddHostedService<StartupHostedService>();
services.AddSingleton<StartupHostedServiceHealthCheck>();

services.AddHealthChecks()
    .AddCheck<StartupHostedServiceHealthCheck>(
        "hosted_service_startup",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "ready" });

services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.FromSeconds(2);
    options.Predicate = (check) => check.Tags.Contains("ready");
});

services.AddSingleton<IHealthCheckPublisher, ReadinessPublisher>();

Note

AspNetCore.Diagnostics.HealthChecks Application Insights dahil olmak üzere çeşitli sistemler için yayımcılar içerir.

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

MapWhen ile sistem durumu denetimlerini kısıtlama

Sağlık kontrolü uç noktaları için istek işlem hattını koşullu olarak dallara ayırmak üzere MapWhen kullanın.

Aşağıdaki örnekte, bir GET isteği MapWhen uç noktasına alındığında, istek işlem hattını dallayarak Sağlık Kontrolleri Middleware'ini etkinleştirir api/HealthCheck.

app.MapWhen(
    context => context.Request.Method == HttpMethod.Get.Method && 
        context.Request.Path.StartsWith("/api/HealthCheck"),
    builder => builder.UseHealthChecks());

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});

Daha fazla bilgi için, bkz. ASP.NET Core Ara Yazılımı.

ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için Sistem Durumu Denetimleri Ara Yazılımı ve kitaplıklar sunar.

Uygulama tarafından sağlık kontrolleri HTTP uç noktaları olarak sağlanır. Sistem durumu denetimi uç noktaları çeşitli gerçek zamanlı izleme senaryoları için yapılandırılabilir:

  • Sistem durumu yoklamaları, bir uygulamanın durumunu denetlemek için kapsayıcı düzenleme sistemleri ve yük dengeleyiciler tarafından kullanılabilir. Örneğin, bir kapsayıcı düzenleyicisi, başarısız olan bir sağlık kontrolüne yanıt olarak aşamalı dağıtımı durdurabilir veya bir kapsayıcıyı yeniden başlatabilir. Yük dengeleyici, trafiği hatalı örnekten iyi durumdaki bir örneğe yönlendirerek iyi durumda olmayan bir uygulamaya tepki verebilir.
  • İyi durumda bellek, disk ve diğer fiziksel sunucu kaynaklarının kullanımı izlenebilir.
  • Sistem durumu denetimleri, kullanılabilirliği ve normal çalışma durumunu onaylamak için bir uygulamanın veritabanları ve dış hizmet uç noktaları gibi bağımlılıklarını test edebilir.

Sağlık kontrolleri, genellikle bir uygulamanın durumunu kontrol etmek için dış bir izleme hizmeti veya kapsayıcı düzenleyici ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce hangi izleme sisteminin kullanılacağına karar verin. İzleme sistemi, hangi tür sağlık kontrollerinin oluşturulacağını ve endpoint'lerin nasıl yapılandırılacağını belirler.

Temel sağlık denetimi

Birçok uygulama için, uygulamanın istekleri işlemek için kullanılabilirliğini (çalışırlık durumu) bildiren temel bir sağlık araştırması yapılandırması, uygulamanın durumunu keşfetmek için yeterlidir.

Temel yapılandırma, sağlık denetimi hizmetlerini kaydeder ve bir URL uç noktasında sağlık yanıtı ile yanıt vermek için Sağlık Denetimleri Ara yazılımını çağırır. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için özgül bir sağlık kontrolü kayıtlı değildir. Uygulama, sistem durumu uç noktası URL'sinde yanıt verebiliyorsa iyi durumda kabul edilir. Varsayılan yanıt yazarı istemciye düz metin yanıtı olarak yazar HealthStatus . HealthStatus, HealthStatus.Healthy, HealthStatus.Degraded veya HealthStatus.Unhealthy.

Sağlık denetimi hizmetlerini AddHealthChecks içinde Program.cs kaydedin. MapHealthChecks çağrısı yaparak bir sağlık kontrolü uç noktası oluşturun.

Aşağıdaki örnek /healthz konumunda bir sağlık denetimi uç noktası oluşturur:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHealthChecks();

var app = builder.Build();

app.MapHealthChecks("/healthz");

app.Run();

DockerHEALTHCHECK

Docker , temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu denetlemek için kullanılabilecek yerleşik HEALTHCHECK bir yönerge sunar:

HEALTHCHECK CMD curl --fail http://localhost:5000/healthz || exit

Yukarıdaki örnek, curl ile /healthz konumundaki sistem durumu denetimi uç noktasına HTTP isteğinde bulunmak için kullanır. curl .NET Linux kapsayıcı görüntülerine dahil değildir, ancak gerekli paketi Dockerfile dosyasına yükleyerek eklenebilir. Alpine Linux tabanlı görüntüleri kullanan kapsayıcılar, wget öğesi yerine curl öğesini kullanabilir.

Sağlık denetimleri oluşturma

Sağlık denetimleri IHealthCheck arabirimi uygulanarak oluşturulur. CheckHealthAsync yöntemi, sağlığı HealthCheckResult, Healthy veya Degraded olarak gösteren bir Unhealthy döndürür. Sonuç, yapılandırılabilir durum koduyla düz metin yanıtı olarak yazılır. Yapılandırma, Sistem durumu denetimi seçenekleri bölümünde açıklanmıştır. HealthCheckResult isteğe bağlı anahtar-değer çiftleri de döndürebilir.

Aşağıdaki örnekte sağlık kontrolünün yerleşimi gösterilmektedir.

public class SampleHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        var isHealthy = true;

        // ...

        if (isHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            new HealthCheckResult(
                context.Registration.FailureStatus, "An unhealthy result."));
    }
}

Sağlık kontrolünün mantığı CheckHealthAsync yöntemine yerleştirilir. Yukarıdaki örnek, isHealthytrueolarak bir kukla değişkeni ayarlar. Eğer isHealthy değeri false olarak ayarlanırsa, HealthCheckRegistration.FailureStatus durumu döndürülür.

Eğer CheckHealthAsync denetim sırasında bir özel durum fırlatırsa, HealthReportEntry değerine ayarlanmış HealthReportEntry.Status ile yeni bir FailureStatus döndürülür. Bu durum AddCheck tarafından tanımlanır (sistem durumu denetim hizmetlerini kaydetme bölümüne bakın) ve denetim hatasına neden olan iç özel durumu içerir. Description, özel durumun iletisi olarak ayarlanır.

Sağlık denetimi hizmetlerini kaydetme

Sağlık kontrolü hizmetini kaydetmek için AddCheck numarasını Program.cs arayın.

builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheck>("Sample");

AddCheck Aşağıdaki örnekte gösterilen aşırı yükleme, sistem durumu denetimi hata bildirdiğinde hata durumunu (HealthStatus) bildirecek şekilde ayarlar. Hata durumu (varsayılan) null olarak ayarlanırsa HealthStatus.Unhealthy raporlanır. Bu aşırı yükleme, kitaplık yazarları için yararlı bir senaryodur; sağlık denetimi uygulaması ayarı kabul ederse, sağlık denetimi hatası durumunda kitaplık tarafından belirtilen hata durumunun uygulama tarafından zorunlu kılındığı bir durumdur.

Etiketler , sistem durumu denetimlerini filtrelemek için kullanılabilir. Etiketler, Sistem durumu denetimlerini filtrele bölümünde açıklanmıştır.

builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheck>(
        "Sample",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "sample" });

AddCheck bir lambda işlevini de yürütebilir. Aşağıdaki örnekte, sağlık kontrolü her zaman sağlıklı bir sonuç döndürür.

builder.Services.AddHealthChecks()
    .AddCheck("Sample", () => HealthCheckResult.Healthy("A healthy result."));

Argümanları bir sağlık kontrolü uygulamasına geçirmek için AddTypeActivatedCheck çağırın. Aşağıdaki örnekte, türe dayalı sağlık kontrolü, oluşturucusunda bir tamsayı ve bir dize kabul eder.

public class SampleHealthCheckWithArgs : IHealthCheck
{
    private readonly int _arg1;
    private readonly string _arg2;

    public SampleHealthCheckWithArgs(int arg1, string arg2)
        => (_arg1, _arg2) = (arg1, arg2);

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        // ...

        return Task.FromResult(HealthCheckResult.Healthy("A healthy result."));
    }
}

Önceki sağlık kontrolünü kaydetmek için, bağımsız değişken olarak geçen tamsayı ve dize ile AddTypeActivatedCheck çağrısı yapın.

builder.Services.AddHealthChecks()
    .AddTypeActivatedCheck<SampleHealthCheckWithArgs>(
        "Sample",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "sample" },
        args: new object[] { 1, "Arg" });

Sağlık Kontrolleri Yönlendirmesini Kullanma

Program.cs içinde, uç nokta URL'si veya göreli yolu ile uç nokta oluşturucusunda MapHealthChecks çağırın.

app.MapHealthChecks("/healthz");

Konağı gerektir

Sistem durumu denetimi uç noktası için bir veya daha fazla izin verilen konak belirtmek için çağrısı RequireHost yapın. Hostlar punycode yerine Unicode olmalıdır ve bir port içerebilir. Koleksiyon sağlanmazsa, herhangi bir konak kabul edilir:

app.MapHealthChecks("/healthz")
    .RequireHost("www.contoso.com:5001");

Sistem durumu denetimi uç noktasının yanıt vermesini yalnızca belirli bir bağlantı noktasında sınırlamak için RequireHost çağrısında bir bağlantı noktası belirtin. Bu yaklaşım genellikle izleme hizmetleri için bir bağlantı noktasını kullanıma sunma amacıyla kapsayıcı ortamında kullanılır:

app.MapHealthChecks("/healthz")
    .RequireHost("*:5001");

Warning

Konak üst bilgisine dayanan API'ler, örneğin ve HttpRequest.Host, istemciler tarafından olası kimlik sahtekarlığına maruz kalabilir.

Host ve bağlantı noktası kimlik sahtekarlığını önlemek için aşağıdaki yaklaşımlardan birini kullanın:

Yetkisiz istemcilerin bağlantı noktası sahtekarlığına uğramasını önlemek için öğesini çağırın RequireAuthorization:

app.MapHealthChecks("/healthz")
    .RequireHost("*:5001")
    .RequireAuthorization();

Daha fazla bilgi için RequireHost ile yollarda konak eşleştirme bölümüne bakın.

Yetkilendirme gerektir

RequireAuthorization öğesini durum denetimi istek uç noktasında Yetkilendirme Ara Yazılımını çalıştırmak için çağırın. Aşırı RequireAuthorization yükleme bir veya daha fazla yetkilendirme ilkesi kabul eder. İlke sağlanmazsa, varsayılan yetkilendirme ilkesi kullanılır:

app.MapHealthChecks("/healthz")
    .RequireAuthorization();

Kaynaklar Arası İstekleri (CORS) etkinleştirme

Sistem durumu denetimlerini tarayıcıda el ile çalıştırmak yaygın bir senaryo olmasa da, CORS Ara Yazılımı sistem durumu denetimleri uç noktalarına çağrılarak RequireCors etkinleştirilebilir. Aşırı RequireCors yükleme bir CORS ilke oluşturucusu temsilcisini (CorsPolicyBuilder) veya bir ilke adını kabul eder. Daha fazla bilgi için ASP.NET Core'da Kaynaklar Arası İstekler (CORS) Etkinleştirme başlıklı sayfaya bakın.

Sağlık kontrolü seçenekleri

HealthCheckOptions sistem durumu denetimi davranışını özelleştirme fırsatı sağlar:

Sağlık kontrollerini filtrele

Varsayılan olarak, Sistem Durumu Denetimleri Ara Yazılımı tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için seçeneğine Predicate boole döndüren bir işlev sağlayın.

Aşağıdaki örnek, yalnızca sample etiketiyle işaretlenmiş sağlık kontrollerinin çalıştırılmasını sağlamak için bir filtre uygular.

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    Predicate = healthCheck => healthCheck.Tags.Contains("sample")
});

HTTP durum kodunu özelleştirme

HTTP durum kodlarına sağlık durumunun eşlemeyi özelleştirmek için ResultStatusCodes kullanın. Aşağıdaki StatusCodes atamalar ara yazılım tarafından kullanılan varsayılan değerlerdir. Durum kodu değerlerini gereksinimlerinizi karşılayacak şekilde değiştirin:

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    ResultStatusCodes =
    {
        [HealthStatus.Healthy] = StatusCodes.Status200OK,
        [HealthStatus.Degraded] = StatusCodes.Status200OK,
        [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
    }
});

Önbellek üst bilgilerini gizleme

AllowCachingResponses Durum Denetimleri Ara Yazılımının yanıt önbelleğe almayı önlemek için yoklama yanıtına HTTP üst bilgileri ekleyip eklemediğini denetler. Değer false (varsayılan) ise, ara yazılım, Cache-Control, Expires ve Pragma üst bilgilerini ayarlar veya geçersiz kılarak yanıt önbelleğe almayı önler. değeri ise trueara yazılım yanıtın önbellek üst bilgilerini değiştirmez:

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    AllowCachingResponses = true
});

Çıktıyı özelleştirme

Sistem durumu denetimleri raporunun çıktısını özelleştirmek için, yanıtı yazacak bir temsilci olarak HealthCheckOptions.ResponseWriter özelliğini ayarlayın.

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    ResponseWriter = WriteResponse
});

Varsayılan temsilci, dize değeriyle en düşük düz metin yanıtını HealthReport.Statusyazar. Aşağıdaki özel temsilci, System.Text.Json kullanarak özel bir JSON yanıtı çıktısı verir:

private static Task WriteResponse(HttpContext context, HealthReport healthReport)
{
    context.Response.ContentType = "application/json; charset=utf-8";

    var options = new JsonWriterOptions { Indented = true };

    using var memoryStream = new MemoryStream();
    using (var jsonWriter = new Utf8JsonWriter(memoryStream, options))
    {
        jsonWriter.WriteStartObject();
        jsonWriter.WriteString("status", healthReport.Status.ToString());
        jsonWriter.WriteStartObject("results");

        foreach (var healthReportEntry in healthReport.Entries)
        {
            jsonWriter.WriteStartObject(healthReportEntry.Key);
            jsonWriter.WriteString("status",
                healthReportEntry.Value.Status.ToString());
            jsonWriter.WriteString("description",
                healthReportEntry.Value.Description);
            jsonWriter.WriteStartObject("data");

            foreach (var item in healthReportEntry.Value.Data)
            {
                jsonWriter.WritePropertyName(item.Key);

                JsonSerializer.Serialize(jsonWriter, item.Value,
                    item.Value?.GetType() ?? typeof(object));
            }

            jsonWriter.WriteEndObject();
            jsonWriter.WriteEndObject();
        }

        jsonWriter.WriteEndObject();
        jsonWriter.WriteEndObject();
    }

    return context.Response.WriteAsync(
        Encoding.UTF8.GetString(memoryStream.ToArray()));
}

Sistem durumu denetimleri API'si, karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz çünkü biçim, seçtiğiniz izleme sistemine özgüdür. Yukarıdaki örneklerde verilen yanıtı gerektiği gibi özelleştirin. JSON serileştirme hakkında daha fazla bilgi için, System.Text.Json konusuna bakın.

Veritabanı yoklaması

Sistem durumu denetimi, veritabanının normal yanıt verdiğini belirtmek için boole testi olarak çalıştırılacak bir veritabanı sorgusu belirtebilir.

AspNetCore.Diagnostics.HealthChecks, ASP.NET Core uygulamaları için bir sistem durumu denetimi kitaplığı, SQL Server veritabanında çalışan bir sistem durumu denetimi içerir. AspNetCore.Diagnostics.HealthChecks veritabanı bağlantısının iyi durumda olduğunu onaylamak için veritabanına karşı bir SELECT 1 sorgu yürütür.

Warning

Bir sorguyla veritabanı bağlantısını denetlerken, hızlı bir şekilde döndüren bir sorgu seçin. Sorgu yaklaşımı veritabanını aşırı yükleme ve performansını düşürme riskini çalıştırır. Çoğu durumda test sorgusu çalıştırmak gerekli değildir. Yalnızca veritabanıyla başarılı bir bağlantı oluşturmak yeterlidir. Sorgu çalıştırmayı gerekli bulursanız, gibi SELECT 1basit bir SELECT sorgusu seçin.

Bu SQL Server sistem durumu denetimini kullanmak için NuGet paketine AspNetCore.HealthChecks.SqlServer bir paket başvurusu ekleyin. Aşağıdaki örnek SQL Server sistem durumu denetimini kaydeder:

builder.Services.AddHealthChecks()
    .AddSqlServer(
        builder.Configuration.GetConnectionString("DefaultConnection"));

Note

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Entity Framework Core DbContext araştırması

Denetim, uygulamanın DbContextEF Core için yapılandırılan veritabanıyla iletişim kurabildiğini DbContext onaylar. Aşağıdaki uygulamalarda DbContext denetimi desteklenir:

için bir sağlık kontrolü kaydeder. DbContext yönteme TContext olarak sağlanır. Hata durumunu, etiketleri ve özel test sorgusunu yapılandırmak için bir overload işlevi kullanılabilir.

Varsayılan olarak:

  • DbContextHealthCheck, EF Core'nin CanConnectAsync yöntemini çağırır. Yöntem aşırı yüklemelerini kullanarak AddDbContextCheck sistem durumu denetlenirken çalıştırılacak işlemi özelleştirebilirsiniz.
  • Sağlık durumu kontrolünün adı, TContext türünün adıdır.

Aşağıdaki örnek bir DbContext ve ilişkili bir DbContextHealthCheck kaydeder:

builder.Services.AddDbContext<SampleDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddHealthChecks()
    .AddDbContextCheck<SampleDbContext>();

Ayrı hazırlık ve canlılık yoklamaları

Bazı barındırma senaryolarında, iki uygulama durumunu ayırt etmek için bir çift sistem durumu denetimi kullanılır:

  • Hazır olma, uygulamanın normal çalışıp çalışmadığını ancak istekleri almaya hazır olmadığını gösterir.
  • Çalışırlık durumu, bir uygulamanın kapatılıp kapatılmadığını ve yeniden başlatılması gerekip gerekmediğini belirtir.

Aşağıdaki örneği göz önünde bulundurun: Bir uygulamanın istekleri işlemeye hazır olması için büyük bir yapılandırma dosyasını indirmesi gerekir. İlk indirme başarısız olursa uygulamanın yeniden başlatılmasını istemiyoruz çünkü uygulama dosyayı birkaç kez indirmeyi yeniden deneyebilir. İşlemin canlılığını açıklamak için bir canlılık probu kullanırız, başka hiçbir denetim çalıştırılmaz. Yapılandırma dosyası indirme başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyoruz. Başarılı indirme gerçekleşene ve uygulama istekleri almaya hazır olana kadar, bir hazır olma kontrolü kullanarak "hazır değil" durumunu belirtiriz.

Aşağıdaki arka plan görevi, yaklaşık 15 saniye süren bir başlangıç işleminin benzetimini yapar. İşlem tamamlandıktan sonra StartupHealthCheck.StartupCompleted görev özelliğini true olarak ayarlar:

public class StartupBackgroundService : BackgroundService
{
    private readonly StartupHealthCheck _healthCheck;

    public StartupBackgroundService(StartupHealthCheck healthCheck)
        => _healthCheck = healthCheck;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // Simulate the effect of a long-running task.
        await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken);

        _healthCheck.StartupCompleted = true;
    }
}

uzun süredir StartupHealthCheck çalışan başlangıç görevinin tamamlandığını bildirir ve arka plan hizmeti tarafından atanan StartupCompleted özelliğini kullanıma sunar:

public class StartupHealthCheck : IHealthCheck
{
    private volatile bool _isReady;

    public bool StartupCompleted
    {
        get => _isReady;
        set => _isReady = value;
    }

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        if (StartupCompleted)
        {
            return Task.FromResult(HealthCheckResult.Healthy("The startup task has completed."));
        }

        return Task.FromResult(HealthCheckResult.Unhealthy("That startup task is still running."));
    }
}

Sistem durumu denetimi, barındırılan hizmetle birlikte AddCheckProgram.cs ile kaydedilir. Barındırılan hizmetin sistem durumu denetiminde özelliğini ayarlaması gerektiğinden, sistem durumu denetimi de hizmet kapsayıcısında tekil olarak kaydedilir:

builder.Services.AddHostedService<StartupBackgroundService>();
builder.Services.AddSingleton<StartupHealthCheck>();

builder.Services.AddHealthChecks()
    .AddCheck<StartupHealthCheck>(
        "Startup",
        tags: new[] { "ready" });

İki farklı sağlık kontrolü uç noktası oluşturmak için, çağrısını iki kez yapın.

app.MapHealthChecks("/healthz/ready", new HealthCheckOptions
{
    Predicate = healthCheck => healthCheck.Tags.Contains("ready")
});

app.MapHealthChecks("/healthz/live", new HealthCheckOptions
{
    Predicate = _ => false
});

Yukarıdaki örnek aşağıdaki sistem durumu denetimi uç noktalarını oluşturur:

  • /healthz/ready hazır olma denetimi için. Hazır olma denetimi, ready ile etiketlenen sistem durumu kontrollerini filtreler.
  • /healthz/live canlılık kontrolü için. Canlılık denetimi, tüm sistem durumu denetimlerini false'u HealthCheckOptions.Predicate delegesinde döndürerek filtreler. Sistem durumu denetimlerini filtreleme hakkında daha fazla bilgi için bu makaledeki Sistem durumu denetimlerini filtreleme bölümüne bakın.

Başlangıç görevi tamamlanmadan önce uç /healthz/ready nokta bir Unhealthy durum bildirir. Başlangıç görevi tamamlandıktan sonra bu uç nokta bir Healthy durum bildirir. Uç /healthz/live tüm kontrolleri devre dışı bırakır ve tüm istekler için bir Healthy durumu raporlar.

Kubernetes örneği

Ayrı hazır olma ve canlılık denetimleri kullanmak Kubernetes gibi bir ortamda kullanışlıdır. Kubernetes'te, temel alınan veritabanı kullanılabilirliği testi gibi istekleri kabul etmeden önce zaman alan başlangıç çalışmalarını çalıştırmak için bir uygulama gerekebilir. Ayrı denetimler kullanmak, düzenleyicinin uygulamanın çalışıp çalışmadığını ancak henüz hazır olup olmadığını veya uygulamanın başlatılamadığını ayırt etmesini sağlar. Kubernetes'teki hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerindeki Canlılık ve Hazırlık Yoklamalarını Yapılandırma bölümüne bakın.

Aşağıdaki örnekte Kubernetes hazır olma yoklaması yapılandırması gösterilmektedir:

spec:
  template:
  spec:
    readinessProbe:
      # an http probe
      httpGet:
        path: /healthz/ready
        port: 80
      # length of time to wait for a pod to initialize
      # after pod startup, before applying health checking
      initialDelaySeconds: 30
      timeoutSeconds: 1
    ports:
      - containerPort: 80

Sağlık denetimi kitaplığı dağıtma

Bir sağlık kontrolünü (health check) kitaplık olarak dağıtmak için:

  1. IHealthCheck arabirimini bağımsız bir sınıf olarak uygulayan bir sağlık denetimi yazın. sınıfı, yapılandırma verilerine erişmek için bağımlılık ekleme (DI), tür etkinleştirme ve adlandırılmış seçenekleri kullanabilir.

  2. Tüketici uygulamanın Program.cs yönteminde çağıracağı parametrelerle bir uzatma yöntemi yazın. Aşağıdaki örnek sağlık kontrolünü göz önünde bulundurun; bu kontrol, arg1 ve arg2 öğelerini oluşturucu parametreleri olarak kabul etmektedir.

    public SampleHealthCheckWithArgs(int arg1, string arg2)
        => (_arg1, _arg2) = (arg1, arg2);
    

    Yukarıdaki imza, sağlık kontrolünün yoklama mantığını işlemek için özel verilere ihtiyaç duyduğunu gösterir. Veriler, sağlık durumu denetiminin bir uzantı yöntemiyle kaydedildiği zaman sağlık durumu denetimi örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte, çağıran şunları belirtir:

    • arg1: Sağlık durumu denetimi için bir tamsayı veri noktası.
    • arg2: Sistem durumu denetimi için bir dize bağımsız değişkeni.
    • name: İsteğe bağlı bir sağlık kontrolü adı. ise null, varsayılan bir değer kullanılır.
    • failureStatus: Hata durumu için bildirilen isteğe bağlı bir HealthStatus. null ise HealthStatus.Unhealthykullanılır.
    • tags: İsteğe bağlı IEnumerable<string> bir etiket koleksiyonu.
    public static class SampleHealthCheckBuilderExtensions
    {
        private const string DefaultName = "Sample";
    
        public static IHealthChecksBuilder AddSampleHealthCheck(
            this IHealthChecksBuilder healthChecksBuilder,
            int arg1,
            string arg2,
            string? name = null,
            HealthStatus? failureStatus = null,
            IEnumerable<string>? tags = default)
        {
            return healthChecksBuilder.Add(
                new HealthCheckRegistration(
                    name ?? DefaultName,
                    _ => new SampleHealthCheckWithArgs(arg1, arg2),
                    failureStatus,
                    tags));
        }
    }
    

Sağlık Kontrolü Yayınlayıcısı

Hizmet kapsayıcısına bir IHealthCheckPublisher eklendiğinde, sistem durumu denetimi sistemi düzenli aralıklarla sistem durumu denetimlerinizi yürütür ve sonuçla birlikte PublishAsync çağrısı yapar. Bu işlem, her işlemin sistem durumunu belirlemek için izleme sistemini düzenli aralıklarla çağırmasını bekleyen, anında iletme tabanlı sistem durumu izleme sistemi senaryosunda kullanışlıdır.

HealthCheckPublisherOptions şunları ayarlamanıza izin verir:

  • Delay: IHealthCheckPublisher örnekleri çalıştırılmadan önce, uygulama başlatıldıktan sonra uygulanan başlangıç gecikmesi. Gecikme başlangıçta bir kez uygulanır ve sonraki yinelemeler için geçerli değildir. Varsayılan değer beş saniyedir.
  • Period: IHealthCheckPublisher yürütme süresi. Varsayılan değer 30 saniyedir.
  • Predicate: Predicatenull (varsayılan) ise, sistem durumu denetimi yayımcı hizmeti tüm kayıtlı sistem durumu denetimlerini çalıştırır. Sistem durumu denetimlerinin bir alt kümesini çalıştırmak için denetim kümesini filtreleyen bir işlev sağlayın. Öngörü her periyot değerlendirilir.
  • Timeout: Tüm IHealthCheckPublisher örnekleri için sağlık kontrollerini yürütme zaman aşımı. Zaman aşımı olmadan yürütmek için `InfiniteTimeSpan` kullanın. Varsayılan değer 30 saniyedir.

Aşağıdaki örnek, bir sağlık yayımcısının düzenini göstermektedir.

public class SampleHealthCheckPublisher : IHealthCheckPublisher
{
    public Task PublishAsync(HealthReport report, CancellationToken cancellationToken)
    {
        if (report.Status == HealthStatus.Healthy)
        {
            // ...
        }
        else
        {
            // ...
        }

        return Task.CompletedTask;
    }
}

HealthCheckPublisherOptions sınıfı, sağlık denetimi yayımcısının davranışını yapılandırmak için özellikler sağlar.

Aşağıdaki örnek, bir sağlık kontrolü yayımcısını singleton olarak kaydeder ve yapılandırır HealthCheckPublisherOptions:

builder.Services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.FromSeconds(2);
    options.Predicate = healthCheck => healthCheck.Tags.Contains("sample");
});

builder.Services.AddSingleton<IHealthCheckPublisher, SampleHealthCheckPublisher>();

Note

AspNetCore.Diagnostics.HealthChecks Application Insights dahil olmak üzere çeşitli sistemler için yayımcılar içerir.

AspNetCore.Diagnostics.HealthChecks microsoft tarafından korunmuyor veya desteklenmiyor.

Bağımlılık Enjeksiyonu ve Sağlık Kontrolleri

Bir Sistem Durumu Denetimi sınıfı içindeki belirli Type bir örneğini kullanmak için bağımlılık ekleme özelliğini kullanmak mümkündür. Bağımlılık ekleme, sistem durumu denetimine seçenekler veya genel yapılandırma eklemek için yararlı olabilir. Bağımlılık enjeksiyonunun kullanılması, Sağlık Kontrollerini yapılandırmak için yaygın bir senaryo değildir. Genellikle, her Health Check, gerçek teste özgüdür ve uzantı yöntemleri kullanılarak IHealthChecksBuilder yapılandırılır.

Aşağıdaki örnekte, bağımlılık ekleme yoluyla bir yapılandırma nesnesi alan örnek bir Sistem Durumu Denetimi gösterilmektedir:

public class SampleHealthCheckWithDI : IHealthCheck
{
    private readonly SampleHealthCheckWithDiConfig _config;

    public SampleHealthCheckWithDI(SampleHealthCheckWithDiConfig config)
        => _config = config;

    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        var isHealthy = true;

        // use _config ...

        if (isHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("A healthy result."));
        }

        return Task.FromResult(
            new HealthCheckResult(
                context.Registration.FailureStatus, "An unhealthy result."));
    }
}

SampleHealthCheckWithDiConfig ve Sağlık kontrolü hizmet kapsayıcısına eklenmelidir.

builder.Services.AddSingleton<SampleHealthCheckWithDiConfig>(new SampleHealthCheckWithDiConfig
{
    BaseUriToCheck = new Uri("https://sample.contoso.com/api/")
});
builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheckWithDI>(
        "With Dependency Injection",
        tags: new[] { "inject" });

UseHealthChecks ile MapHealthChecks karşılaştırması

Arayanların sağlık kontrollerine erişimini sağlamak için iki yol vardır:

  • UseHealthChecks ara yazılım işlem hattında sistem durumu denetimleri isteklerini işlemek için ara yazılımı kaydeder.
  • MapHealthChecks sağlık denetimleri uç noktasını kaydeder. Uç nokta, uygulamadaki diğer uç noktalarla birlikte eşleştirilir ve yürütülür.

MapHealthChecks kullanmanın UseHealthChecks karşısındaki avantajı, yetkilendirme gibi uç nokta farkındalığına sahip olan ara yazılımları kullanabilme ve eşleşme politikası üzerinde daha ayrıntılı bir denetim sağlamaktır. UseHealthChecks yerine MapHealthChecks kullanmanın birincil avantajı, sağlık kontrollerinin ara yazılım işlem hattının tam olarak hangi aşamasında çalıştığını denetlemektir.

UseHealthChecks:

  • bir istek sistem durumu denetimi uç noktasıyla eşleştiğinde işlem hattını sonlandırır. Kısa devre yapma, günlüğe kaydetme ve diğer ara yazılımlar gibi gereksiz işleri önlediği için genellikle tercih edilir.
  • Öncelikle işlem hattında sistem durumu denetimi ara yazılımını yapılandırmak için kullanılır.
  • Bir null veya boş PathString ile bir bağlantı noktasındaki herhangi bir yolu eşleştirebilir. Belirtilen bağlantı noktasına yapılan herhangi bir istekte sağlık denetimi gerçekleştirmeye izin verir.
  • Kaynak kod

MapHealthChecks izin verir:

  • Sağlık kontrolleri için belirli yolları veya uç noktaları haritalama.
  • Sistem durumu denetimi uç noktasının erişilebilir olduğu URL'nin veya yolun özelleştirilmesi.
  • Farklı yollar veya yapılandırmalarla birden çok sağlık kontrolü uç noktalarını eşleme. Birden çok uç nokta desteği:
    • Farklı sistem durumu denetimleri veya bileşenleri için ayrı uç noktaları etkinleştirir.
    • Uygulamanın sistem durumunun farklı yönlerini ayırt etmek veya sistem durumu denetimlerinin alt kümelerine belirli yapılandırmalar uygulamak için kullanılır.
  • Kaynak kod

Ek kaynaklar

Note

Bu makale, kısmen yapay zeka yardımıyla oluşturulmuştur. Yayımlanmadan önce içerik bir yazar tarafından gözden geçirilmiş ve gereken şekilde düzeltilmiştir. Microsoft Learn'de yapay zeka tarafından oluşturulan içerik kullanma ilkelerimize bakın.