ASP.NET Core'da sistem durumu denetimleri
ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için Sistem Durumu Denetimleri Ara Yazılımı ve kitaplıklar sunar.
Sistem durumu denetimleri bir uygulama tarafından HTTP uç noktaları olarak ortaya çıkar. Sistem durumu denetimi uç noktaları çeşitli gerçek zamanlı izleme senaryoları için yalıtabilirsiniz:
- Durum araştırmaları, kapsayıcı orchestrator'ları ve yük dengeciler tarafından bir uygulamanın durumunu kontrol etmek için kullanılabilir. Örneğin, bir kapsayıcı orchestrator bir dağıtımı durdurarak veya bir kapsayıcıyı yeniden başlatarak başarısız sistem durumu denetimine yanıt verir. Yük dengeleyici, trafiği başarısız olan örnekten iyi durumda olmayan bir örneğine yönlendirerek iyi durumda olmayan bir uygulamaya tepki gösterebilirsiniz.
- Bellek, disk ve diğer fiziksel sunucu kaynaklarının iyi durumda olması için kullanımı izlenebilirsiniz.
- 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 edilebilir.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Örnek uygulama, bu konuda açıklanan senaryoların örneklerini içerir. Örnek uygulamayı bir senaryo için çalıştırmak üzere bir komut kabuğunda projenin klasöründen dotnet run komutunu kullanın. Örnek uygulamanın nasıl README.md kullanıla ilgili ayrıntılar için bu konudaki örnek uygulamanın dosyasına ve senaryo açıklamalarına bakın.
Önkoşullar
Sistem durumu denetimleri genellikle bir uygulamanın durumunu kontrol etmek için dış izleme hizmeti veya kapsayıcı orchestrator'ları ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce, hangi izleme sisteminin kullanılamayacaklarını karar verin. İzleme sistemi, oluşturulacak sistem durumu denetimlerinin türlerini ve uç noktalarının nasıl yapılandırı gerektiğini belirtir.
Microsoft.AspNetCore.Diagnostics.HealthChecksPakete, uygulamalar için örtülü olarak ASP.NET Core başvurur. Sistem durumu denetimlerini Entity Framework Core pakete bir başvuru Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore ekleyin.
Örnek uygulama, çeşitli senaryolar için sistem durumu denetimlerini göstermek için başlangıç kodu sağlar. Veritabanı yoklama senaryosu, kullanarak bir veritabanı bağlantısının sistem durumunu AspNetCore.Diagnostics.HealthChecks denetler. DbContext yoklama senaryosu, veritabanı için bir DbContext EF Core. Veritabanı senaryolarını keşfetmek için örnek uygulama:
- Bir veritabanı oluşturur ve dosyada bağlantı dizesini
appsettings.jsonsağlar. - Proje dosyasında aşağıdaki paket başvuruları vardır:
Not
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz 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 Properties/launchSettings.json ve yönetim bağlantı noktasını içeren bir dosya oluşturmanızı gerektirir. Daha fazla bilgi için Bağlantı noktasına göre filtreleme bölümüne bakın.
Temel durum araştırması
Birçok uygulama için, uygulamanın istekleri işleme kullanılabilirliğini (canlılık)raporan temel bir sistem durumu yoklama yapılandırması, uygulamanın durumunu bulmak için yeterlidir.
Temel yapılandırma, durum denetimi hizmetlerini kaydeden ve bir URL uç noktasına sistem durumu yanıtıyla yanıt vermek için Sistem Durumu Denetimleri Ara Yazılımı'nın çağrılarını sağlar. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için belirli bir sistem durumu denetimi kayıtlı değildir. Uygulama, durum uç noktası URL'sinde yanıt veremiyorsa iyi durumda olarak kabul edilir. Varsayılan yanıt yazıcı, durumunu ( ) istemciye düz metin yanıtı olarak yazar ve bu da , HealthStatus veya HealthStatus.Healthy durumunu HealthStatus.Degraded HealthStatus.Unhealthy gösterir.
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. içinde çağırarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturun.
Örnek uygulamada, ( ) üzerinden durum denetimi uç /health noktası BasicStartup.cs oluşturulur:
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 bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario basic
Docker örneği
Docker, temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu HEALTHCHECK kontrol etmek için kullanılmaktadır:
HEALTHCHECK CMD curl --fail http://localhost:5000/health || exit
Sistem durumu denetimleri oluşturma
Sistem durumu denetimleri, arabirimi uygulanarak IHealthCheck oluşturulur. yöntemi, CheckHealthAsync sistem durumunu , veya olarak belirten bir HealthCheckResult Healthy Degraded Unhealthy döndürür. Sonuç, yapılandırılabilir bir 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 ayrıca isteğe bağlı anahtar-değer çiftleri de dönüş olabilir.
Aşağıdaki ExampleHealthCheck sınıf, bir durum denetimi düzenini gösteriyor. Sistem durumu denetimleri mantığı yöntemine CheckHealthAsync yerleştirilir. Aşağıdaki örnek, olarak işleve sahip bir değişken healthCheckResultHealthy true ayarlar. değeri olarak healthCheckResultHealthy false ayarlanırsa, HealthCheckRegistration.FailureStatus durum 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 bir özel durum oluşturursa, tarafından tanımlanan (durum denetimi hizmetlerini kaydetme bölümüne bakın) olarak ayarlanmış yeni bir döndürülür ve başlangıçta denetim hatasına neden olan iç özel CheckHealthAsync HealthReportEntry durumu HealthReportEntry.Status FailureStatus AddCheck içerir. Description, özel durumun iletisine ayarlanır.
Durum denetimi hizmetlerini kaydetme
türü, ExampleHealthCheck 'de ile durum denetimi hizmetlerine AddCheck Startup.ConfigureServices eklenir:
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>("example_health_check");
Aşağıdaki AddCheck örnekte gösterilen aşırı yükleme, durum denetimi bir hata raporlarken hata durumunu ( ) rapor olarak HealthStatus ayarlar. Hata durumu olarak null ayarlanırsa (varsayılan), HealthStatus.Unhealthy rapor olur. Bu aşırı yükleme, kitaplık tarafından belirtilen hata durumunun, durum denetimi uygulaması ayarı karşılarsa bir durum denetimi hatası oluştuğunda uygulama tarafından zorlanan kitaplık yazarları için yararlı bir senaryodur.
Etiketler, sistem durumu denetimlerini filtrelemek için kullanılabilir (Sistem durumu denetimlerini filtreleme bölümünde daha fazla açıklanmıştır).
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>(
"example_health_check",
failureStatus: HealthStatus.Degraded,
tags: new[] { "example" });
AddCheck bir lambda işlevi de yürütülür. Aşağıdaki örnekte, durum denetimi adı olarak belirtilir ve Example denetim her zaman iyi durumda bir durum döndürür:
services.AddHealthChecks()
.AddCheck("Example", () =>
HealthCheckResult.Healthy("Example is OK!"), tags: new[] { "example" });
Bağımsız AddTypeActivatedCheck değişkenleri bir durum denetimi uygulamasına geçirilmesi için çağrısı. Aşağıdaki örnekte, TestHealthCheckWithArgs çağrıldıklarında kullanmak üzere bir tamsayı ve bir dize CheckHealthAsync 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 , tamsayı ile AddTypeActivatedCheck çağrılarak kaydedilir ve uygulamaya geçirilen dize:
services.AddHealthChecks()
.AddTypeActivatedCheck<TestHealthCheckWithArgs>(
"test",
failureStatus: HealthStatus.Degraded,
tags: new[] { "example" },
args: new object[] { 5, "string" });
Sistem Durumu Denetimleri Yönlendirmeyi Kullanma
içinde, Startup.Configure uç MapHealthChecks nokta URL'si veya göreli yolu ile uç nokta oluşturucusu üzerinde çağrısı:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
});
Konak gerektir
Durum RequireHost denetimi uç noktası için bir veya daha fazla izin verilen konak belirtmek için çağrısı. Konaklar nokta kodu yerine Unicode olmalı ve bir bağlantı noktası içerebilir. Bir 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
Durum RequireAuthorization denetimi isteği uç noktası üzerinde Yetkilendirme Ara Yazılımı çalıştırmak için çağrısı. Aşırı RequireAuthorization yükleme, bir veya daha fazla yetkilendirme ilkelerini kabul eder. İlke sağlanamıyorsa varsayılan yetkilendirme ilkesi kullanılır.
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health").RequireAuthorization();
});
Kaynaklar Arası İstekleri (CORS) etkinleştirme
Tarayıcıdan el ile sistem durumu denetimleri gerçekleştirmek yaygın bir kullanım senaryosu olsa da, CORS Ara Yazılımı sistem durumu denetimleri uç RequireCors noktalarında çağrılarak etkinleştirilebilir. Aşırı RequireCors yükleme cors ilke oluşturucu temsilcisi ( CorsPolicyBuilder ) veya ilke adı kabul eder. İlke sağlanamıyorsa varsayılan CORS ilkesi kullanılır. Daha fazla bilgi için bkz. Çıkış Noktası Arası İstekleri (CORS) ASP.NET Core.
Durum denetimi seçenekleri
HealthCheckOptions durum denetimi davranışını özelleştirme fırsatı sağlar:
- Filtre durumu denetimleri
- HTTP durum kodunu özelleştirme
- Önbellek üst bilgilerini gizleme
- Çıkışı özelleştirme
Filtre durumu denetimleri
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 boole döndüren bir işlev Predicate belirtin. Aşağıdaki örnekte, durum denetimi işlevin koşullu deyiminde etiketine ( ) göre filtrelenmiş ve burada yalnızca durum denetimi özelliğinin veya ile eşleşmesi durumu Bar bar_tag true Tags foo_tag 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" });
içinde Startup.Configure , Predicate 'Çubuk' durum denetimi filtrelerini 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
Durum ResultStatusCodes durumunun HTTP durum kodlarıyla eşlemesini özelleştirmek için 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ştirme.
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 Sistem Durumu Denetimleri Ara Yazılımı'nın, yanıtın önbelleğe alınmasını önlemek için bir yoklama yanıtına HTTP üst bilgileri ekip ekleye olmadığını denetler. Değer false (varsayılan) ise, ara yazılım, yanıtın önbelleğe alınmasını önlemek için , ve üst bilgilerini ayarlar Cache-Control veya geçersiz Expires Pragma kılar. değeri ise true ara yazılım yanıtın önbellek üst bilgilerini değiştirmez.
Startup.Configure içinde:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{
AllowCachingResponses = false
});
});
Çıkışı özelleştirme
içinde, Startup.Configure yanıtı yazmak için seçeneğini bir temsilci olarak HealthCheckOptions.ResponseWriter ayarlayın:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{
ResponseWriter = WriteResponse
});
});
Varsayılan temsilci, dize değeriyle birlikte minimal bir düz metin yanıtı HealthReport.Status yazar. Aşağıdaki özel temsilciler özel bir JSON yanıtı çıkışı sağlar.
Örnek uygulamanın ilk örneği, kullanımını System.Text.Json gösteriyor:
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 kullanabileceğiniz Newtonsoft.Json gösterildi:
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, sürümünü etkinleştirmek için SYSTEM_TEXT_JSON içinde önişlemci CustomWriterStartup.cs yönergesine açıklama Newtonsoft.Json WriteResponse eklenmiştir.
Sistem durumu denetimleri API'si, biçim izleme sistemi seçiminize özgü olduğundan karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz. Yukarıdaki örneklerde verilen yanıtı gereken şekilde özelleştirin. ile JSON serileştirmesi hakkında daha fazla bilgi için System.Text.Json bkz. .NET'te JSON'useri hale getirme ve seriden serileştirme.
Veritabanı araştırması
Durum denetimi, veritabanının normal şekilde yanıt verme durumunu belirtmek için boole testi olarak çalıştıracak bir veritabanı sorgusu belirtebilirsiniz.
Örnek uygulama, bir ASP.NET Core veritabanında durum denetimi gerçekleştirmek için uygulama için AspNetCore.Diagnostics.HealthChecks bir durum denetimi SQL Server kullanır. AspNetCore.Diagnostics.HealthChecks veritabanı SELECT 1 bağlantısının iyi olduğunu doğrulamak için veritabanına yönelik bir sorgu yürütür.
Uyarı
Sorguyla veritabanı bağlantısını kontrol etmek için 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ırmaya gerek yoktur. Yalnızca veritabanıyla başarılı bir bağlantı oluşturmak yeterlidir. Sorgu çalıştırmanın gerekli olduğunu bulursanız gibi basit bir SELECT sorgusu SELECT 1 seçin.
için bir paket başvurusu AspNetCore.HealthChecks.SqlServer içerir.
Örnek uygulamanın dosyasında geçerli bir appsettings.json veritabanı bağlantı dizesi sağlar. Uygulama, adlı SQL Server HealthCheckSample 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": "*"
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. Örnek uygulama, AddSqlServer veritabanının bağlantı dizesi () ile yöntemini DbHealthStartup.cs çağırıyor:
services.AddHealthChecks()
.AddSqlServer(Configuration["ConnectionStrings:DefaultConnection"]);
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
}
Örnek uygulamayı kullanarak veritabanı araştırma senaryosunu çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario db
Not
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz veya desteklenmiyor.
Entity Framework Core DbContext araştırması
Denetim, DbContext uygulamanın bir uygulama için yapılandırılmış veritabanıyla iletişim kura DbContext EF Core. Denetim, DbContext aşağıdaki uygulamalarda de kullanılabilir:
- Entity Framework (EF) Core kullanın.
- için bir paket başvurusu
Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCoreiçerir.
AddDbContextCheck<TContext> , için bir durum denetimi DbContext kaydedmektedir. DbContextyöntemi olarak TContext sağlanır. Hata durumunu, etiketleri ve özel bir test sorgusunu yapılandırmak için bir aşırı yükleme kullanılabilir.
Varsayılan olarak:
- ,
DbContextHealthCheckEF Core yönteminiCanConnectAsyncarar. Yöntem aşırı yüklemelerini kullanarak durum denetlenken hangi işlemiAddDbContextCheckçalıştıracaklarını özelleştirebilirsiniz. - Durum denetimi adı, türün
TContextadıdır.
Örnek uygulamada , () AppDbContext içinde AddDbContextCheck hizmetine sağlanır ve hizmet olarak Startup.ConfigureServices DbContextHealthStartup.cs kaydedilir:
services.AddHealthChecks()
.AddDbContextCheck<AppDbContext>();
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(
Configuration["ConnectionStrings:DefaultConnection"]);
});
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
}
Örnek uygulamayı kullanarak araştırma senaryosunu çalıştırmak için, bağlantı dizesi tarafından belirtilen veritabanının örnek örneğinde DbContext SQL Server olun. Veritabanı varsa silin.
Bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario dbcontext
Uygulama çalıştır edildikten sonra tarayıcıda uç noktasına istekte bulunduktan sonra /health durum durumunu kontrol edin. ve veritabanı AppDbContext mevcut değildir, bu nedenle uygulama aşağıdaki yanıtı sağlar:
Unhealthy
Veritabanını oluşturmak için örnek uygulamayı tetikler. için bir istekte bulundur. /createdatabase Uygulama şunları yanıtlar:
Creating the database...
Done!
Navigate to /health to see the health status.
Uç nokta için /health istekte bulundur. Veritabanı ve bağlam mevcut, bu nedenle uygulama şunları yanıtlar:
Healthy
Veritabanını silmek için örnek uygulamayı tetikler. için bir istekte bulundur. /deletedatabase Uygulama şunları yanıtlar:
Deleting the database...
Done!
Navigate to /health to see the health status.
Uç nokta için /health istekte bulundur. Uygulama, iyi olmayan bir yanıt sağlar:
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 durumu, uygulamanın normal şekilde çalıştırılasa da istekleri almaya hazır olmadığını gösterir.
- Canlılık, bir uygulamanın kilitlenmesi ve yeniden başlatılması gerektiğini gösterir.
Aşağıdaki örneği göz önünde bulundurabilirsiniz: Bir uygulamanın istekleri işlemeye hazır olmadan önce 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 sınıyor olabilir. İşlem canlılığını açıklamak için canlılık yoklamasını kullanır, ek denetim gerçekleştirilamaz. Yapılandırma dosyası indirme işlemi başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyoruz. İndirme başarılı olana ve uygulama istekleri almaya hazır olana kadar "hazır değil" durumunu belirtmek için bir hazırlık yoklama kullanırsınız.
Örnek uygulama, Barındırılan Hizmette uzun süre çalışan başlangıç görevinin tamamlanmasını rapor etmek için bir durum denetimi içerir. , uzun süre çalışan görevi tamamlandığında barındırılan hizmetin olarak ayarlayacak bir özelliğini ( StartupHostedServiceHealthCheck StartupTaskCompleted ) true StartupHostedServiceHealthCheck.cs gösterir:
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 () tarafından Services/StartupHostedService başlatıldı. Görevin sonunda olarak StartupHostedServiceHealthCheck.StartupTaskCompleted true 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()
{
}
}
Durum denetimi, barındırılan AddCheck Startup.ConfigureServices hizmetle birlikte içinde kaydedilir. Barındırılan hizmetin durum denetiminde özelliğini ayarlaması gerekir, çünkü durum denetimi de hizmet kapsayıcısı () içinde LivenessProbeStartup.cs kaydedilir:
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>();
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur. Örnek uygulamada, durum denetimi uç noktaları şu noktada oluşturulur:
/health/readyhazır olma denetimi için. Hazır olma denetimi, durum denetimlerini etiketle sistem durumu denetiminereadyfiltreler./health/livecanlılık denetimi için. Canlılık denetimi, içindeStartupHostedServiceHealthCheckdöndürerekfalsefiltrelemektedirHealthCheckOptions.Predicate(daha fazla bilgi için bkz. Sistem durumu denetimlerini filtreleme)
Aşağıdaki örnek kodda:
- Hazır olma denetimi, 'ready' etiketine sahip tüm kayıtlı denetimleri kullanır.
- ,
Predicatetüm denetimleri dışlar ve 200 Ok dönüşlerini sağlar.
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 bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario liveness
Tarayıcıda /health/ready 15 saniye geçene kadar birkaç kez ziyaret edin. Durum denetimi, ilk Unhealthy 15 saniye için rapor sağlar. 15 saniye sonra uç nokta, barındırılan hizmet tarafından uzun süre çalışan görevin Healthy tamamlanmasını yansıtan raporlar.
Bu örnek ayrıca ilk hazır olma Publisher iki saniyelik gecikmeyle çalışan bir Durum Denetimi denetimi IHealthCheckPublisher (uygulama) oluşturur. Daha fazla bilgi için Durum Denetimi Publisher bakın.
Kubernetes örneği
Kubernetesgibi bir ortamda ayrı hazırlık ve canlılık denetimleri kullanmak yararlıdır. Kubernetes'te, temel alınan veritabanı kullanılabilirliğini test etme gibi istekleri kabul etmek için bir uygulamanın zaman alan başlangıç işi gerçekleştirmesi gerekebilir. Ayrı denetimler kullanmak, orchestrator'ın uygulamanın çalışmasının ancak henüz hazır olmadığının veya uygulamanın başlatılamayıp başlamamış olduğunu ayırt inginger. Kubernetes'te hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerinde Canlılık ve Hazır Olma Yoklamalarını Yapılandırma makalesine bakın.
Aşağıdaki örnek, Kubernetes hazır olma yoklama yapılandırmasını gösterir:
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ı araştırma
Örnek uygulama, özel yanıt yazıcı ile bir bellek durumu denetimi gösteriyor.
MemoryHealthCheck , uygulamanın verilen bellek eşiğinden (örnek uygulamada 1 GB) daha fazla kullandığında düzeyi düşürülmüş durumu raporlar. , HealthCheckResult uygulama için Atık 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));
}
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. 'a geçerek durum denetimi etkinleştirmek yerine AddCheck MemoryHealthCheck , hizmet olarak kaydedilir. Tüm IHealthCheck kayıtlı hizmetler, durum denetimi hizmetleri ve ara yazılım tarafından kullanılabilir. Durum denetimi hizmetlerini Tekli hizmetler olarak kaydetmenizi öneririz.
Örnek CustomWriterStartup.cs uygulamanın içinde:
services.AddHealthChecks()
.AddMemoryHealthCheck("memory");
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur. Sistem durumu denetimi yürütülürken özel bir JSON yanıtı çıktısı almak için WriteResponse <Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.ResponseWriter> özelliğine bir temsilci sağlanır:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{
ResponseWriter = WriteResponse
});
}
Temsilci, WriteResponse nesnesini CompositeHealthCheckResult bir JSON nesnesine biçimler ve durum denetimi yanıtı için JSON çıkışı verir. Daha fazla bilgi için Çıktıyı özelleştirme bölümüne bakın.
Örnek uygulamayı kullanarak ölçüm tabanlı araştırmayı özel yanıt yazıcısı çıkışıyla çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario writer
Not
AspNetCore.Diagnostics.HealthChecks , disk depolama ve maksimum değer canlılığı denetimleri dahil olmak üzere ölçüm tabanlı sistem durumu denetimi senaryolarını içerir.
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz veya desteklenmiyor.
Bağlantı noktasına göre filtreleme
Sistem RequireHost durumu denetimi isteklerini belirtilen bağlantı noktasıyla kısıtlamak için bağlantı noktasını belirten bir URL MapHealthChecks deseniyle çağrısı. Bu genellikle izleme hizmetleri için bir bağlantı noktasını ortaya çıkarmak için bir 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ırmaktadır. 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çirilebilir. Ayrıca sunucuyu yönetim bağlantı noktası üzerinde istekleri dinleyecek şekilde yapılandırmalısınız.
Yönetim bağlantı noktası yapılandırmasını göstermek üzere örnek uygulamayı kullanmak için dosyayı launchSettings.json bir klasörde Properties oluşturun.
Örnek uygulamanın aşağıdaki dosyası örnek uygulamanın proje dosyalarına dahil değildir Properties/launchSettings.json ve el ile oluşturulmalısınız:
{
"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/"
}
}
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. içinde çağırarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturun.
Örnek uygulamada, 'de uç RequireHost noktada Startup.Configure çağrısı, yapılandırmadan yönetim bağlantı noktasını belirtir:
endpoints.MapHealthChecks("/health")
.RequireHost($"*:{Configuration["ManagementPort"]}");
Uç noktalar içinde örnek uygulamada Startup.Configure oluşturulur. Aşağıdaki örnek kodda:
- Hazır olma denetimi, 'ready' etiketine sahip tüm kayıtlı denetimleri kullanır.
- ,
Predicatetüm denetimleri dışlar ve 200 Ok dönüşleri sağlar.
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions()
{
Predicate = (check) => check.Tags.Contains("ready"),
});
endpoints.MapHealthChecks("/health/live", new HealthCheckOptions()
{
Predicate = (_) => false
});
}
Not
Yönetim bağlantı noktasını launchSettings.json kodda açıkça ayarerek örnek uygulamada dosya oluşturmaktan kaçınabilirsiniz. Program.csburada, HostBuilder uygulamasına bir çağrı ekleyin ListenAnyIP ve uygulamanın yönetim bağlantı noktası uç noktasını ekleyin. içinde, Configure ile yönetim bağlantı noktasını ManagementPortStartup.cs RequireHost 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 bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario port
Durum denetimi kitaplığını dağıtma
Bir durum denetimlerini kitaplık olarak dağıtmak için:
Arabirimi tek başına sınıf olarak uygulayan IHealthCheck bir durum denetimi yazın. sınıfı yapılandırma verilerine erişmek için bağımlılık eklemeye (DI), tür etkinleştirmeye ve adlandırılmış seçeneklere güvenebilirsiniz.
sistem durumu denetimi
CheckHealthAsyncmantığında:data1``data2ve , yoklamanın durum denetimi mantığını çalıştırmak için yönteminde kullanılır.AccessViolationExceptionişlandı.
Bir AccessViolationException oluştuğunda, ile FailureStatus birlikte döndürülür ve kullanıcıların sistem durumunu HealthCheckResult yapılandırmalarına izin vermek için hata durumunu denetler.
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); } } } }Tüketen uygulamanın yönteminde çağıran parametrelerle bir genişletme yöntemi
Startup.Configureyazın. Aşağıdaki örnekte, aşağıdaki durum denetimi yöntemi imzasını varsayyın:ExampleHealthCheck(string, string, int )Yukarıdaki imza, sistem durumu denetimi
ExampleHealthCheckyoklama mantığını işlemeye ek veriler gerektirdiğini gösterir. Veriler, durum denetimi bir uzantı yöntemiyle kayded olduğunda durum denetimi örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte çağıranı isteğe bağlı olarak belirtir:- sistem durumu denetimi adı (
name).nullexample_health_checkkullanılırsa. - sistem durumu denetimi için dize veri noktası (
data1). - sistem durumu denetimi için tamsayı veri noktası (
data2).null1kullanılırsa. - hata durumu ( HealthStatus ). Varsayılan değer:
null. ise,nullbir hata durumu içinHealthStatus.Unhealthyraporlandı. - tags (
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)); } }- sistem durumu denetimi adı (
Durum Denetimi Publisher
Hizmet IHealthCheckPublisher kapsayıcısı için bir eklenmiştir, sistem durumu denetim sistemi düzenli aralıklarla sistem durumu denetimlerinizi ve çağrılarınızı PublishAsync sonuçla yürütür. Bu, sistem durumunu belirlemek için her bir işlemi düzenli aralıklarla izleme sistemini çağıran bir anında durum izleme sistemi senaryosunda kullanışlıdır.
Arabirimin IHealthCheckPublisher tek bir yöntemi vardır:
Task PublishAsync(HealthReport report, CancellationToken cancellationToken);
HealthCheckPublisherOptions şunları ayarlamaya olanak sağlayacak:
- Delay: Örnekler yürütülmeden önce uygulama başladıktan sonra uygulanan ilk IHealthCheckPublisher gecikme. Gecikme başlangıçta bir kez uygulanır ve sonraki yinelemeler için geçerli değildir. Varsayılan değer beş saniyedir.
- Period: Yürütme IHealthCheckPublisher süresi. Varsayılan değer 30 saniyedir.
- Predicate: Ise Predicate
null(varsayılan), 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 filtreleen bir işlev sağlar. Her dönem için bu süre değerlendirilir. - Timeout: Tüm örnekler için sistem durumu denetimlerini yürütmek için IHealthCheckPublisher zaman aşımı. Zaman InfiniteTimeSpan aşımı olmadan yürütmek için kullanın. Varsayılan değer 30 saniyedir.
Örnek uygulamada bir ReadinessPublisher IHealthCheckPublisher uygulamadır. Sistem durumu denetimi durumu her denetim için günlük düzeyinde günlüğe kaydedilir:
- Sistem durumu denetimi durumu ise Bilgi ( LogInformation ) Healthy .
- Durum veya ise Hata ( LogError Degraded ) Unhealthy .
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 uygulama örneğinde hazır olma denetiminde iki saniyelik başlatma gecikmesi vardır ve LivenessProbeStartup StartupHostedService denetimi 30 saniyede bir çalıştırır. Uygulama etkinleştirmek IHealthCheckPublisher için örnek, bağımlılık ekleme ReadinessPublisher (DI) kapsayıcısı içinde tek bir hizmet olarak kaydolr:
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>();
Not
AspNetCore.Diagnostics.HealthChecks, Application Analizler dahil olmak üzere çeşitli sistemler için yayımcıları içerir.
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz veya desteklenmiyor.
MapWhen ile sistem durumu denetimlerini kısıtlama
Durum MapWhen denetimi uç noktaları için istek işlem hattını koşullu olarak dallara dallara atın.
Aşağıdaki örnekte, uç MapWhen nokta için bir GET isteği alınsa Sistem Durumu Denetimleri Ara Yazılım'ı etkinleştirmek için istek işlem hattını api/HealthCheck dallar:
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 Middleware.
ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için Sistem Durumu Denetimleri Ara Yazılımı ve kitaplıklar sunar.
Sistem durumu denetimleri bir uygulama tarafından HTTP uç noktaları olarak ortaya çıkar. Sistem durumu denetimi uç noktaları çeşitli gerçek zamanlı izleme senaryoları için yalıtabilirsiniz:
- Durum araştırmaları, bir uygulamanın durumunu kontrol etmek için kapsayıcı orchestrator'ları ve yük dengeciler tarafından kullanılabilir. Örneğin, kapsayıcı orchestrator bir dağıtım durdurma veya kapsayıcıyı yeniden başlatarak başarısız sistem durumu denetimine yanıt olabilir. Yük dengeleyici, trafiği başarısız örnekten iyi durumdaki bir örneğine yönlendirerek iyi durumda olmayan bir uygulamaya tepki gösterebilirsiniz.
- Bellek, disk ve diğer fiziksel sunucu kaynaklarının iyi durumda olması için kullanımı izlenebilirsiniz.
- 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 edilebilir.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Örnek uygulama, bu konuda açıklanan senaryoların örneklerini içerir. Örnek uygulamayı bir senaryo için çalıştırmak üzere bir komut kabuğunda projenin klasöründen dotnet run komutunu kullanın. Örnek uygulamanın kullanımı hakkında ayrıntılı bilgi için bu konudaki örnek README.md uygulamanın dosyasına ve senaryo açıklamalarına bakın.
Önkoşullar
Sistem durumu denetimleri genellikle bir uygulamanın durumunu kontrol etmek için dış izleme hizmeti veya kapsayıcı orchestrator'ları ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce, hangi izleme sisteminin kullanılamayacaklarını karar verin. İzleme sistemi, oluşturulacak sistem durumu denetimlerinin türlerini ve uç noktalarının nasıl yapılandırı gerektiğini belirtir.
Pakete Microsoft.AspNetCore.Diagnostics.HealthChecks uygulamalar için örtülü olarak ASP.NET Core başvurur. Sistem durumu denetimlerini Entity Framework Core için pakete bir paket başvurusu Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore ekleyin.
Örnek uygulama, çeşitli senaryolar için sistem durumu denetimlerini göstermek için başlangıç kodu sağlar. Veritabanı yoklama senaryosu, kullanarak bir veritabanı bağlantısının sistem durumunu AspNetCore.Diagnostics.HealthChecks denetler. DbContext yoklama senaryosu, veritabanı için bir DbContext EF Core. Veritabanı senaryolarını keşfetmek için örnek uygulama:
- Bir veritabanı oluşturur ve dosyada bağlantı dizesini
appsettings.jsonsağlar. - Proje dosyasında aşağıdaki paket başvuruları vardır:
Not
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz 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 Properties/launchSettings.json ve yönetim bağlantı noktasını içeren bir dosya oluşturmanızı gerektirir. Daha fazla bilgi için Bağlantı noktasına göre filtreleme bölümüne bakın.
Temel durum araştırması
Birçok uygulama için, uygulamanın istekleri işleme kullanılabilirliğini (canlılık)raporan temel bir sistem durumu yoklama yapılandırması, uygulamanın durumunu bulmak için yeterlidir.
Temel yapılandırma, durum denetimi hizmetlerini kaydeden ve bir URL uç noktasına sistem durumu yanıtıyla yanıt vermek için Sistem Durumu Denetimleri Ara Yazılımı'nın çağrısıdır. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için belirli bir sistem durumu denetimi kayıtlı değildir. Uygulama, durum uç noktası URL'sinde yanıt veremiyorsa iyi durumda olarak kabul edilir. Varsayılan yanıt yazıcı durumu ( ) istemciye düz metin yanıtı olarak yazar ve bu da , HealthStatus HealthStatus.Healthy veya durumunu HealthStatus.Degraded HealthStatus.Unhealthy gösterir.
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. içinde çağırarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturun.
Örnek uygulamada, ( ) üzerinden durum denetimi uç /health noktası BasicStartup.cs oluşturulur:
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 bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario basic
Docker örneği
Docker, temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu HEALTHCHECK kontrol etmek için kullanılmaktadır:
HEALTHCHECK CMD curl --fail http://localhost:5000/health || exit
Sistem durumu denetimleri oluşturma
Sistem durumu denetimleri, arabirimi uygulanarak IHealthCheck oluşturulur. yöntemi, CheckHealthAsync sistem durumunu , veya olarak belirten bir HealthCheckResult Healthy Degraded Unhealthy döndürür. Sonuç, yapılandırılabilir bir 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 ayrıca isteğe bağlı anahtar-değer çiftleri de dönüş olabilir.
Aşağıdaki ExampleHealthCheck sınıf, bir durum denetimi düzenini gösteriyor. Sistem durumu denetimleri mantığı yöntemine CheckHealthAsync yerleştirilir. Aşağıdaki örnek, olarak işleve sahip bir değişken healthCheckResultHealthy true ayarlar. değeri olarak healthCheckResultHealthy false ayarlanırsa, HealthCheckResult.Unhealthy durum 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."));
}
}
Durum denetimi hizmetlerini kaydetme
türü, ExampleHealthCheck 'de ile durum denetimi hizmetlerine AddCheck Startup.ConfigureServices eklenir:
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>("example_health_check");
Aşağıdaki örnekte gösterilen aşırı yükleme, durum denetimi bir hata raporlarken hata durumunu AddCheck ( ) rapor olarak HealthStatus ayarlar. Hata durumu olarak null ayarlanırsa (varsayılan), HealthStatus.Unhealthy rapor olur. Bu aşırı yükleme, kitaplık tarafından belirtilen hata durumunun, durum denetimi uygulaması ayarı karşılarsa bir durum denetimi hatası oluştuğunda uygulama tarafından zorlanan kitaplık yazarları için yararlı bir senaryodur.
Etiketler, sistem durumu denetimlerini filtrelemek için kullanılabilir (Sistem durumu denetimlerini filtreleme bölümünde daha fazla açıklanmıştır).
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>(
"example_health_check",
failureStatus: HealthStatus.Degraded,
tags: new[] { "example" });
AddCheck bir lambda işlevi de yürütülür. Aşağıdaki örnekte, durum denetimi adı olarak belirtilir ve Example denetim her zaman iyi durumda bir durum döndürür:
services.AddHealthChecks()
.AddCheck("Example", () =>
HealthCheckResult.Healthy("Example is OK!"), tags: new[] { "example" });
Bağımsız AddTypeActivatedCheck değişkenleri bir durum denetimi uygulamasına geçirilmesi için çağrısı. Aşağıdaki örnekte, TestHealthCheckWithArgs çağrıldıklarında kullanmak üzere bir tamsayı ve bir dize CheckHealthAsync 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 , tamsayı ile AddTypeActivatedCheck çağrılarak kaydedilir ve uygulamaya geçirilen dize:
services.AddHealthChecks()
.AddTypeActivatedCheck<TestHealthCheckWithArgs>(
"test",
failureStatus: HealthStatus.Degraded,
tags: new[] { "example" },
args: new object[] { 5, "string" });
Sistem Durumu Denetimleri Yönlendirmeyi Kullanma
içinde, Startup.Configure uç MapHealthChecks nokta URL'si veya göreli yolu ile uç nokta oluşturucusu üzerinde çağrısı:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
});
Konak gerektir
Durum RequireHost denetimi uç noktası için bir veya daha fazla izin verilen konak belirtmek için çağrısı. Konaklar nokta kodu yerine Unicode olmalı ve bir bağlantı noktası içerebilir. Bir 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
Durum RequireAuthorization denetimi isteği uç noktası üzerinde Yetkilendirme Ara Yazılımı çalıştırmak için çağrısı. Aşırı RequireAuthorization yükleme, bir veya daha fazla yetkilendirme ilkelerini kabul eder. İlke sağlanamıyorsa varsayılan yetkilendirme ilkesi kullanılır.
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health").RequireAuthorization();
});
Kaynaklar Arası İstekleri (CORS) etkinleştirme
Tarayıcıdan el ile sistem durumu denetimleri gerçekleştirmek yaygın bir kullanım senaryosu olsa da, CORS Ara Yazılımı sistem durumu denetimleri uç RequireCors noktalarında çağrılarak etkinleştirilebilir. Aşırı RequireCors yükleme cors ilke oluşturucu temsilcisi ( CorsPolicyBuilder ) veya ilke adı kabul eder. İlke sağlanamıyorsa varsayılan CORS ilkesi kullanılır. Daha fazla bilgi için bkz. Çıkış Noktası Arası İstekleri (CORS) ASP.NET Core.
Durum denetimi seçenekleri
HealthCheckOptions durum denetimi davranışını özelleştirme fırsatı sağlar:
- Filtre durumu denetimleri
- HTTP durum kodunu özelleştirme
- Önbellek üst bilgilerini gizleme
- Çıkışı özelleştirme
Filtre durumu denetimleri
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 boole döndüren bir işlev Predicate belirtin. Aşağıdaki örnekte, durum denetimi işlevin koşullu deyiminde etiketine ( ) göre filtrelenmiş ve burada yalnızca durum denetimi özelliğinin veya ile eşleşmesi durumu Bar bar_tag true Tags foo_tag 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" });
içinde Startup.Configure , Predicate 'Çubuk' durum denetimi filtrelerini 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
Durum ResultStatusCodes durumunun HTTP durum kodlarıyla eşlemesini özelleştirmek için 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ştirme.
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 Sistem Durumu Denetimleri Ara Yazılımı'nın, yanıtın önbelleğe alınmasını önlemek için bir yoklama yanıtına HTTP üst bilgileri ekip ekleye olmadığını denetler. Değer false (varsayılan) ise, ara yazılım, yanıtın önbelleğe alınmasını önlemek için , ve üst bilgilerini ayarlar Cache-Control veya geçersiz Expires Pragma kılar. değeri ise true ara yazılım yanıtın önbellek üst bilgilerini değiştirmez.
Startup.Configure içinde:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{
AllowCachingResponses = false
});
});
Çıkışı özelleştirme
içinde, Startup.Configure yanıtı yazmak için seçeneğini bir temsilci olarak HealthCheckOptions.ResponseWriter ayarlayın:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{
ResponseWriter = WriteResponse
});
});
Varsayılan temsilci, dize değeriyle minimal bir düz metin yanıtı HealthReport.Status yazar. Aşağıdaki özel temsilciler özel bir JSON yanıtı çıkışı sağlar.
Örnek uygulamanın ilk örneği, kullanımını System.Text.Json gösteriyor:
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 örnek, Newtonsoft.Json'ın nasıl kullanılageldi:
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, sürümünü etkinleştirmek için SYSTEM_TEXT_JSON içinde önişlemci CustomWriterStartup.cs yönergesine açıklama Newtonsoft.Json WriteResponse eklenmiştir.
Sistem durumu denetimleri API'si, biçim izleme sistemi seçiminize özgü olduğundan karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz. Yukarıdaki örneklerde verilen yanıtı gereken şekilde özelleştirin. ile JSON serileştirmesi hakkında daha fazla bilgi için System.Text.Json bkz. .NET'te JSON'useri hale getirme ve seriden kaldır.
Veritabanı araştırması
Durum denetimi, veritabanının normal şekilde yanıt verme durumunu belirtmek için boole testi olarak çalıştıracak bir veritabanı sorgusu belirtebilirsiniz.
Örnek uygulama, bir veritabanı üzerinde durum denetimi gerçekleştirmek ASP.NET Core için bir durum AspNetCore.Diagnostics.HealthChecks denetimi kitaplığı olan SQL Server kullanır. AspNetCore.Diagnostics.HealthChecks veritabanı SELECT 1 bağlantısının iyi olduğunu doğrulamak için veritabanına yönelik bir sorgu yürütür.
Uyarı
Sorguyla veritabanı bağlantısını kontrol etmek için 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ırmaya gerek yoktur. Yalnızca veritabanıyla başarılı bir bağlantı oluşturmak yeterlidir. Sorgu çalıştırmanın gerekli olduğunu bulursanız gibi basit bir SELECT sorgusu SELECT 1 seçin.
için bir paket başvurusu AspNetCore.HealthChecks.SqlServer içerir.
Örnek uygulamanın dosyasında geçerli bir appsettings.json veritabanı bağlantı dizesi sağlar. Uygulama adlı bir SQL Server HealthCheckSample 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": "*"
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. Örnek uygulama, AddSqlServer veritabanının bağlantı dizesi () ile yöntemini DbHealthStartup.cs çağırıyor:
services.AddHealthChecks()
.AddSqlServer(Configuration["ConnectionStrings:DefaultConnection"]);
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
}
Örnek uygulamayı kullanarak veritabanı araştırma senaryosunu çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario db
Not
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz veya destekçisi değil.
Entity Framework Core DbContext araştırması
Denetim, DbContext uygulamanın bir uygulama için yapılandırılmış veritabanıyla iletişim kura DbContext EF Core. Denetim, DbContext aşağıdaki uygulamalarda de kullanılabilir:
- Entity Framework (EF) Core kullanın.
- için bir paket başvurusu
Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCoreiçerir.
AddDbContextCheck<TContext> , için bir durum denetimi DbContext kaydedmektedir. DbContextyöntemi olarak TContext sağlanır. Hata durumunu, etiketleri ve özel bir test sorgusunu yapılandırmak için bir aşırı yükleme kullanılabilir.
Varsayılan olarak:
- ,
DbContextHealthCheckEF Core yönteminiCanConnectAsyncarar. Yöntem aşırı yüklemelerini kullanarak durum denetlenken hangi işlemiAddDbContextCheckçalıştıracaklarını özelleştirebilirsiniz. - Durum denetimi adı, türün
TContextadıdır.
Örnek uygulamada , () AppDbContext içinde AddDbContextCheck hizmetine sağlanır ve hizmet olarak Startup.ConfigureServices DbContextHealthStartup.cs kaydedilir:
services.AddHealthChecks()
.AddDbContextCheck<AppDbContext>();
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(
Configuration["ConnectionStrings:DefaultConnection"]);
});
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health");
}
Örnek uygulamayı kullanarak araştırma senaryosunu çalıştırmak için, bağlantı dizesi tarafından belirtilen veritabanının DbContext SQL Server. Veritabanı varsa silin.
Bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario dbcontext
Uygulama çalıştır edildikten sonra tarayıcıda uç noktasına istekte bulunduktan sonra /health durum durumunu kontrol edin. ve veritabanı AppDbContext mevcut değildir, bu nedenle uygulama aşağıdaki yanıtı sağlar:
Unhealthy
Veritabanını oluşturmak için örnek uygulamayı tetikler. için bir istekte bulundur. /createdatabase Uygulama şu yanıtları verir:
Creating the database...
Done!
Navigate to /health to see the health status.
Uç nokta için /health istekte bulundur. Veritabanı ve bağlam mevcut, bu nedenle uygulama şunları yanıtlar:
Healthy
Veritabanını silmek için örnek uygulamayı tetikler. için bir istekte bulundur. /deletedatabase Uygulama şu yanıtları verir:
Deleting the database...
Done!
Navigate to /health to see the health status.
Uç nokta için /health istekte bulundur. Uygulama, iyi olmayan bir yanıt sağlar:
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 durumu, uygulamanın normal şekilde çalıştırılasa da istekleri almaya hazır olmadığını gösterir.
- Canlılık, bir uygulamanın kilitlenmesi ve yeniden başlatılması gerektiğini gösterir.
Aşağıdaki örneği göz önünde bulundurabilirsiniz: Bir uygulamanın istekleri işlemeye hazır olmadan önce büyük bir yapılandırma dosyası indirmesi gerekir. İlk indirme başarısız olursa uygulamanın yeniden başlatılmasını istemiyoruz çünkü uygulama dosyayı birkaç kez indirmeyi yeniden sınıyor. İşlem canlılığını açıklamak için canlılık yoklamasını kullanıruz, ek denetim gerçekleştirilamaz. Yapılandırma dosyası indirme işlemi başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyoruz. İndirme başarılı olana ve uygulama istekleri almaya hazır olana kadar "hazır değil" durumunu belirtmek için bir hazırlık yoklama kullanırsınız.
Örnek uygulama, Barındırılan Hizmette uzun süre çalışan başlangıç görevinin tamamlanmasını rapor etmek için bir durum denetimi içerir. , uzun süre çalışan görevi tamamlandığında barındırılan hizmetin olarak ayarlayacak bir özelliğini ( StartupHostedServiceHealthCheck StartupTaskCompleted ) true StartupHostedServiceHealthCheck.cs gösterir:
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 () tarafından Services/StartupHostedService başlatıldı. Görevin sonunda olarak StartupHostedServiceHealthCheck.StartupTaskCompleted true 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()
{
}
}
Durum denetimi, barındırılan AddCheck Startup.ConfigureServices hizmetle birlikte içinde kaydedilir. Barındırılan hizmetin durum denetiminde özelliğini ayarlaması gerekir, çünkü durum denetimi de hizmet kapsayıcısı () içinde LivenessProbeStartup.cs kaydedilir:
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>();
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur. Örnek uygulamada, durum denetimi uç noktaları şu noktada oluşturulur:
/health/readyhazır olma denetimi için. Hazır olma denetimi, durum denetimlerini etiketle sistem durumu denetiminereadyfiltreler./health/livecanlılık denetimi için. Canlılık denetimi, içindeStartupHostedServiceHealthCheckdöndürerekfalsefiltrelemektedirHealthCheckOptions.Predicate(daha fazla bilgi için bkz. Sistem durumu denetimlerini filtreleme)
Aşağıdaki örnek kodda:
- Hazır olma denetimi, 'ready' etiketine sahip tüm kayıtlı denetimleri kullanır.
- ,
Predicatetüm denetimleri dışlar ve 200 Ok dönüşlerini sağlar.
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 bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario liveness
Tarayıcıda /health/ready 15 saniye geçene kadar birkaç kez ziyaret edin. Durum denetimi, ilk Unhealthy 15 saniye için rapor sağlar. 15 saniye sonra uç nokta, barındırılan hizmet tarafından uzun süre çalışan görevin Healthy tamamlanmasını yansıtan raporlar.
Bu örnek ayrıca ilk hazır olma Publisher iki saniyelik gecikmeyle çalışan bir Durum Denetimi denetimi IHealthCheckPublisher (uygulama) oluşturur. Daha fazla bilgi için Durum Denetimi Publisher bakın.
Kubernetes örneği
Kubernetesgibi bir ortamda ayrı hazırlık ve canlılık denetimleri kullanmak yararlıdır. Kubernetes'te, temel alınan veritabanı kullanılabilirliğini test etme gibi istekleri kabul etmek için bir uygulamanın zaman alan başlangıç işi gerçekleştirmesi gerekebilir. Ayrı denetimler kullanmak, orchestrator'ın uygulamanın çalışmasının ancak henüz hazır olmadığının veya uygulamanın başlatılamayıp başlamamış olduğunu ayırt inginger. Kubernetes'te hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerinde Canlılık ve Hazır Olma Yoklamalarını Yapılandırma makalesine bakın.
Aşağıdaki örnek, Kubernetes hazır olma yoklama yapılandırmasını gösterir:
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ı araştırma
Örnek uygulama, özel yanıt yazıcı ile bir bellek durumu denetimi gösteriyor.
MemoryHealthCheck , uygulamanın verilen bellek eşiğinden (örnek uygulamada 1 GB) daha fazla kullandığında düzeyi düşürülmüş durumu raporlar. , HealthCheckResult uygulama için Atık 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));
}
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. 'a geçerek durum denetimi etkinleştirmek yerine AddCheck MemoryHealthCheck , hizmet olarak kaydedilir. Tüm IHealthCheck kayıtlı hizmetler, durum denetimi hizmetleri ve ara yazılım tarafından kullanılabilir. Durum denetimi hizmetlerini Tekli hizmetler olarak kaydetmenizi öneririz.
Örnek CustomWriterStartup.cs uygulamanın içinde:
services.AddHealthChecks()
.AddMemoryHealthCheck("memory");
içinde çağrılarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturulur. Sistem durumu denetimi yürütülürken özel bir JSON yanıtı çıktısı almak için WriteResponse <Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.ResponseWriter> özelliğine bir temsilci sağlanır:
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{
ResponseWriter = WriteResponse
});
}
Temsilci, WriteResponse nesnesini CompositeHealthCheckResult bir JSON nesnesine biçimler ve durum denetimi yanıtı için JSON çıkışı verir. Daha fazla bilgi için Çıktıyı özelleştirme bölümüne bakın.
Örnek uygulamayı kullanarak ölçüm tabanlı araştırmayı özel yanıt yazıcısı çıkışıyla çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario writer
Not
AspNetCore.Diagnostics.HealthChecks , disk depolama ve maksimum değer canlılığı denetimleri dahil olmak üzere ölçüm tabanlı sistem durumu denetimi senaryolarını içerir.
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz veya destekçisi değil.
Bağlantı noktasına göre filtreleme
Sistem RequireHost durumu denetimi isteklerini belirtilen bağlantı noktasıyla kısıtlamak için bağlantı noktasını belirten bir URL MapHealthChecks deseniyle çağrısı. Bu genellikle izleme hizmetleri için bir bağlantı noktasını ortaya çıkarmak için bir 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ırmaktadır. 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çirilebilir. Ayrıca sunucuyu yönetim bağlantı noktası üzerinde istekleri dinleyecek şekilde yapılandırmalısınız.
Yönetim bağlantı noktası yapılandırmasını göstermek üzere örnek uygulamayı kullanmak için dosyayı launchSettings.json bir klasörde Properties oluşturun.
Örnek uygulamanın aşağıdaki dosyası örnek uygulamanın proje dosyalarına dahil değildir Properties/launchSettings.json ve el ile oluşturulmalısınız:
{
"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/"
}
}
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. içinde çağırarak bir durum denetimi uç noktası MapHealthChecks Startup.Configure oluşturun.
Örnek uygulamada, 'de uç RequireHost noktada Startup.Configure çağrısı, yapılandırmadan yönetim bağlantı noktasını belirtir:
endpoints.MapHealthChecks("/health")
.RequireHost($"*:{Configuration["ManagementPort"]}");
Uç noktalar içindeki örnek uygulamada oluşturulur Startup.Configure . Aşağıdaki örnek kodda:
- Hazır olma denetimi ' hazır ' etiketiyle tüm kayıtlı denetimleri kullanır.
- ,
PredicateTüm 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
});
}
Not
launchSettings.jsonYönetim bağlantı noktasını kodda açıkça ayarlayarak örnek uygulamada dosya oluşturmaktan kaçınabilirsiniz. Program.cs HostBuilder Uygulamasının oluşturulduğu yerde, için bir çağrı ekleyin ListenAnyIP ve uygulamanın yönetim bağlantı noktası uç noktasını sağlayın. ' Configure De ManagementPortStartup.cs , ile yönetim bağlantı noktasını belirtin RequireHost :
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");
});
Yönetim bağlantı noktası yapılandırma senaryosunu örnek uygulamayı kullanarak çalıştırmak için, aşağıdaki komutu projenin klasöründen bir komut kabuğu 'ndan yürütün:
dotnet run --scenario port
Bir sistem durumu denetim kitaplığı dağıtma
Bir sistem durumu denetimini kitaplık olarak dağıtmak için:
Arabirimi tek başına sınıf olarak uygulayan bir sistem durumu denetimi yazın IHealthCheck . Sınıf, yapılandırma verilerine erişmek için bağımlılık ekleme (dı), tür etkinleştirme ve adlandırılmış seçenekleri kullanabilir.
Sistem durumu denetimleri mantığı
CheckHealthAsync:data1vedata2araştırma sistem durumu denetimi mantığını çalıştırmak için yönteminde kullanılır.AccessViolationExceptionişlenir.
Bir AccessViolationException gerçekleştiğinde, FailureStatus HealthCheckResult kullanıcıların sistem durumu denetimleri hata durumunu yapılandırmasına izin vermek için ile döndürülü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); } } } }Kullanan uygulamanın yöntemi içinde çağırdığı parametrelere sahip bir genişletme yöntemi yazın
Startup.Configure. Aşağıdaki örnekte, aşağıdaki sistem durumu denetim yöntemi imzasını varsayın:ExampleHealthCheck(string, string, int )Yukarıdaki imza,
ExampleHealthCheckdurumunun sistem durumu denetimi araştırma mantığını işlemek için ek veriler gerektirdiğini gösterir. Veriler, sistem durumu denetimi bir genişletme yöntemiyle kaydedildiğinde sistem durumu denetim örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte, çağıran isteğe bağlı olarak şunları belirtir:- sistem durumu denetim adı (
name). İsenull,example_health_checkkullanılır. - sistem durumu denetimi () için dize veri noktası
data1. - sistem durumu denetimi () için tamsayı veri noktası
data2. İsenull,1kullanılır. - hata durumu ( HealthStatus ). Varsayılan değer:
null.null,HealthStatus.UnhealthyBir hata durumu için raporlandı. - 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)); } }- sistem durumu denetim adı (
Sistem durumu denetimi Publisher
IHealthCheckPublisherHizmet kapsayıcısına eklendiğinde, sistem durumu denetimi sistemi düzenli olarak sistem durumu denetim ve çağrılarınızı yürütülür PublishAsync . Bu, her bir işlemin sistem durumunu belirlemede düzenli aralıklarla izleme sistemini çağırmasını bekleyen, gönderim tabanlı bir sistem durumu izleme sistemi senaryosunda yararlıdır.
IHealthCheckPublisherArabirim tek bir yönteme sahiptir:
Task PublishAsync(HealthReport report, CancellationToken cancellationToken);
HealthCheckPublisherOptions şunları ayarlamanıza izin verir:
- Delay: Örnekleri yürütmeden önce uygulama başladıktan sonra uygulanacak ilk gecikme IHealthCheckPublisher . Gecikme başlangıçta bir kez uygulanır ve sonraki yinelemelere uygulanmaz. Varsayılan değer beş saniyedir.
- Period: IHealthCheckPublisher Yürütme süresi. Varsayılan değer 30 saniyedir.
- Predicate: Predicate
null(Varsayılan) ise, sistem durumu denetimi yayımcı hizmeti tüm kayıtlı sistem durumu denetimlerini çalıştırır. Bir sistem durumu denetimleri alt kümesini çalıştırmak için denetim kümesini filtreleyen bir işlev sağlayın. Koşul her dönem değerlendirilir. - Timeout: Tüm örnekler için sistem durumu denetimlerini yürütmeye yönelik zaman aşımı IHealthCheckPublisher . InfiniteTimeSpanZaman aşımı olmadan yürütmek için kullanın. Varsayılan değer 30 saniyedir.
Örnek uygulamada, bir uygulamadır ReadinessPublisher IHealthCheckPublisher . Sistem durumu denetimi durumu her denetim için günlük düzeyinde günlüğe kaydedilir:
- LogInformationDurum denetim durumu ise, bilgi () Healthy .
- LogErrorDurum ya da ise hata () Degraded Unhealthy .
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, StartupHostedService hazır olma denetimi iki saniyelik başlangıç gecikmesine sahiptir ve denetimi her 30 saniyede bir çalıştırır. Uygulamayı etkinleştirmek için IHealthCheckPublisher örnek, ReadinessPublisher bağımlılık ekleme (dı) kapsayıcısında tek bir hizmet olarak kaydedilir:
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>();
Not
AspNetCore.Diagnostics.HealthChecksApplication Insightsdahil olmak üzere çeşitli sistemler için yayımcılar içerir.
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmaz veya desteklenmez.
Durum denetimlerini Mapperne zaman kısıtla
MapWhenDurum denetimi uç noktaları için istek ardışık düzenini koşullu olarak dallandırmak için kullanın.
Aşağıdaki örnekte, MapWhen uç nokta için BIR get isteği alındığında durum denetimleri ara yazılımını etkinleştirmek üzere istek ardışık düzenini dallandırır 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 Middleware.
ASP.NET Core, uygulama altyapısı bileşenlerinin sistem durumunu raporlamak için sistem durumu denetimleri ve kitaplıkları sunar.
Sistem durumu denetimleri, bir uygulama tarafından HTTP uç noktaları olarak gösterilir. Durum denetimi uç noktaları, çeşitli gerçek zamanlı izleme senaryoları için yapılandırılabilir:
- Sistem durumu araştırmaları, kapsayıcı yöneticileri ve yük dengeleyiciler tarafından bir uygulamanın durumunu denetlemek için kullanılabilir. Örneğin, bir kapsayıcı Orchestrator, sıralı bir dağıtımı kaldırarak veya kapsayıcıyı yeniden başlatarak başarısız olan bir sistem durumu denetimine yanıt verebilir. Yük dengeleyici, trafiği başarısız olan örnekten sağlıklı bir örneğe yönlendirerek sağlıklı olmayan bir uygulamaya tepki verebilir.
- Bellek, disk ve diğer fiziksel sunucu kaynaklarının kullanımı sağlıklı bir durum için izlenebilir.
- Sistem durumu denetimleri, kullanılabilirliği ve normal çalışmayı 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 (nasıl indirileceği)
Örnek uygulama, bu konuda açıklanan senaryoların örneklerini içerir. Örnek uygulamayı belirli bir senaryo için çalıştırmak için, bir komut kabuğunda projenin klasöründen DotNet Run komutunu kullanın. Örnek uygulamayı kullanma hakkında ayrıntılı bilgi için bu konudaki örnek uygulamanın README.MD dosyasına ve senaryo açıklamalarına bakın.
Önkoşullar
Durum denetimleri, genellikle bir uygulamanın durumunu denetlemek için bir dış izleme hizmeti veya kapsayıcı Orchestrator ile birlikte kullanılır. Bir uygulamaya sistem durumu denetimleri eklemeden önce, hangi izleme sisteminin kullanılacağını belirleyin. İzleme sistemi ne tür bir sistem durumu denetimi oluşturulacağını ve bunların uç noktalarını nasıl yapılandıracağınızı belirler.
Microsoft.AspNetCore.App Metapackage 'e başvurun veya pakete bir paket başvurusu ekleyin Microsoft.AspNetCore.Diagnostics.HealthChecks .
Örnek uygulama, çeşitli senaryolar için sistem durumu denetimlerini göstermek üzere başlangıç kodu sağlar. Veritabanı araştırma senaryosu, kullanarak bir veritabanı bağlantısının sistem durumunu denetler AspNetCore.Diagnostics.HealthChecks . DbContext araştırma senaryosu bir EF Core kullanarak bir veritabanını denetler DbContext . Örnek uygulama olan veritabanı senaryolarını araştırmak için:
- Bir veritabanı oluşturur ve bunun bağlantı dizesini appsettings.json dosyada sağlar.
- , Proje dosyasında aşağıdaki paket başvurularına sahiptir:
Not
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmaz veya desteklenmez.
Başka bir sistem durumu denetimi senaryosunda, sistem durumu denetimlerinin bir yönetim bağlantı noktasına nasıl filtreleneceği gösterilir. Örnek uygulama, Yönetim URL 'sini ve yönetim bağlantı noktasını içeren bir Özellikler/launchSettings. JSON dosyası oluşturmanızı gerektirir. Daha fazla bilgi için, bağlantı noktasına göre filtrele bölümüne bakın.
Temel sistem durumu araştırması
Birçok uygulama için, uygulamanın istekleri işleme için kullanılabilirliğini raporlayan temel bir durum araştırma yapılandırması, uygulamanın durumunu öğrenmekiçin yeterlidir.
Temel yapılandırma, sistem durumu denetimi hizmetlerini kaydeder ve sistem durumu denetimleri ara yazılımını çağırarak bir URL uç noktasında bir sistem durumu yanıtı ile yanıt verir. Varsayılan olarak, belirli bir bağımlılığı veya alt sistemi test etmek için belirli bir sistem durumu denetimi kayıtlı değildir. Sistem durumu uç nokta URL 'sinde yanıt veriyorsa, uygulama sağlıklı olarak değerlendirilir. Varsayılan Yanıt yazıcısı, durumu ( HealthStatus ) istemciye geri düz metin yanıtı olarak yazar ve bir HealthStatus.Healthy , HealthStatus.Degraded veya HealthStatus.Unhealthy durum belirtir.
İle sistem durumu denetimi hizmetlerini AddHealthChecks kaydedin Startup.ConfigureServices . İstek işleme ardışık düzeninde bulunan sistem durumu denetimleri ara yazılımı için bir uç nokta ekleyin UseHealthChecks Startup.Configure .
Örnek uygulamada, sistem durumu denetimi uç noktası /health (basicstartup. cs) adresinde oluşturulur:
public class BasicStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app)
{
app.UseHealthChecks("/health");
}
}
Örnek uygulamayı kullanarak temel yapılandırma senaryosunu çalıştırmak için, komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario basic
Docker örneği
Docker HEALTHCHECK , temel sistem durumu denetimi yapılandırmasını kullanan bir uygulamanın durumunu denetlemek için kullanılabilen bir yerleşik yönerge sunar:
HEALTHCHECK CMD curl --fail http://localhost:5000/health || exit
Durum denetimleri oluşturma
Sistem durumu denetimleri, arabirimini uygulayarak oluşturulur IHealthCheck . CheckHealthAsyncYöntemi HealthCheckResult , sistem durumunu, veya olarak belirten bir Healthy döndürür Degraded Unhealthy . Sonuç yapılandırılabilir bir durum kodu ile 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.
Örnek sistem durumu denetimi
Aşağıdaki ExampleHealthCheck sınıf, bir sistem durumu denetiminin yerleşimini gösterir. Durum denetimleri mantığı CheckHealthAsync yöntemine yerleştirilir. Aşağıdaki örnek, öğesini olarak bir kukla değişkenini ayarlar healthCheckResultHealthy true . Değeri healthCheckResultHealthy olarak ayarlanırsa false , HealthCheckResult.Unhealthy durum 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("The check indicates a healthy result."));
}
return Task.FromResult(
HealthCheckResult.Unhealthy("The check indicates an unhealthy result."));
}
}
Sistem durumu denetimi hizmetlerini Kaydet
ExampleHealthCheckTürü, ile içindeki sistem durumu denetimi hizmetlerine eklenir Startup.ConfigureServices AddCheck :
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>("example_health_check");
AddCheckAşağıdaki örnekte gösterilen aşırı yükleme, HealthStatus durum denetimi bir hata bildirdiğinde hata durumu () öğesini raporlamak üzere ayarlar. Hata durumu null (varsayılan) olarak ayarlandıysa, HealthStatus.Unhealthy raporlanır. Bu aşırı yükleme, kitaplık yazarları için yararlı bir senaryodur. burada, sistem durumu denetimi uygulaması ayarı varsa, bir sistem durumu denetimi hatası oluştuğunda, kitaplık tarafından belirtilen başarısızlık durumu uygulama tarafından zorlanır.
Etiketler , sistem durumu denetimlerini filtrelemek için kullanılabilir ( durum denetimleri filtreleme 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şlevi de yürütebilir. Aşağıdaki Startup.ConfigureServices örnekte, sistem durumu denetim adı olarak belirtilir Example ve denetim her zaman sağlıklı bir durum döndürür:
services.AddHealthChecks()
.AddCheck("Example", () =>
HealthCheckResult.Healthy("Example is OK!"), tags: new[] { "example" });
Sistem durumu denetimleri ara yazılımı kullan
İçinde Startup.Configure , UseHealthChecks işlem ardışık düzeninde uç nokta URL 'si veya göreli yol ile çağrı yapın:
app.UseHealthChecks("/health");
Durum denetimlerinin belirli bir bağlantı noktasını dinlemesi gerekiyorsa, UseHealthChecks bağlantı noktasını ayarlamak için bir aşırı yüklemesi kullanın ( bağlantı noktasına göre filtrele bölümünde anlatılmıştır):
app.UseHealthChecks("/health", port: 8000);
Sistem durumu denetimi seçenekleri
HealthCheckOptions sistem durumu denetimi davranışını özelleştirmek için bir fırsat sağlayın:
- Durum denetimlerini filtrele
- HTTP durum kodunu özelleştirme
- Önbellek üstbilgilerini gösterme
- Çıktıyı özelleştirme
Durum denetimlerini filtrele
Varsayılan olarak, sistem durumu denetimleri ara yazılımı tüm kayıtlı sistem durumu denetimlerini çalıştırır. Bir sistem durumu denetimleri alt kümesini çalıştırmak için, seçeneğe Boole değeri döndüren bir işlev sağlayın Predicate . Aşağıdaki örnekte, Bar sistem durumu denetimi bar_tag işlevin koşullu deyimindeki etiketiyle () tarafından filtrelenir, burada true yalnızca sistem durumu denetiminin Tags özelliği eşleşiyorsa döndürülür foo_tag baz_tag .
using System.Threading.Tasks;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.Diagnostics.HealthChecks;
public void ConfigureServices(IServiceCollection services)
{
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" });
}
public void Configure(IApplicationBuilder app)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
Predicate = (check) => check.Tags.Contains("foo_tag") ||
check.Tags.Contains("baz_tag")
});
}
HTTP durum kodunu özelleştirme
ResultStatusCodesSistem durumunun http durum kodlarına eşlenmesini özelleştirmek için kullanın. Aşağıdaki StatusCodes atamalar, ara yazılım tarafından kullanılan varsayılan değerlerdir. Durum kodu değerlerini gereksinimlerinize uyacak şekilde değiştirin.
Startup.Configure içinde:
//using Microsoft.AspNetCore.Diagnostics.HealthChecks;
//using Microsoft.Extensions.Diagnostics.HealthChecks;
app.UseHealthChecks("/health", new HealthCheckOptions()
{
ResultStatusCodes =
{
[HealthStatus.Healthy] = StatusCodes.Status200OK,
[HealthStatus.Degraded] = StatusCodes.Status200OK,
[HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
}
});
Önbellek üstbilgilerini gösterme
AllowCachingResponses Sistem durumu denetimlerinin, yanıt önbelleğini engellemek için araştırma yanıtına HTTP üstbilgileri ekleyip eklemediğini denetler. Değer false (varsayılan) ise, ara yazılım, Cache-Control Expires Pragma yanıt önbelleğe almayı engellemek için,, ve üst bilgilerini ayarlar veya geçersiz kılar. Değer ise true , ara yazılım yanıtın önbellek üstbilgilerini değiştirmez.
Startup.Configure içinde:
//using Microsoft.AspNetCore.Diagnostics.HealthChecks;
//using Microsoft.Extensions.Diagnostics.HealthChecks;
app.UseHealthChecks("/health", new HealthCheckOptions()
{
AllowCachingResponses = false
});
Çıktıyı özelleştirme
ResponseWriterSeçeneği, yanıtı yazmak için kullanılan bir temsilciyi alır veya ayarlar. Varsayılan temsilci, dize değeri olan en az bir düz metin yanıtı yazar HealthReport.Status .
Startup.Configure içinde:
// using Microsoft.AspNetCore.Diagnostics.HealthChecks;
// using Microsoft.Extensions.Diagnostics.HealthChecks;
app.UseHealthChecks("/health", new HealthCheckOptions()
{
ResponseWriter = WriteResponse
});
Varsayılan temsilci, dize değeri olan en az bir düz metin yanıtı yazar HealthReport.Status . Aşağıdaki özel temsilci, WriteResponse Özel BIR JSON yanıtı verir:
private static Task WriteResponse(HttpContext httpContext, HealthReport result)
{
httpContext.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 httpContext.Response.WriteAsync(
json.ToString(Formatting.Indented));
}
Durum denetimleri sistemi, karmaşık JSON dönüş biçimleri için yerleşik destek sağlamaz çünkü biçim, sizin tercih ettiğiniz izleme sistemine özgüdür. JObjectGereksinimlerinizi karşılamak için gereken önceki örnekteki ' i özelleştirebilirsiniz.
Veritabanı araştırması
Bir sistem durumu denetimi, veritabanının normal olarak yanıt verip vermediğini göstermek üzere Boole testi olarak çalışacak bir veritabanı sorgusu belirtebilir.
örnek uygulama, AspNetCore.Diagnostics.HealthChecks bir SQL Server veritabanında sistem durumu denetimi gerçekleştirmek için ASP.NET Core uygulamalar için bir sistem durumu denetim kitaplığı kullanır. AspNetCore.Diagnostics.HealthChecks veritabanına SELECT 1 yönelik bağlantının sağlıklı olduğunu doğrulamak için veritabanında bir sorgu yürütür.
Uyarı
Bir sorgu ile bir veritabanı bağlantısı denetlerken, hızlı bir şekilde dönen bir sorgu seçin. Sorgu yaklaşımı, veritabanını aşırı yükleme ve performansını düşürmeye yönelik riski çalıştırır. Çoğu durumda, test sorgusunun çalıştırılması gerekli değildir. Yalnızca veritabanına başarılı bir bağlantı oluşturmak yeterlidir. Bir sorgu çalıştırmak için gerekli olduğunu fark ederseniz, gibi basit bir seçme sorgusu seçin SELECT 1 .
İçin bir paket başvurusu ekleyin AspNetCore.HealthChecks.SqlServer .
Örnek uygulama dosyasında geçerli bir veritabanı bağlantı dizesi sağlayın appsettings.json . uygulama, adında bir SQL Server veritabanı kullanır HealthCheckSample :
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=HealthCheckSample;Trusted_Connection=True;MultipleActiveResultSets=true;ConnectRetryCount=0"
},
"Logging": {
"LogLevel": {
"Default": "Debug"
},
"Console": {
"IncludeScopes": "true"
}
}
}
İle sistem durumu denetimi hizmetlerini AddHealthChecks kaydedin Startup.ConfigureServices . Örnek uygulama, AddSqlServer yöntemini veritabanının bağlantı dizesiyle (Dbhealthstartup. cs) çağırır:
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks()
.AddSqlServer(Configuration["ConnectionStrings:DefaultConnection"]);
}
İçindeki uygulama işleme ardışık düzeninde bulunan sistem durumu denetimleri ara yazılımı Startup.Configure :
app.UseHealthChecks("/health");
Örnek uygulamayı kullanarak veritabanı araştırma senaryosunu çalıştırmak için, bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario db
Not
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmaz veya desteklenmez.
DbContext araştırması Entity Framework Core
DbContextDenetim, uygulamanın bir EF Core için yapılandırılmış veritabanıyla iletişim kurabildiğini onaylar DbContext . DbContextDenetim şu uygulamalar için desteklenir:
- Entity Framework (EF) Corekullanın.
- İçin bir paket başvurusu ekleyin
Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.
AddDbContextCheck<TContext> için bir sistem durumu denetimi kaydeder DbContext . , DbContext Yöntemi olarak olarak sağlanır TContext . Hata durumu, Etiketler ve özel bir test sorgusunu yapılandırmak için aşırı yükleme kullanılabilir.
Varsayılan olarak:
DbContextHealthCheckEF CoreCanConnectAsyncyöntemini çağırır. Yöntem aşırı yüklerini kullanarak sistem durumunu denetlerken hangi işlemin çalıştırılacağını özelleştirebilirsinizAddDbContextCheck.- Sistem durumu denetiminin adı,
TContexttürün adıdır.
Örnek uygulamada, AppDbContext AddDbContextCheck içinde bir hizmet olarak sağlanır ve hizmet olarak kaydedilir Startup.ConfigureServices (dbcontexthealthstartup. cs):
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks()
.AddDbContextCheck<AppDbContext>();
services.AddDbContext<AppDbContext>(options =>
{
options.UseSqlServer(
Configuration["ConnectionStrings:DefaultConnection"]);
});
}
Örnek uygulamada, UseHealthChecks Içindeki sistem durumu denetimleri ara yazılımını ekler Startup.Configure .
app.UseHealthChecks("/health");
DbContextörnek uygulamayı kullanarak araştırma senaryosunu çalıştırmak için, bağlantı dizesi tarafından belirtilen veritabanının SQL Server örneğinde mevcut olmadığından emin olun. Veritabanı varsa, silin.
Komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario dbcontext
Uygulama çalıştıktan sonra, bir tarayıcıda uç noktaya istek yaparak sistem durumunu kontrol edin /health . Veritabanı ve AppDbContext yok, uygulama aşağıdaki yanıtı sağlar:
Unhealthy
Veritabanını oluşturmak için örnek uygulamayı tetikleyin. İçin bir istek yapın /createdatabase . Uygulama yanıt veriyor:
Creating the database...
Done!
Navigate to /health to see the health status.
Uç noktaya bir istek oluşturun /health . Veritabanı ve bağlam var, bu nedenle uygulama yanıt veriyor:
Healthy
Veritabanını silmek için örnek uygulamayı tetikleyin. İçin bir istek yapın /deletedatabase . Uygulama yanıt veriyor:
Deleting the database...
Done!
Navigate to /health to see the health status.
Uç noktaya bir istek oluşturun /health . Uygulama sağlıksız bir yanıt sağlar:
Unhealthy
Ayrı hazırlık ve lizlilik araştırmaları
Bazı barındırma senaryolarında iki uygulama durumunu ayırt eden bir çift sistem durumu denetimi kullanılır:
- Hazırlık , uygulamanın normal çalışıp çalışmadığını ancak istekleri almaya hazır olmadığını gösterir.
- Lida bir uygulamanın kilitlenip yeniden başlatılması gerekip gerekmediğini gösterir.
Aşağıdaki örneği göz önünde bulundurun: bir uygulamanın istekleri işlemeye hazırlanmadan önce büyük bir yapılandırma dosyasını indirmesi gerekir. Uygulamanın dosyayı birkaç kez indirmeyi yeniden denemesini sağladığından, ilk indirme işlemi başarısız olursa uygulamanın yeniden başlatılmasını istemiyoruz. İşlemin desteklerini betimleyen, ek denetimler gerçekleştirilmeyen bir araştırma kullanıyoruz. Yapılandırma dosyası indirmesi başarılı olmadan önce isteklerin uygulamaya gönderilmesini de engellemek istiyoruz. İndirme başarılı olana ve uygulama istekleri almaya hazır olana kadar "hazır değil" durumunu belirtmek için bir hazırlık yoklama kullanırsınız.
Örnek uygulama, Barındırılan Hizmette uzun süre çalışan başlangıç görevinin tamamlanmasını rapor etmek için bir durum denetimi içerir. , uzun süre çalışan görevi tamamlandığında barındırılan hizmetin olarak ayarlandırmış olduğu bir özelliğini StartupHostedServiceHealthCheck StartupTaskCompleted true (StartupHostedServiceHealthCheck.cs) gösterir:
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 (Hizmetler/StartupHostedService ) tarafından başlatıldı. Görevin sonunda olarak StartupHostedServiceHealthCheck.StartupTaskCompleted true 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()
{
}
}
Durum denetimi, barındırılan AddCheck Startup.ConfigureServices hizmetle birlikte içinde kaydedilir. Barındırılan hizmetin durum denetiminde özelliğini ayarlaması gerekir, çünkü durum denetimi de hizmet kapsayıcısı (LivenessProbeStartup.cs) içinde kaydedilir:
public void ConfigureServices(IServiceCollection services)
{
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");
});
// The following workaround permits adding an IHealthCheckPublisher
// instance to the service container when one or more other hosted
// services have already been added to the app. This workaround
// won't be required with the release of ASP.NET Core 3.0. For more
// information, see: https://github.com/aspnet/Extensions/issues/639.
services.TryAddEnumerable(
ServiceDescriptor.Singleton(typeof(IHostedService),
typeof(HealthCheckPublisherOptions).Assembly
.GetType(HealthCheckServiceAssembly)));
services.AddSingleton<IHealthCheckPublisher, ReadinessPublisher>();
}
uygulamasındaki uygulama işleme işlem hattında Sistem Durumu Denetimleri Ara Yazılımı'nın çağrısı. Startup.Configure Örnek uygulamada, hazır olma denetimi ve canlılık denetimi için 'de durum /health/ready /health/live denetimi uç noktaları oluşturulur. Hazır olma denetimi, sistem durumu denetimlerini etiketle birlikte sistem durumu denetimine ready filtreler. Canlılık denetimi, içinde StartupHostedServiceHealthCheck döndürerek false filtrelemektedir HealthCheckOptions.Predicate (daha fazla bilgi için bkz. Sistem durumu denetimlerini filtreleme):
app.UseHealthChecks("/health/ready", new HealthCheckOptions()
{
Predicate = (check) => check.Tags.Contains("ready"),
});
app.UseHealthChecks("/health/live", new HealthCheckOptions()
{
Predicate = (_) => false
});
Hazırlık/canlılık yapılandırma senaryosunu örnek uygulamayı kullanarak çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario liveness
Tarayıcıda /health/ready 15 saniye geçene kadar birkaç kez ziyaret edin. Durum denetimi, ilk 15 saniye için Sağlıksız durumunu raporlar. 15 saniye sonra uç nokta, barındırılan hizmet tarafından uzun süre çalışan görevin tamamlanmasını yansıtan Sağlıklı 'yi raporlar.
Bu örnek ayrıca ilk hazır olma Publisher iki saniyelik gecikmeyle çalışan bir Durum Denetimi denetimi IHealthCheckPublisher (uygulama) oluşturur. Daha fazla bilgi için Durum Denetimi Publisher bakın.
Kubernetes örneği
Kubernetesgibi bir ortamda ayrı hazırlık ve canlılık denetimleri kullanmak yararlıdır. Kubernetes'te, temel alınan veritabanı kullanılabilirliğini test etme gibi istekleri kabul etmek için bir uygulamanın zaman alan başlangıç işi gerçekleştirmesi gerekebilir. Ayrı denetimler kullanmak, orchestrator'ın uygulamanın çalışmasının ancak henüz hazır olmadığının veya uygulamanın başlatılamayıp başlamamış olduğunu ayırt inginger. Kubernetes'te hazır olma ve canlılık yoklamaları hakkında daha fazla bilgi için Kubernetes belgelerinde Canlılık ve Hazır Olma Yoklamalarını Yapılandırma makalesine bakın.
Aşağıdaki örnek, Kubernetes hazır olma yoklama yapılandırmasını gösterir:
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ı araştırma
Örnek uygulama, özel yanıt yazıcısı ile bir bellek durumu denetimi gösteriyor.
MemoryHealthCheck uygulama, verilen bir bellek eşiğinden (örnek uygulamada 1 GB) fazla kullanıyorsa iyi durumda olmayan bir durum raporlar. , HealthCheckResult uygulama için Atık 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 : HealthStatus.Unhealthy;
return Task.FromResult(new HealthCheckResult(
status,
description: "Reports degraded status if allocated bytes " +
$">= {options.Threshold} bytes.",
exception: null,
data: data));
}
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. 'a geçerek durum denetimi etkinleştirmek yerine AddCheck MemoryHealthCheck , hizmet olarak kaydedilir. Tüm IHealthCheck kayıtlı hizmetler, durum denetimi hizmetleri ve ara yazılım tarafından kullanılabilir. Durum denetimi hizmetlerini Tekli hizmetler olarak kaydetmenizi öneririz.
Örnek uygulamada (CustomWriterStartup.cs):
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks()
.AddMemoryHealthCheck("memory");
}
uygulamasındaki uygulama işleme işlem hattında Sistem Durumu Denetimleri Ara Yazılımı'nın çağrısı. Startup.Configure Durum WriteResponse denetimi yürütülürken ResponseWriter özel bir JSON yanıtı çıkışı için özelliğine bir temsilci sağlanır:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// This custom writer formats the detailed status as JSON.
ResponseWriter = WriteResponse
});
}
yöntemi, WriteResponse nesnesini CompositeHealthCheckResult bir JSON nesnesine biçimler ve durum denetimi yanıtı için JSON çıkışı verir:
private static Task WriteResponse(HttpContext httpContext,
HealthReport result)
{
httpContext.Response.ContentType = "application/json; charset=utf-8";
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 httpContext.Response.WriteAsync(
json.ToString(Formatting.Indented));
}
Örnek uygulamayı kullanarak ölçüm tabanlı araştırmayı özel yanıt yazıcısı çıkışıyla çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario writer
Not
AspNetCore.Diagnostics.HealthChecks , disk depolama ve en yüksek değer canlılığı denetimleri dahil olmak üzere ölçüm tabanlı sistem durumu denetimi senaryolarını içerir.
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmz veya desteklenmiyor.
Bağlantı noktasına göre filtreleme
Bağlantı UseHealthChecks noktasıyla çağrısı yapmak, durum denetimi isteklerini belirtilen bağlantı noktasıyla kısıtlar. Bu genellikle izleme hizmetleri için bir bağlantı noktasını ortaya çıkarmak için bir 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ırmaktadır. Bağlantı noktası launchSettings.json dosyasında ayarlanır ve bir ortam değişkeni aracılığıyla yapılandırma sağlayıcısına geçirilebilir. Ayrıca sunucuyu yönetim bağlantı noktası üzerinde istekleri dinleyecek şekilde yapılandırmalısınız.
Yönetim bağlantı noktası yapılandırmasını göstermek üzere örnek uygulamayı kullanmak için bir Properties klasöründe launchSettings.json dosyasını oluşturun.
Örnek uygulamanın proje dosyalarına aşağıdaki Properties/launchSettings.json dosyası dahil değildir ve el ile oluşturulmalısınız:
{
"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/"
}
}
}
'de ile durum denetimi hizmetlerini AddHealthChecks Startup.ConfigureServices kaydetme. için çağrısı UseHealthChecks yönetim bağlantı noktasını belirtir (ManagementPortStartup.cs):
public class ManagementPortStartup
{
public ManagementPortStartup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", port: Configuration["ManagementPort"]);
app.Run(async (context) =>
{
await context.Response.WriteAsync(
"Navigate to " +
$"http://localhost:{Configuration["ManagementPort"]}/health " +
"to see the health status.");
});
}
}
Not
Url'leri ve yönetim bağlantı noktasını kodda açıkça ayarlayarak örnek uygulamada launchSettings.json dosyasını oluşturmaktan kaçınabilirsiniz. uygulamasının oluşturularak Program.cs'ye bir çağrı ekleyin ve uygulamanın normal yanıt uç noktasını ve yönetim bağlantı WebHostBuilder noktası uç noktasını UseUrls ekleyin. ManagementPortStartup.cs içinde burada UseHealthChecks çağrılır, yönetim bağlantı noktasını açıkça belirtin.
Program.cs:
return new WebHostBuilder()
.UseConfiguration(config)
.UseUrls("http://localhost:5000/;http://localhost:5001/")
.ConfigureLogging(builder =>
{
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddConfiguration(config);
builder.AddConsole();
})
.UseKestrel()
.UseStartup(startupType)
.Build();
ManagementPortStartup.cs:
app.UseHealthChecks("/health", port: 5001);
Örnek uygulamayı kullanarak yönetim bağlantı noktası yapılandırma senaryosunu çalıştırmak için bir komut kabuğunda projenin klasöründen aşağıdaki komutu yürütün:
dotnet run --scenario port
Durum denetimi kitaplığını dağıtma
Bir durum denetimlerini kitaplık olarak dağıtmak için:
Arabirimi tek başına sınıf olarak uygulayan IHealthCheck bir durum denetimi yazın. sınıfı yapılandırma verilerine erişmek için bağımlılık eklemeye (DI), tür etkinleştirmeye ve adlandırılmış seçeneklere güvenebilirsiniz.
sistem durumu denetimi
CheckHealthAsyncmantığında:data1``data2ve , yoklamanın durum denetimi mantığını çalıştırmak için yönteminde kullanılır.AccessViolationExceptionişlandı.
Bir AccessViolationException oluştuğunda, ile FailureStatus birlikte döndürülür ve kullanıcıların sistem durumunu HealthCheckResult yapılandırmalarına izin vermek için hata durumunu denetler.
using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Diagnostics.HealthChecks; 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); } } }Tüketen uygulamanın yönteminde çağıran parametrelerle bir genişletme yöntemi
Startup.Configureyazın. Aşağıdaki örnekte, aşağıdaki durum denetimi yöntemi imzasını varsayyın:ExampleHealthCheck(string, string, int )Yukarıdaki imza, sistem durumu denetimi
ExampleHealthCheckyoklama mantığını işlemeye ek veriler gerektirdiğini gösterir. Veriler, durum denetimi bir uzantı yöntemiyle kayded olduğunda durum denetimi örneğini oluşturmak için kullanılan temsilciye sağlanır. Aşağıdaki örnekte çağıranı isteğe bağlı olarak belirtir:- sistem durumu denetimi adı (
name).nullexample_health_checkkullanılırsa. - sistem durumu denetimi için dize veri noktası (
data1). - sistem durumu denetimi için tamsayı veri noktası (
data2).null1kullanılırsa. - hata durumu ( HealthStatus ). Varsayılan değer:
null. ise,nullbir hata durumu içinHealthStatus.Unhealthyraporlandı. - tags (
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)); } }- sistem durumu denetimi adı (
Durum Denetimi Publisher
Hizmet IHealthCheckPublisher kapsayıcısı için bir eklenmiştir, sistem durumu denetim sistemi düzenli aralıklarla sistem durumu denetimlerinizi ve çağrılarınızı PublishAsync sonuçla yürütür. Bu, sistem durumunu belirlemek için her bir işlemi düzenli aralıklarla izleme sistemini çağıran bir anında durum izleme sistemi senaryosunda kullanışlıdır.
Arabirimin IHealthCheckPublisher tek bir yöntemi vardır:
Task PublishAsync(HealthReport report, CancellationToken cancellationToken);
HealthCheckPublisherOptions şunları ayarlamaya olanak sağlayacak:
- Delay: Örnekler yürütülmeden önce uygulama başladıktan sonra uygulanan ilk IHealthCheckPublisher gecikme. Gecikme başlangıçta bir kez uygulanır ve sonraki yinelemeler için geçerli değildir. Varsayılan değer beş saniyedir.
- Period: Yürütme IHealthCheckPublisher süresi. Varsayılan değer 30 saniyedir.
- Predicate: Ise Predicate
null(varsayılan), 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 filtreleen bir işlev sağlar. Her dönem için bu süre değerlendirilir. - Timeout: Tüm örnekler için sistem durumu denetimlerini yürütmek için IHealthCheckPublisher zaman aşımı. Zaman InfiniteTimeSpan aşımı olmadan yürütmek için kullanın. Varsayılan değer 30 saniyedir.
Uyarı
ASP.NET Core 2.2 yayında, ayarı uygulama tarafından kabul Period IHealthCheckPublisher değil; değerini Delay ayarlar. Bu sorun 3.0 ASP.NET Core giderildi.
Örnek uygulamada bir ReadinessPublisher IHealthCheckPublisher uygulamadır. Sistem durumu denetimi durumu her denetim için şu iki durumdan biri olarak günlüğe kaydedilir:
- Sistem durumu denetimi durumu ise Bilgi ( LogInformation ) Healthy .
- Durum veya ise Hata ( LogError Degraded ) Unhealthy .
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 uygulama örneğinde hazır olma denetiminde iki saniyelik başlatma gecikmesi vardır ve LivenessProbeStartup StartupHostedService denetimi 30 saniyede bir çalıştırır. Uygulama etkinleştirmek IHealthCheckPublisher için örnek, bağımlılık ekleme ReadinessPublisher (DI) kapsayıcısı içinde tek bir hizmet olarak kaydolr:
public void ConfigureServices(IServiceCollection services)
{
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");
});
// The following workaround permits adding an IHealthCheckPublisher
// instance to the service container when one or more other hosted
// services have already been added to the app. This workaround
// won't be required with the release of ASP.NET Core 3.0. For more
// information, see: https://github.com/aspnet/Extensions/issues/639.
services.TryAddEnumerable(
ServiceDescriptor.Singleton(typeof(IHostedService),
typeof(HealthCheckPublisherOptions).Assembly
.GetType(HealthCheckServiceAssembly)));
services.AddSingleton<IHealthCheckPublisher, ReadinessPublisher>();
}
Not
Aşağıdaki geçici çözüm, IHealthCheckPublisher uygulamaya bir veya daha fazla barındırılan hizmet zaten eklenmiş olduğunda hizmet kapsayıcısına bir örnek eklenmesine izin verir. bu geçici çözüm ASP.NET Core 3,0 ' de gerekli değildir.
private const string HealthCheckServiceAssembly =
"Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckPublisherHostedService";
services.TryAddEnumerable(
ServiceDescriptor.Singleton(typeof(IHostedService),
typeof(HealthCheckPublisherOptions).Assembly
.GetType(HealthCheckServiceAssembly)));
Not
AspNetCore.Diagnostics.HealthChecksApplication Insightsdahil olmak üzere çeşitli sistemler için yayımcılar içerir.
AspNetCore.Diagnostics.HealthChecks Microsoft tarafından korunmaz veya desteklenmez.
Durum denetimlerini Mapperne zaman kısıtla
MapWhenDurum denetimi uç noktaları için istek ardışık düzenini koşullu olarak dallandırmak için kullanın.
Aşağıdaki örnekte, MapWhen uç nokta için BIR get isteği alındığında durum denetimleri ara yazılımını etkinleştirmek üzere istek ardışık düzenini dallandırır api/HealthCheck :
app.MapWhen(
context => context.Request.Method == HttpMethod.Get.Method &&
context.Request.Path.StartsWith("/api/HealthCheck"),
builder => builder.UseHealthChecks());
app.UseMvc();
Daha fazla bilgi için bkz. ASP.NET Core Middleware.