雲原生ASP.NET Core程序的可監測性和可觀察性

分佈式應用程序很複雜,給開發人員調試和修復生產問題帶來了一系列挑戰。儘管微服務架構可幫助維持一支規模較小,能夠自主工做並專一於獨立業務團隊,但因爲其分佈式性質,它帶來了新的挑戰。例如,在業務交易過程當中出現問題的狀況下,須要端到端跟蹤請求,該請求可能跨越多個服務和基礎架構。 解決問題時可能遇到的挑戰有:git

  • 管理已知和未知故障
  • 故障也是分佈式的
  • 傳統監控系統不適用

這是可監測性和可觀察性出現的地方。可監測性記錄應用程序的整體運行情況,而可觀察性則能夠幫助您更深刻地瞭解上下文數據。在.NET大會上,我和Cecil 已經深刻討論了雲原生應用程序中的可監測性和可觀察性。github

https://www.bilibili.com/vide...api

以上視頻中,咱們着眼於可觀察性和可監測性的關鍵點,例如日誌(Logging),衡量指標(Metrics),鏈路追蹤(Tracing),並深刻分析了運行情況檢查(Health checks)。架構

圖片1.png

如下是視頻中討論的一些基本概念:app

運行情況檢查(Health checks)

微服務實現了運行情況檢查,最理想的狀況是使用HTTP endpoints,以便各類實時監控系統能夠查詢狀態。 運行情況檢查端點至少應作出如下響應:框架

  • 系統正在運行嗎?
  • 它能夠執行任務嗎?

在Kubernetes世界中,這些分別直接轉換爲liveness和readiness。 它們定義在Kubernetes的YAML部署配置文件中。分佈式

圖片2.png

  • liveness路徑是Kubernetes按期查詢以檢查故障的端點。 Kubernetes提供了liveness探針來監測失敗的應用程序,並在它們不返回成功代碼時從新啓動它們。
  • readiness路徑是Kubernetes查詢以瞭解服務什麼時候就緒,能夠開始接受流量的終端。 當全部註冊的檢查都成功時,它將返回HTTP狀態代碼200。

ASP.NET Core提供用於向可監測性系統報告運行情況的中間件和庫,來提供運行情況檢查。 相關文檔請查閱ASP.NET Core中的運行情況檢查ide

日誌

不管您使用什麼工具調查生產環境中的問題,最終都會是以日誌的形式反應問題的根本緣由。 在分佈式環境中,您須要確保日誌記錄包含有助於調試的深刻信息。 能夠從一個集中的地方查詢它們。 每一個日誌記錄都須要有一個關聯ID,以便進行跟蹤以瞭解全局。微服務

結構化日誌

使用結構化日誌,您能夠將序列化的對象添加到日誌中,日誌監視系統能夠高效地查詢這些對象。 例如,您能夠根據customerID或trasnsactionID查詢整個事務日誌。 在ASP.NET Core應用程序中,可使用提供結構化日誌記錄的Serilog。請查閱.NET Core和ASP.NET Core中的日誌入門,以及Serilog瞭解結構化日誌。工具

集中式日誌和關聯ID

在傳統應用程序中,日誌文件存儲在本地計算機上。在分佈式環境中,把日誌記錄在某一臺計算機中的純文本文件中是沒有幫助的。生成日誌的應用程序可能沒法訪問本地磁盤,或者當容器在虛擬機中移動時,本地磁盤多是高度瞬態的。因爲在Cloud-native應用程序中使用基於文件的日誌會遇到一些問題,所以首選集中式日誌。日誌由應用程序收集並傳送到一個集中的日誌應用程序,該應用程序對日誌進行索引和存儲。這類系統天天能夠接收數十GB的日誌。Serilog提供了向集中式系統(如Azure Application Insights,Azure Monitor的一項功能)寫入日誌事件的接收器。在構建跨多個服務的日誌記錄時,遵循一些標準作法也頗有幫助。例如,在事務開始時生成一個關聯ID,而後將其記錄到與該事務相關的每條消息中,這樣能夠更容易地從集中式日誌系統中搜索全部相關消息。

分佈式跟蹤

圖片3.png

分佈式跟蹤等效於現代雲和微服務體系結構的調用堆棧,並添加了性能分析器。分佈式跟蹤或分佈式請求跟蹤有助於端到端查看請求,並使您可以從總體上識別問題。跟蹤能夠爲您提供有關問題的詳細答案,例如事件發生在何時?它花了多少時間?爲何要花這麼長時間?哪些微服務處理了它?等等,像openzipkin / zipkin之類的開源分佈式跟蹤系統,在該領域很是流行。

爲您的應用程序啓用分佈式跟蹤就跟將相應的分佈式跟蹤提供商的SDK添加到每一個微服務中同樣簡單。例如,在您的應用中安裝並配置了Application Insights SDK後,SDK依賴關係自動收集器會自動收集流行框架,庫和技術的跟蹤信息。

在幾個不一樣的系統和工具之間,須要有一套標準以便於觀察。OpenTelemetry標準化了不一樣的應用程序和框架如何收集和發出可觀測性遙測。OpenTelemetry提供了一個與供應商無關的規範、一組api、sdk和工具以及用於可觀測性遙測(分佈式跟蹤、度量等)的集成。查看博客文章OpenTelemetry .net reachs v1.0以獲取詳細信息。

動手模塊

咱們已經構建了一系列模塊來幫助您學習構建.NET微服務和雲原生技術。 查看如下模塊,這些模塊將幫助您瞭解可監測性和可觀察性相關技術。

相關文章
相關標籤/搜索