前篇-Actor建構塊 文章對Dapr的Actor建構塊進行了解,本篇繼續對可觀測性 進行了解學習。
用于擷取可觀察性的系統資訊稱為遙測。 它可以分為四大類:
分布式跟蹤 提供有關分布式業務事務中所涉及服務之間的流量的見解。
路徑成本 可讓你深入了解服務的性能及其資源消耗情況。
日志記錄 可提供代碼的執行方式和錯誤發生的見解。
運作狀況 終結點可讓你深入了解服務的可用性。
Dapr 可觀察性建構基塊将可觀察性與應用程式分離。 它自動捕獲由 Dapr 分支和 Dapr 系統服務生成的、構成 Dapr 控制平面的流量。 塊将流量與跨多個服務的單個操作關聯起來。 它還公開了系統的性能名額、資源使用情況和運作狀況。 遙測以開放标準格式釋出,使資訊可以送入你選擇的監視後端。 在這裡,可以對資訊進行可視化、查詢和分析。
由于 Dapr 抽象掉了該管道,是以應用程式不知道如何實作可觀察性。 無需引用庫或實作自定義檢測代碼。 Dapr 使開發人員能夠專注于建構業務邏輯,而不是可觀察性管道。 可觀察性在 Dapr 系統級别配置,在服務之間保持一緻,即使是由不同的團隊建立,并使用不同的技術堆棧建構。
Dapr 的 Sidecar 啟用内置可觀察性功能。 服務通信時,Dapr 分支會截獲流量并提取跟蹤、名額和日志記錄資訊。 遙測以開放标準格式釋出。 預設情況下,Dapr 支援 OpenTelemetry 和 Zipkin。
Dapr 提供可将遙測釋出到不同後端監視工具的 收集 器。 這些工具提供了 Dapr 遙測用于分析和查詢。 下圖 顯示了 Dapr 可觀察性體系結構:

步驟:
服務 A 調用服務 B 上的操作。調用将從服務 A 的 Dapr 挎鬥路由到服務 B 的挎鬥。
當服務 B 完成操作時,響應将通過 Dapr 分支發送回服務 A。 它們收集并釋出每個請求和響應的所有可用遙測資料。
配置的收集器引入遙測資料,并将其發送到監視後端。
分布式跟蹤提供了跨分布式應用程式中的服務的流量的見解。交換請求和響應消息的日志是用于解決問題的有用資訊的來源。 硬部分正在關聯屬于同一業務事務的消息 。
Dapr 将 HTTP/GRPC Middleware 添加到 Dapr sidecar。 Middleware 攔截所有 Dapr 和應用程式流量,并自動注入關聯ID以跟蹤分布式事務。 此設計有如下優點:
無需代碼檢測。 所有流量都會自動跟蹤可配置的跟蹤級别。
跨微服務的一緻跟蹤行為。 跟蹤是在 Dapr sidecar 上進行配置和管理的,是以它可以在服務之間保持一緻,這些服務由不同的團隊提供,并可能以不同的程式設計語言編寫。
可配置和可擴充。 通過利用 Zipkin API 和 OpenTelemetry 收集器,可以将 Dapr 追蹤配置為與流行的追蹤後端配合使用,包括客戶可能有的自定義後端。
可以同時定義和啟用多個Exporter
步驟:
服務 A 在服務 B 上調用操作。當服務 A 啟動調用時,Dapr 将建立一個唯一的跟蹤上下文并将其注入到請求中。
服務 B 接收請求,并對服務 C 調用操作。 Dapr 檢測傳入請求包含跟蹤上下文,并通過将其注入到服務 C 的傳出請求來傳播。
服務 C 接收請求并對其進行處理。 Dapr 檢測到傳入請求包含跟蹤上下文,并通過将其注入到服務 B 的傳出響應來傳播。
服務 B 接收響應并對其進行處理。 然後,它會建立新的響應,并通過将跟蹤上下文注入到服務 A 的傳出響應來傳播跟蹤上下文。
Zipkin 是開源分布式跟蹤系統。 它可以攝取和可視化遙測資料。 Dapr 提供對 Zipkin 的預設支援。以下為預設支援的dapr設定
名額(Metrics)是在一段時間内收集和存儲的一系列路徑成本和計數。 Dapr 名額 提供監控功能,以了解 Dapr sidecar 和系統服務的行為。 例如,Dapr sidecar 和使用者應用之間的服務名額可以展示調用延遲、流量故障、請求的錯誤率等。 Dapr 的系統服務度量 則可以顯示 sidecar 注入失敗,系統服務的運作狀況 ( 包括 CPU 使用率,actor 位置數量等)
每個Sidecar和系統服務都公開一個在端口9090上偵聽的名額終結點。 Prometheus 名額 Scrapper 從每個終結點捕獲名額,并将資訊釋出到監視後端。
Dapr 為 Dapr 系統服務及其運作時生成一組大量名額。 示例包括:
名額清單
名額
源
說明
dapr_operator_service_created_total
系統
Dapr Operator service 建立的 Dapr 服務總數。
dapr_injector_sidecar_injection/requests_total
Dapr Sidecar-Injector 服務收到的挎鬥注入請求總數。
dapr_placement_runtimes_total
向 Dapr 放置服務報告的主機總數。
dapr_sentry_cert_sign_request_received_total
Dapr Sentry 服務) (收到的證書簽名請求數。
dapr_runtime_component_loaded
運作時
已成功加載的 Dapr 元件數。
dapr_grpc_io_server_completed_rpcs
按方法和狀态的 gRPC 調用的計數。
dapr_http_server_request_count
HTTP 伺服器中啟動的 HTTP 請求數。
dapr_http/client/sent_bytes
請求正文中發送的總 (不包括 HTTP 用戶端) 标頭。
配置名額:
運作時,可以通過在 Dapr 指令中包含 參數來 <code>--enable-metrics=false</code> 禁用名額收集終結點。 或者,還可使用 參數更改終結點的預設 <code>--metrics-port 9090</code> 端口。
Prometheus 抓取器将名額收集并釋出到監視後端後,如何了解原始資料? 用于分析名額的常用可視化工具是 Grafana。 使用 Grafana,可以從可用名額建立儀表闆。
Dapr 生成 日志,以提供 sidecar 操作的可見性,并幫助使用者識别問題并執行調試。 日志事件包含由 Dapr 系統服務生成的警告,錯誤,資訊和調試消息。
Dapr以純文字形式或JSON格式生成結構化日志到标準輸出。 預設情況下,所有 Dapr 程序 (運作時和系統服務) 都以純文字寫入控制台輸出。 要啟用 JSON 格式的日志,您需要在運作 Dapr 程序時添加 <code>--log-as-json</code> 指令标志。
Dapr 基于以下結構生成日志:
字段
示例
time
ISO8601 時間戳
<code>2011-10-05T14:48:00.000Z</code>
level
日志級别 (info/warn/debug/error)
<code>info</code>
type
日志類型
<code>log</code>
msg
日志消息
<code>hello dapr!</code>
scope
日志記錄範圍
<code>dapr.runtime</code>
instance
Dapr 運作位置的主機名
<code>dapr-pod-xxxxx</code>
app_id
Dapr 應用 ID
<code>dapr-app</code>
ver
Dapr 運作時版本
<code>1.0</code>
Dapr 提供了一種使用 HTTP /healthz 端點來确定其健康狀況的方法。 通過此端點,對Dapr 程序或 sidecar進行探測,可以确定其運作狀況,進而确定其就緒程度和活躍度。
在自承載模式下運作時,不會自動調用運作狀況 API。 不過,可以從應用程式代碼或運作狀況監視工具調用 API。
在 Kubernetes 中運作時,Dapr sidecar-execut 會自動将 Kubernetes 配置為使用運作狀況 API 執行運作情況 探測 和 就緒情況探測。
Kubernetes 使用運作狀态探測來确定容器是否已啟動并正在運作。 如果運作情況探測傳回失敗代碼,Kubernetes 将假定容器已死并自動重新開機。 此功能可提高應用程式的整體可用性。
Kubernetes 使用就緒情況探測來确定容器是否已準備好開始接受流量。 當 Pod 的所有容器都準備就緒時,它被視為已就緒。 就緒情況确定 Kubernetes 服務是否可以在負載均衡方案中将流量引導到 Pod。 未就緒的 Pod 會自動從負載均衡器中删除。
以下參數可用于探測:
<code>path</code>指定 Dapr 運作狀況 API 終結點。
指定 <code>port</code> Dapr 運作狀況 API 端口。
指定 Kubernetes 在開始首次探測容器之前等待 <code>initialDelaySeconds</code> 的秒數。
<code>periodSeconds</code>指定 Kubernetes 在每個探測之間等待的秒數。
指定 Kubernetes 在逾時之前等待來自 API 的響應 <code>timeoutSeconds</code> 的秒數。逾時被解釋為失敗。
指定 Kubernetes 在考慮容器未處于活動狀态或未就緒之前将接受的失敗 <code>failureThreshold</code> 狀态代碼數。
1、添加以下Nuget包:
注:版本很重要,NuGet要打開<code>包含預發行版</code>,并且使用指定版本 OpenTelemetry-1.2.0-beta1 OpenTelemetry.Instrumentation.AspNetCore-1.0.0-rc8 OpenTelemetry.Instrumentation.Http-1.0.0-rc8 OpenTelemetry.Exporter.Zipkin-1.2.0-beta1 OpenTelemetry.Extensions.Hosting-1.0.0-rc8
2、修改Startup檔案:添加監控
3、啟動dapr應用:
4、使用Dapr CLI指令:
5、檢視檢測效果:
打開Zipkin,位址:<code>http://localhost:9411/</code>, 來看一下Zipkin的Tracing
總結:
詳細的可觀察性在生産中運作分布式系統至關重要。
Dapr 提供不同類型的遙測,包括分布式跟蹤、日志記錄、名額和運作狀況狀态。
Dapr 僅生成 Dapr 系統服務和分支的遙測。 不會自動包含應用程式代碼中的遙測資料。 不過,可以使用特定的 SDK (如 OpenTelemetry SDK for .NET)從應用程式代碼發出遙測資料。
Dapr 遙測采用基于開放标準的格式生成,是以可通過大量可用的監視工具來引入。 示例包括 Zipkin、Azure 應用程式 Insights、ELK Stack、New Relic 和 Grafana。 有關如何監視具有特定監視後端的 Dapr 應用程式的教程,請參閱 Dapr 文檔中的 監視應用程式 Dapr 。
參考:
https://docs.microsoft.com/zh-cn/dotnet/architecture/dapr-for-net-developers/observability