云原生ASP.NET Core程序的可監(jiān)測(cè)性和可觀察性
分布式應(yīng)用程序很復(fù)雜,給開發(fā)人員調(diào)試和修復(fù)生產(chǎn)問題帶來了一系列挑戰(zhàn)。盡管微服務(wù)架構(gòu)可幫助維持一支規(guī)模較小,可以自主工作并專注于獨(dú)立業(yè)務(wù)團(tuán)隊(duì),但由于其分布式性質(zhì),它帶來了新的挑戰(zhàn)。例如,在業(yè)務(wù)交易過程中出現(xiàn)問題的情況下,需要端到端跟蹤請(qǐng)求,該請(qǐng)求可能跨越多個(gè)服務(wù)和基礎(chǔ)架構(gòu)。解決問題時(shí)可能遇到的挑戰(zhàn)有:
管理已知和未知故障
故障也是分布式的
傳統(tǒng)監(jiān)控系統(tǒng)不適用
?
這是可監(jiān)測(cè)性和可觀察性出現(xiàn)的地方。可監(jiān)測(cè)性記錄應(yīng)用程序的總體運(yùn)行狀況,而可觀察性則可以幫助您更深入地了解上下文數(shù)據(jù)。在.NET大會(huì)上,我和Cecil 已經(jīng)深入討論了云原生應(yīng)用程序中的可監(jiān)測(cè)性和可觀察性。
以上視頻中,我們著眼于可觀察性和可監(jiān)測(cè)性的關(guān)鍵點(diǎn),例如日志(Logging),衡量指標(biāo)(Metrics),鏈路追蹤(Tracing),并深入分析了運(yùn)行狀況檢查(Health checks)。

以下是視頻中討論的一些基本概念:
?
微服務(wù)實(shí)現(xiàn)了運(yùn)行狀況檢查,最理想的情況是使用HTTP endpoints,以便各種實(shí)時(shí)監(jiān)控系統(tǒng)可以查詢狀態(tài)。?運(yùn)行狀況檢查端點(diǎn)至少應(yīng)做出以下響應(yīng):
系統(tǒng)正在運(yùn)行嗎?
它可以執(zhí)行任務(wù)嗎?
在Kubernetes世界中,這些分別直接轉(zhuǎn)換為liveness和readiness。它們定義在Kubernetes的YAML部署配置文件中。

liveness路徑是Kubernetes定期查詢以檢查故障的端點(diǎn)。?Kubernetes提供了liveness探針來監(jiān)測(cè)失敗的應(yīng)用程序,并在它們不返回成功代碼時(shí)重新啟動(dòng)它們。
readiness路徑是Kubernetes查詢以了解服務(wù)何時(shí)就緒,可以開始接受流量的終端。?當(dāng)所有注冊(cè)的檢查都成功時(shí),它將返回HTTP狀態(tài)代碼200。
?
ASP.NET Core提供用于向可監(jiān)測(cè)性系統(tǒng)報(bào)告運(yùn)行狀況的中間件和庫(kù),來提供運(yùn)行狀況檢查。?相關(guān)文檔請(qǐng)查閱ASP.NET Core中的運(yùn)行狀況檢查。
ASP.NET Core中的運(yùn)行狀況檢查:
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?WT.mc_id=friends-0000-NANIL&view=aspnetcore-5.0
無(wú)論您使用什么工具調(diào)查生產(chǎn)環(huán)境中的問題,最終都會(huì)是以日志的形式反應(yīng)問題的根本原因。?在分布式環(huán)境中,您需要確保日志記錄包含有助于調(diào)試的深入信息。?可以從一個(gè)集中的地方查詢它們。?每個(gè)日志記錄都需要有一個(gè)關(guān)聯(lián)ID,以便進(jìn)行跟蹤以了解全局。
使用結(jié)構(gòu)化日志,您可以將序列化的對(duì)象添加到日志中,日志監(jiān)視系統(tǒng)可以高效地查詢這些對(duì)象。?例如,您可以根據(jù)customerID或trasnsactionID查詢整個(gè)事務(wù)日志。?在ASP.NET Core應(yīng)用程序中,可以使用提供結(jié)構(gòu)化日志記錄的Serilog。請(qǐng)查閱.NET Core和ASP.NET Core中的日志入門,以及Serilog了解結(jié)構(gòu)化日志。
.NET Core和ASP.NET Core中的日志:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?WT.mc_id=friends-0000-NANIL&view=aspnetcore-5.0
Serilog:
https://serilog.net/
在傳統(tǒng)應(yīng)用程序中,日志文件存儲(chǔ)在本地計(jì)算機(jī)上。在分布式環(huán)境中,把日志記錄在某一臺(tái)計(jì)算機(jī)中的純文本文件中是沒有幫助的。生成日志的應(yīng)用程序可能無(wú)法訪問本地磁盤,或者當(dāng)容器在虛擬機(jī)中移動(dòng)時(shí),本地磁盤可能是高度瞬態(tài)的。由于在Cloud-native應(yīng)用程序中使用基于文件的日志會(huì)遇到一些問題,因此首選集中式日志。日志由應(yīng)用程序收集并傳送到一個(gè)集中的日志應(yīng)用程序,該應(yīng)用程序?qū)θ罩具M(jìn)行索引和存儲(chǔ)。這類系統(tǒng)每天可以接收數(shù)十GB的日志。Serilog提供了向集中式系統(tǒng)(如Azure Application Insights,Azure Monitor的一項(xiàng)功能)寫入日志事件的接收器。在構(gòu)建跨多個(gè)服務(wù)的日志記錄時(shí),遵循一些標(biāo)準(zhǔn)做法也很有幫助。例如,在事務(wù)開始時(shí)生成一個(gè)關(guān)聯(lián)ID,然后將其記錄到與該事務(wù)相關(guān)的每條消息中,這樣可以更容易地從集中式日志系統(tǒng)中搜索所有相關(guān)消息。
接收器:
https://github.com/serilog/serilog/wiki/Provided-Sinks
關(guān)聯(lián)ID:
https://www.rapid7.com/blog/post/2016/12/23/the-value-of-correlation-ids/

分布式跟蹤等效于現(xiàn)代云和微服務(wù)體系結(jié)構(gòu)的調(diào)用堆棧,并添加了性能分析器。分布式跟蹤或分布式請(qǐng)求跟蹤有助于端到端查看請(qǐng)求,并使您能夠從整體上識(shí)別問題。跟蹤可以為您提供有關(guān)問題的詳細(xì)答案,例如事件發(fā)生在什么時(shí)候?它花了多少時(shí)間?為什么要花這么長(zhǎng)時(shí)間?哪些微服務(wù)處理了它?等等,像openzipkin / zipkin之類的開源分布式跟蹤系統(tǒng),在該領(lǐng)域非常流行。
?
為您的應(yīng)用程序啟用分布式跟蹤就跟將相應(yīng)的分布式跟蹤提供商的SDK添加到每個(gè)微服務(wù)中一樣簡(jiǎn)單。例如,在您的應(yīng)用中安裝并配置了Application Insights SDK后,SDK依賴關(guān)系自動(dòng)收集器會(huì)自動(dòng)收集流行框架,庫(kù)和技術(shù)的跟蹤信息。
?
在幾個(gè)不同的系統(tǒng)和工具之間,需要有一套標(biāo)準(zhǔn)以便于觀察。OpenTelemetry標(biāo)準(zhǔn)化了不同的應(yīng)用程序和框架如何收集和發(fā)出可觀測(cè)性遙測(cè)。OpenTelemetry提供了一個(gè)與供應(yīng)商無(wú)關(guān)的規(guī)范、一組api、sdk和工具以及用于可觀測(cè)性遙測(cè)(分布式跟蹤、度量等)的集成。查看博客文章OpenTelemetry?.net?reachs?v1.0以獲取詳細(xì)信息。
openzipkin/zipkin:
https://github.com/openzipkin/zipkin/?WT.mc_id=friends-0000-NANIL
Application Insights SDK:
https://docs.microsoft.com/en-us/azure/azure-monitor/app/distributed-tracing
OpenTelemetry:
https://opentelemetry.io/
OpenTelemetry.net reachs v1.0:
https://devblogs.microsoft.com/dotnet/opentelemetry-net-reaches-v1-0/?WT.mc_id=friends-0000-NANIL
我們已經(jīng)構(gòu)建了一系列模塊來幫助您學(xué)習(xí)構(gòu)建.NET微服務(wù)和云原生技術(shù)。?查看以下模塊,這些模塊將幫助您了解可監(jiān)測(cè)性和可觀察性相關(guān)技術(shù)。
行運(yùn)行狀況檢查:創(chuàng)建和部署.Net微服務(wù)和云原生技術(shù)
可監(jiān)測(cè)性和可觀察性:測(cè)試cloud-native ASP.NET Core微服務(wù)
有關(guān)其他主題,請(qǐng)查看https://aka.ms/aspnet-microservices
創(chuàng)建和部署.Net微服務(wù)和云原生技術(shù):
https://docs.microsoft.com/learn/modules/microservices-aspnet-core/?WT.mc_id=friends-0000-NANIL&ns-enrollment-type=Collection&ns-enrollment-id=8mq4i2mzgjwn10
測(cè)試cloud-native ASP.NET Core微服務(wù):
https://docs.microsoft.com/en-us/learn/modules/microservices-logging-aspnet-core/?WT.mc_id=friends-0000-NANIL&ns-enrollment-type=Collection&ns-enrollment-id=8mq4i2mzgjwn10


歡迎訂閱微軟開發(fā)者月刊
獲取微軟最新技術(shù)資訊
▲
▲
站長(zhǎng)推薦大家關(guān)注上面的公眾號(hào)。
