云原生ASP.NET Core程序的可监测性和可观察性
點(diǎn)擊藍(lán)字
關(guān)注我們
分布式應(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)的地方??杀O(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)。
以下是視頻中討論的一些基本概念:
運(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)行狀況的中間件和庫,來提供運(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
日志
無論您使用什么工具調(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)化日志
使用結(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/
Serilog
https://serilog.net/
集中式日志和關(guān)聯(lián)ID
在傳統(tǒng)應(yīng)用程序中,日志文件存儲(chǔ)在本地計(jì)算機(jī)上。在分布式環(huán)境中,把日志記錄在某一臺(tái)計(jì)算機(jī)中的純文本文件中是沒有幫助的。生成日志的應(yīng)用程序可能無法訪問本地磁盤,或者當(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://blog.rapid7.com/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í)間?為什么要花這么長時(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)收集流行框架,庫和技術(shù)的跟蹤信息。
在幾個(gè)不同的系統(tǒng)和工具之間,需要有一套標(biāo)準(zhǔn)以便于觀察。OpenTelemetry標(biāo)準(zhǔn)化了不同的應(yīng)用程序和框架如何收集和發(fā)出可觀測(cè)性遙測(cè)。OpenTelemetry提供了一個(gè)與供應(yīng)商無關(guān)的規(guī)范、一組api、sdk和工具以及用于可觀測(cè)性遙測(cè)(分布式跟蹤、度量等)的集成。查看博客文章OpenTelemetry .net reachs v1.0以獲取詳細(xì)信息。
openzipkin/zipkin
https://github.com/openzipkin/zipkin
Application Insights SDK
https://docs.microsoft.com/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
動(dòng)手模塊
我們已經(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/
測(cè)試cloud-native ASP.NET Core微服務(wù)
https://docs.microsoft.com/learn/modules/microservices-logging-aspnet-core/
總結(jié)
以上是生活随笔為你收集整理的云原生ASP.NET Core程序的可监测性和可观察性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过Dapr实现一个简单的基于.net的
- 下一篇: ML.NET Cookbook:(1)如