AspNetCore 2.2 新特性---HealthCheck


網站部署上線后, 總是擔心網站是否工作正常, 內存壓力是否很大, CPU是否超負荷了?當然, 我們有一大套系統, perfromance counter, 監控軟件來監視運維生產系統。但是這些第三方軟件,不是要錢就是很難用。有時候,我們只是給客戶上線一個小網站,完全沒有時間,也沒有興趣去搭建一套完整的監控系統。

當然,自己寫一個WebAPI, 向外部報告自己內部的狀況,已經相關聯的第三方軟件(如SQL, redis)的狀況, 不復雜但也不是一兩個小時候就可以寫好的,很多時候犯懶就不寫了。

HealthAPI一般不希望無關人員查看, 可以通過AspNetCore 限流中間件IpRateLimitMiddleware 介紹 來限制特定IP可以訪問。

AspNetCore 2.2中提供了一系列pakcage, 只要幾行代碼,就可以很簡單實現網站健康狀況報告,沒有理由不提供內部health報告了。而且Docker越來越流行了,Kubernetes管理容器,也許要知道容器是否出現問題需要重啟, 也需要提供一個標准方法,告訴外部,容器內部狀態。

簡單應用

只要注冊服務AddHealthChecks, 然后在app.UseHealthChecks("/health"); 開啟端點報告內部狀態。

        public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHealthChecks("/health"); app.Run(async (context) => { await context.Response.WriteAsync( "Navigate to /health to see the health status."); }); } 

訪問端口 /Health 的返回結果為
Healthy
這是最基礎的Health端口,好像沒什么功能, 稍安勿躁,馬上就有更精彩的。。。

報告外部依賴項的健康狀況

程序運行需要內存, cpu,需要磁盤空間, 現在的網站更是依賴於各種各樣的第三方系統, 比如:數據庫, 緩存等等。這些東西如果不正常,我們的網站也不可能正常運行。好消息是, ASPNetCore提供了大量的輔助類型,來提供這些系統是否正常:

首先需要安裝下面的nuget包
Install-Package AspNetCore.HealthChecks.System
Install-Package AspNetCore.HealthChecks.Network
Install-Package AspNetCore.HealthChecks.SqlServer
Install-Package AspNetCore.HealthChecks.MongoDb
Install-Package AspNetCore.HealthChecks.Npgsql
Install-Package AspNetCore.HealthChecks.Redis
Install-Package AspNetCore.HealthChecks.AzureStorage
Install-Package AspNetCore.HealthChecks.AzureServiceBus
Install-Package AspNetCore.HealthChecks.MySql
Install-Package AspNetCore.HealthChecks.DocumentDb
Install-Package AspNetCore.HealthChecks.SqLite
Install-Package AspNetCore.HealthChecks.Kafka
Install-Package AspNetCore.HealthChecks.RabbitMQ
Install-Package AspNetCore.HealthChecks.IdSvr
Install-Package AspNetCore.HealthChecks.DynamoDB
Install-Package AspNetCore.HealthChecks.Oracle
Install-Package AspNetCore.HealthChecks.Uris

        public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks() //System .AddPrivateMemoryHealthCheck(1000_000_000L) //最大私有內存不超過1GB .AddVirtualMemorySizeHealthCheck(1000_000_000L) //最大虛擬內存不超過1GB .AddWorkingSetHealthCheck(1000_000_000L)//最大工作內存不超過1GB .AddDiskStorageHealthCheck( x=> x.AddDrive("c",1000_000_000L)) //C盤需要超過1GB自由空間 //network .AddSmtpHealthCheck(x => { x.Host = "mailserver"; x.Port = 110; x.ConnectionType = SmtpConnectionType.TLS; }) //檢查郵件服務器是否正常 //sqlserver .AddSqlServer("ConnectionStrings"); //redis .AddRedis("RedisServerLink") ; } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHealthChecks("/health", new HealthCheckOptions { ResponseWriter = async (context, report) => { var result = JsonConvert.SerializeObject( new { status = report.Status.ToString(), errors = report.Entries.Select(e => new { key = e.Key, value = Enum.GetName(typeof(HealthStatus), e.Value.Status) }) }); context.Response.ContentType = MediaTypeNames.Application.Json; await context.Response.WriteAsync(result); } }); app.Run(async (context) => { await context.Response.WriteAsync( "Navigate to /health to see the health status."); }); } 

很棒吧, 一下就可以知道應用是否正常, 如果不正常,是因為什么不正常。 如果是內存, cpu過高, 也許需要重啟一下。

自定義健康檢查

預定義的health檢查器用起來很棒, 但是總是會有一些特殊要求, 比如我們要檢查內部工作隊列是否太大, 啟用的線程是否太多等, 這就需要自己寫Health檢查器。 好消息是, 只要實現IHealthCheck這個接口就好。

public class WorkQueueHealthCheck : IHealthCheck { private readonly IOptionsMonitor<WorkQueueCheckOptions> _options; public WorkQueueHealthCheck(IOptionsMonitor<WorkQueueCheckOptions> options) { _options = options; } public string Name => "工作隊列檢查"; public Task<HealthCheckResult> CheckHealthAsync( HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken)) { HealthStatus status = HealthStatus.Healthy; if (staticQueues.Length > 10000) { status = HealthStatus.Unhealthy; //待處理的任務太多了, 不健康了。 }else if (staticQueues.Length > 1000) { status = HealthStatus.Degraded; //待處理的任務有點多, 降級了。 } var data = new Dictionary<string, object>() { { "當前工作隊列長度", staticQueues.Length }, }; return Task.FromResult(new HealthCheckResult( status, description: "報告內部工作隊列情況", exception: null, data: data)); } } public static class HealthCheckBuilderExtensions { public static IHealthChecksBuilder AddWorkQueueHealthCheck( this IHealthChecksBuilder builder, string name, HealthStatus? failureStatus = null, IEnumerable<string> tags = null, long? thresholdInBytes = null) { // Register a check of type GCInfo. builder.AddCheck<WorkQueueHealthCheck>( name, failureStatus ?? HealthStatus.Degraded, tags); return builder; } } 

定義好自己的健康檢查擴展以后, 只需要像使用預定義的擴展一樣,非常方便。

services.AddHealthChecks()
.AddPrivateMemoryHealthCheck(“workQueue”) //檢查工作隊列

參考自Health checks in ASP.NET Core

 
 
15人點贊
 
ASPNET

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM