日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core之跨平台的实时性能监控(2.健康检查)

發(fā)布時(shí)間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core之跨平台的实时性能监控(2.健康检查) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

上篇我們講了《如何使用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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。