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