上篇咱們講了如何使用App Metrics 作一個簡單的APM監控,最後提到過健康檢查這個東西.html
這篇主要就是講解健康檢查的內容.git
沒看過上篇的,請移步:ASP.NET Core之跨平臺的實時性能監控github
首先咱們來了解一下什麼是健康檢查(health checks)?數據庫
健康檢查,其實這個名稱已經很明確了,它是檢查你的應用程序是否健康運行的一種方式。隨着當前各種項目愈來愈多的應用程序正在轉向微服務式架構,健康檢查就變得尤其關鍵。雖然微服務體系結構具備許多好處,但其中一個缺點就是爲了確保全部這些服務都正常運行的操做開銷更高。你不在是監視一個龐大的總體項目的健康情況,而是須要監控許多不一樣服務的狀態,甚至這些服務一般只負責一件事情。健康檢查(Heatlh Checks)一般與一些服務發現工具結合使用,如Consul ,來監控您的微服務器,來觀測您的服務是否健康運行。服務器
健康檢查有不少種不一樣的方法,但最多見的方法是將HTTP端點暴露給專門用於健康檢查的應用程序。通常來講,若是一切狀況都很好,你的服務將返回200的狀態碼,然而任何非200的代碼則意味着出現問題。例如,若是發生錯誤,你可能會返回500以及一些出錯的JSON信息。架構
你的健康檢查將基於你的應用程序或者你的微服務主要在作寫什麼事情,就檢查什麼.app
不過咱們也能夠舉例一些常見的健康檢查內容:ide
下面咱們就來說解一下,如何使用App Metrics來實現咱們的健康檢查.微服務
效果如圖:工具
這裏就不建立新的項目了,直接拿上個項目的例子來寫.
App Metrics中的健康檢查分爲3種狀態:
1.健康(綠),2.亞健康(黃),3.不健康(紅). 顏色如上圖所示
也含有一些內置的健康檢查(後面講解),咱們先來說一下如何自行建立健康檢查
首先咱們在Demo中建立一個健康檢查的文件夾(固然,也能夠是類庫)
建立類,取名爲 OKHealthCheck,繼承HealthCheck(引用:using App.Metrics.Health),代碼以下:
public class OKHealthCheck: HealthCheck { public OKHealthCheck() : base("正常的檢查(OKHealthCheck)") { } protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)) { //返回正常的信息 return Task.FromResult(HealthCheckResult.Healthy("OK")); } }
而後在Startup注入中,加入健康檢查的注入
services.AddMetrics(options => { options.GlobalTags.Add("app", "sample app"); options.GlobalTags.Add("env", "stage"); }) .AddHealthChecks()//這裏是健康檢查的注入 .AddJsonSerialization() .AddReporting( factory => { factory.AddInfluxDb( new InfluxDBReporterSettings { InfluxDbSettings = new InfluxDBSettings(database, uri), ReportInterval = TimeSpan.FromSeconds(5) }); }) .AddMetricsMiddleware(options => options.IgnoredHttpStatusCodes = new[] { 404 });
值得注意的是,這裏的健康檢查注入,是經過反射實現的,他會自動檢測你項目引用的dll,找到繼承過HealthCheck的類,自動所有注入.
而後咱們運行,會發現咱們的Grafana的健康檢查儀表盤,多了條數據,如圖:
(注:這裏說明一下這個Apdex Score(用戶滿意度得分),是默認自動開啓的.能夠經過配置關閉)
上面咱們演示瞭如何建立一個本身的健康檢查,可是隻返回了健康的信息,咱們還有亞健康,不健康,這些固然也是會出現的.因此,代碼以下:
返回不健康的信息:
protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)) { return Task.FromResult(HealthCheckResult.Unhealthy("不健康")); //重點是這裏 }
返回亞健康
protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)) { return Task.FromResult(HealthCheckResult.Degraded("Degraded")); }
在這個方法中,加上大家本身的檢查業務邏輯,返回相應的HealthCheckResult便可.
前面咱們說過,App Metrics給咱們提供了一些內置的健康檢查,咱們下面就來一一講解
咱們直接在AddHealthChecks中注入,使用方法以下,:
.AddHealthChecks(factory=> { //經過HTTP訪問GitHub,看是否正常,間隔10秒 factory.RegisterHttpGetHealthCheck("github是否訪問正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); })//這裏是健康檢查的注入
代碼以下:
.AddHealthChecks(factory=> { //經過HTTP訪問GitHub,看是否正常,間隔10秒 factory.RegisterHttpGetHealthCheck("github是否訪問正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //檢測是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); })//這裏是健康檢查的注入
說明一下,這個是檢測當前程序佔用的物理內存是否超過你設置閥值(字節爲單位),並非檢測你還剩下多少物理內存
.AddHealthChecks(factory=> { //經過HTTP訪問GitHub,看是否正常,間隔10秒 factory.RegisterHttpGetHealthCheck("github是否訪問正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //檢測是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); //檢測佔用內存是否超過2G factory.RegisterProcessPhysicalMemoryHealthCheck("佔用內存是否超過閥值(2G)", (2048L * 1024L) * 1024L); })//這裏是健康檢查的注入
說明一下,這個方法,經過源碼能夠看到,獲取的是PrivateMemorySize64,也是就是獲取爲關聯的進程分配的專用內存量。
.AddHealthChecks(factory=> { //經過HTTP訪問GitHub,看是否正常,間隔10秒 factory.RegisterHttpGetHealthCheck("github是否訪問正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //檢測是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); //檢測佔用內存是否超過2G factory.RegisterProcessPhysicalMemoryHealthCheck("佔用內存是否超過閥值(2G)", (2048L * 1024L) * 1024L); //檢測專用內存佔用量是否超過閥值(2G) factory.RegisterProcessPrivateMemorySizeHealthCheck("專用內存佔用量是否超過閥值(2G)", (2048L * 1024L) * 1024L); })//這裏是健康檢查的注入
沒啥好說的,直接上代碼:
.AddHealthChecks(factory=> { //經過HTTP訪問GitHub,看是否正常,間隔10秒 factory.RegisterHttpGetHealthCheck("github是否訪問正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10)); //檢測是否能Ping通百度 factory.RegisterPingHealthCheck("百度 ping", "baidu.com", TimeSpan.FromSeconds(10)); //檢測佔用內存是否超過2G factory.RegisterProcessPhysicalMemoryHealthCheck("佔用內存是否超過閥值(2G)", (2048L * 1024L) * 1024L); //檢測專用內存佔用量是否超過閥值(2G) factory.RegisterProcessPrivateMemorySizeHealthCheck("專用內存佔用量是否超過閥值(2G)", (2048L * 1024L) * 1024L); //檢測虛擬內存佔用是否超過閥值(2G) factory.RegisterProcessVirtualMemorySizeHealthCheck("虛擬內存佔用量是否超過閥值(2G)", (2048L * 1024L) * 1024L); })//這裏是健康檢查的注入
最後,咱們把代碼跑起來.~,效果如圖
至此,今天的內容就結束了.
有趣的是,其實微軟在ASP.NET Core 2.0中其實也給咱們內置了相關的健康檢測插件.(說明健康檢測真的很重要)
有興趣的朋友能夠去看看.