ASP.NET Core之跨平台的实时性能监控(2.健康检查)
前言
上篇我們講了《如何使用App Metrics?做一個(gè)簡單的APM監(jiān)控》,最后提到過健康檢查這個(gè)東西.
這篇主要就是講解健康檢查的內(nèi)容.
沒看過上篇的,請(qǐng)移步:ASP.NET Core之跨平臺(tái)的實(shí)時(shí)性能監(jiān)控
首先我們來了解一下什么是健康檢查(health checks)?
?
1.什么是健康檢查?
? ? ? ?健康檢查,其實(shí)這個(gè)名稱已經(jīng)很明確了,它是檢查你的應(yīng)用程序是否健康運(yùn)行的一種方式。隨著當(dāng)前各類項(xiàng)目越來越多的應(yīng)用程序正在轉(zhuǎn)向微服務(wù)式架構(gòu),健康檢查就變得尤為關(guān)鍵。雖然微服務(wù)體系結(jié)構(gòu)具有許多好處,但其中一個(gè)缺點(diǎn)就是為了確保所有這些服務(wù)都正常運(yùn)行的操作開銷更高。你不在是監(jiān)視一個(gè)龐大的整體項(xiàng)目的健康狀況,而是需要監(jiān)控許多不同服務(wù)的狀態(tài),甚至這些服務(wù)通常只負(fù)責(zé)一件事情。健康檢查(Heatlh Checks)通常與一些服務(wù)發(fā)現(xiàn)工具結(jié)合使用,如Consul??,來監(jiān)控您的微服務(wù)器,來觀測您的服務(wù)是否健康運(yùn)行。
2.如何實(shí)施健康檢查?
? ? ? ?健康檢查有很多種不同的方法,但最常見的方法是將HTTP端點(diǎn)暴露給專門用于健康檢查的應(yīng)用程序。一般來說,如果一切情況都很好,你的服務(wù)將返回200的狀態(tài)碼,然而任何非200的代碼則意味著出現(xiàn)問題。例如,如果發(fā)生錯(cuò)誤,你可能會(huì)返回500以及一些出錯(cuò)的JSON信息。
3.健康檢查的常見情況
你的健康檢查將基于你的應(yīng)用程序或者你的微服務(wù)主要在做寫什么事情,就檢查什么.
不過我們也可以舉例一些常見的健康檢查內(nèi)容:
檢查我的服務(wù)可以連接到數(shù)據(jù)庫嗎?
檢查我的服務(wù)可以查詢第三方API嗎?
可能做一些只讀操作
我的服務(wù)可以訪問文件系統(tǒng)嗎(IO是否正常)?
檢查我的服務(wù)占用的內(nèi)存或CPU是否高于某個(gè)閾值?
下面我們就來講解一下,如何使用App Metrics來實(shí)現(xiàn)我們的健康檢查.
效果如圖:
??
正文
這里就不創(chuàng)建新的項(xiàng)目了,直接拿上個(gè)項(xiàng)目的例子來寫.
App Metrics中的健康檢查分為3種狀態(tài):
1.健康(綠),2.亞健康(黃),3.不健康(紅). ?顏色如上圖所示
也含有一些內(nèi)置的健康檢查(后面講解),我們先來講一下如何自行創(chuàng)建健康檢查
?
1.創(chuàng)建自己的健康檢查
首先我們?cè)贒emo中創(chuàng)建一個(gè)健康檢查的文件夾(當(dāng)然,也可以是類庫)
創(chuàng)建類,取名為 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 });
值得注意的是,這里的健康檢查注入,是通過反射實(shí)現(xiàn)的,他會(huì)自動(dòng)檢測你項(xiàng)目引用的dll,找到繼承過HealthCheck的類,自動(dòng)全部注入.
?
然后我們運(yùn)行,會(huì)發(fā)現(xiàn)我們的Grafana的健康檢查儀表盤,多了條數(shù)據(jù),如圖:
(注:這里說明一下這個(gè)Apdex Score(用戶滿意度得分),是默認(rèn)自動(dòng)開啟的.可以通過配置關(guān)閉)?
上面我們演示了如何創(chuàng)建一個(gè)自己的健康檢查,但是只返回了健康的信息,我們還有亞健康,不健康,這些當(dāng)然也是會(huì)出現(xiàn)的.所以,代碼如下:
返回不健康的信息:
protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)){ ? ? ? ?? ?return Task.FromResult(HealthCheckResult.Unhealthy("不健康")); //重點(diǎn)是這里}
返回亞健康
protected override Task<HealthCheckResult> CheckAsync(CancellationToken token = default(CancellationToken)){ ? ? ? ? ? ?return Task.FromResult(HealthCheckResult.Degraded("Degraded"));}在這個(gè)方法中,加上你們自己的檢查業(yè)務(wù)邏輯,返回相應(yīng)的HealthCheckResult即可.
?
2.使用內(nèi)置的健康檢查
? ?前面我們說過,App Metrics給我們提供了一些內(nèi)置的健康檢查,我們下面就來一一講解
? ?2.1內(nèi)置的HTTP檢測
? ? 我們直接在AddHealthChecks中注入,使用方法如下,:
.AddHealthChecks(factory=> {//通過HTTP訪問GitHub,看是否正常,間隔10秒factory.RegisterHttpGetHealthCheck("github是否訪問正常", new Uri("https://github.com/"), TimeSpan.FromSeconds(10));})//這里是健康檢查的注入?
? ?2.2內(nèi)置的Ping檢測
? ?代碼如下:
.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));
? ? ? ? ? ? ? ?})//這里是健康檢查的注入
2.3內(nèi)置物理內(nèi)存占用檢測
說明一下,這個(gè)是檢測當(dāng)前程序占用的物理內(nèi)存是否超過你設(shè)置閥值(字節(jié)為單位),并不是檢測你還剩下多少物理內(nèi)存
.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));
? ? ? ? ? ? ? ? ? ?//檢測占用內(nèi)存是否超過2G
? ? ? ? ? ? ? ? ? ?factory.RegisterProcessPhysicalMemoryHealthCheck("占用內(nèi)存是否超過閥值(2G)", (2048L * 1024L) * 1024L);
? ? ? ? ? ? ? ?})//這里是健康檢查的注入
2.4內(nèi)置專用內(nèi)存占用檢測
說明一下,這個(gè)方法,通過源碼可以看到,獲取的是PrivateMemorySize64,也是就是獲取為關(guān)聯(lián)的進(jìn)程分配的專用內(nèi)存量。
.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));
? ? ? ? ? ? ? ? ? ?//檢測占用內(nèi)存是否超過2G
? ? ? ? ? ? ? ? ? ?factory.RegisterProcessPhysicalMemoryHealthCheck("占用內(nèi)存是否超過閥值(2G)", (2048L * 1024L) * 1024L);
? ? ? ? ? ? ? ? ? ?//檢測專用內(nèi)存占用量是否超過閥值(2G)
? ? ? ? ? ? ? ? ? ?factory.RegisterProcessPrivateMemorySizeHealthCheck("專用內(nèi)存占用量是否超過閥值(2G)", (2048L * 1024L) * 1024L);
? ? ? ? ? ? ? ?})//這里是健康檢查的注入
2.5內(nèi)置虛擬內(nèi)存占用檢測
沒啥好說的,直接上代碼:
.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));
? ? ? ? ? ? ? ? ? ?//檢測占用內(nèi)存是否超過2G
? ? ? ? ? ? ? ? ? ?factory.RegisterProcessPhysicalMemoryHealthCheck("占用內(nèi)存是否超過閥值(2G)", (2048L * 1024L) * 1024L);
? ? ? ? ? ? ? ? ? ?//檢測專用內(nèi)存占用量是否超過閥值(2G)
? ? ? ? ? ? ? ? ? ?factory.RegisterProcessPrivateMemorySizeHealthCheck("專用內(nèi)存占用量是否超過閥值(2G)", (2048L * 1024L) * 1024L);
? ? ? ? ? ? ? ? ? ?//檢測虛擬內(nèi)存占用是否超過閥值(2G)
? ? ? ? ? ? ? ? ? ?factory.RegisterProcessVirtualMemorySizeHealthCheck("虛擬內(nèi)存占用量是否超過閥值(2G)", (2048L * 1024L) * 1024L);
? ? ? ? ? ? ? ?})//這里是健康檢查的注入
最后,我們把代碼跑起來.~,效果如圖
?
寫在最后
至此,今天的內(nèi)容就結(jié)束了.
有趣的是,其實(shí)微軟在ASP.NET Core 2.0中其實(shí)也給我們內(nèi)置了相關(guān)的健康檢測插件.(說明健康檢測真的很重要)
https://github.com/dotnet-architecture/HealthChecks
有興趣的朋友可以去看看.
相關(guān)文章:?
互聯(lián)網(wǎng)級(jí)監(jiān)控系統(tǒng)必備-時(shí)序數(shù)據(jù)庫之Influxdb技術(shù)
互聯(lián)網(wǎng)級(jí)監(jiān)控系統(tǒng)必備-時(shí)序數(shù)據(jù)庫之Influxdb集群及踩過的坑
應(yīng)用程序的8個(gè)關(guān)鍵性能指標(biāo)以及測量方法
ASP.NET Core之跨平臺(tái)的實(shí)時(shí)性能監(jiān)控
原文地址:http://www.cnblogs.com/GuZhenYin/p/7216724.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core之跨平台的实时性能监控(2.健康检查)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 我眼中的ASP.NET Core之微服务
 - 下一篇: 前端模块化工具--webpack学习心得