Dapr-可觀測性


前言:

  前篇-Actor構建塊 文章對Dapr的Actor構建塊進行了解,本篇繼續對可觀測性 進行了解學習。

一、可觀測性

 用於獲取可觀察性的系統信息稱為遙測。 它可以分為四大類:

  1. 分布式跟蹤 提供有關分布式業務事務中所涉及服務之間的流量的見解。
  2. 度量值 可讓你深入了解服務的性能及其資源消耗情況。
  3. 日志記錄 可提供代碼的執行方式和錯誤發生的見解。
  4. 運行狀況 終結點可讓你深入了解服務的可用性。

 Dapr 可觀察性構建基塊將可觀察性與應用程序分離。 它自動捕獲由 Dapr 分支和 Dapr 系統服務生成的、構成 Dapr 控制平面的流量。 塊將流量與跨多個服務的單個操作關聯起來。 它還公開了系統的性能指標、資源使用情況和運行狀況。 遙測以開放標准格式發布,使信息可以送入你選擇的監視后端。 在這里,可以對信息進行可視化、查詢和分析。

 由於 Dapr 抽象掉了該管道,因此應用程序不知道如何實現可觀察性。 無需引用庫或實現自定義檢測代碼。 Dapr 使開發人員能夠專注於構建業務邏輯,而不是可觀察性管道。 可觀察性在 Dapr 系統級別配置,在服務之間保持一致,即使是由不同的團隊創建,並使用不同的技術堆棧構建。

二、工作原理

 Dapr 的 Sidecar  啟用內置可觀察性功能。 服務通信時,Dapr 分支會截獲流量並提取跟蹤、指標和日志記錄信息。 遙測以開放標准格式發布。 默認情況下,Dapr 支持 OpenTelemetry 和 Zipkin

 Dapr 提供可將遙測發布到不同后端監視工具的 收集 器。 這些工具提供了 Dapr 遙測用於分析和查詢。 下圖 顯示了 Dapr 可觀察性體系結構:

 

 步驟:

  1. 服務 A 調用服務 B 上的操作。調用將從服務 A 的 Dapr 挎斗路由到服務 B 的挎斗。
  2. 當服務 B 完成操作時,響應將通過 Dapr 分支發送回服務 A。 它們收集並發布每個請求和響應的所有可用遙測數據。
  3. 配置的收集器引入遙測數據,並將其發送到監視后端。

 三、特點

  • 分布式跟蹤

  分布式跟蹤提供了跨分布式應用程序中的服務的流量的見解。交換請求和響應消息的日志是用於解決問題的有用信息的來源。 硬部分正在關聯屬於同一業務事務的消息 。  

  Dapr 將 HTTP/GRPC Middleware 添加到 Dapr sidecar。 Middleware 攔截所有 Dapr 和應用程序流量,並自動注入關聯ID以跟蹤分布式事務。 此設計有如下優點:

    • 無需代碼檢測。 所有流量都會自動跟蹤可配置的跟蹤級別。
    • 跨微服務的一致跟蹤行為。 跟蹤是在 Dapr sidecar 上進行配置和管理的,因此它可以在服務之間保持一致,這些服務由不同的團隊提供,並可能以不同的編程語言編寫。
    • 可配置和可擴展。 通過利用 Zipkin API 和 OpenTelemetry 收集器,可以將 Dapr 追蹤配置為與流行的追蹤后端配合使用,包括客戶可能有的自定義后端。
    • 可以同時定義和啟用多個Exporter

  

   步驟:

  1. 服務 A 在服務 B 上調用操作。當服務 A 啟動調用時,Dapr 將創建一個唯一的跟蹤上下文並將其注入到請求中。
  2. 服務 B 接收請求,並對服務 C 調用操作。 Dapr 檢測傳入請求包含跟蹤上下文,並通過將其注入到服務 C 的傳出請求來傳播。
  3. 服務 C 接收請求並對其進行處理。 Dapr 檢測到傳入請求包含跟蹤上下文,並通過將其注入到服務 B 的傳出響應來傳播。
  4. 服務 B 接收響應並對其進行處理。 然后,它會創建新的響應,並通過將跟蹤上下文注入到服務 A 的傳出響應來傳播跟蹤上下文。  

   Zipkin 是開源分布式跟蹤系統。 它可以攝取和可視化遙測數據。 Dapr 提供對 Zipkin 的默認支持。以下為默認支持的dapr設置

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  tracing:
  ##采樣率 samplingRate: "1" zipkin:
    ##zipkin地址 endpointAddress: http://localhost:9411/api/v2/spans
  • 指標

  指標(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 命令中包含 參數來 --enable-metrics=false 禁用指標收集終結點。 或者,還可使用 參數更改終結點的默認 --metrics-port 9090 端口。

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: dapr-config
  namespace: dapr-trafficcontrol
spec:
  tracing:
    samplingRate: "1"
  metric:
    enabled: false

   Prometheus 抓取器將指標收集並發布到監視后端后,如何理解原始數據? 用於分析指標的常用可視化工具是 Grafana。 使用 Grafana,可以從可用指標創建儀表板。

   

  • 日志記錄

  Dapr 生成 日志,以提供 sidecar 操作的可見性,並幫助用戶識別問題並執行調試。 日志事件包含由 Dapr 系統服務生成的警告,錯誤,信息和調試消息。

  Dapr以純文本形式或JSON格式生成結構化日志到標准輸出。 默認情況下,所有 Dapr 進程 (運行時和系統服務) 都以純文本寫入控制台輸出。 要啟用 JSON 格式的日志,您需要在運行 Dapr 進程時添加 --log-as-json 命令標志。

  Dapr 基於以下結構生成日志:  

字段 說明 示例
time ISO8601 時間戳 2011-10-05T14:48:00.000Z
level 日志級別 (info/warn/debug/error) info
type 日志類型 log
msg 日志消息 hello dapr!
scope 日志記錄范圍 dapr.runtime
instance Dapr 運行位置的主機名 dapr-pod-xxxxx
app_id Dapr 應用 ID dapr-app
ver Dapr 運行時版本 1.0
  • 運行情況

   Dapr 提供了一種使用 HTTP /healthz 端點來確定其健康狀況的方法。 通過此端點,對Dapr 進程或 sidecar進行探測,可以確定其運行狀況,從而確定其就緒程度和活躍度。

GET http://localhost:3500/v1.0/healthz

 

  在自承載模式下運行時,不會自動調用運行狀況 API。 不過,可以從應用程序代碼或運行狀況監視工具調用 API。

  在 Kubernetes 中運行時,Dapr sidecar-execut 會自動將 Kubernetes 配置為使用運行狀況 API 執行運行情況 探測 和 就緒情況探測

  Kubernetes 使用運行狀態探測來確定容器是否已啟動並正在運行。 如果運行情況探測返回失敗代碼,Kubernetes 將假定容器已死並自動重啟。 此功能可提高應用程序的整體可用性。

  Kubernetes 使用就緒情況探測來確定容器是否已准備好開始接受流量。 當 Pod 的所有容器都准備就緒時,它被視為已就緒。 就緒情況確定 Kubernetes 服務是否可以在負載均衡方案中將流量引導到 Pod。 未就緒的 Pod 會自動從負載均衡器中刪除。

livenessProbe:
      httpGet:
        path: v1.0/healthz
        port: 3500
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds : 5
      failureThreshold : 3
readinessProbe:
      httpGet:
        path: v1.0/healthz
        port: 3500
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds : 5
      failureThreshold: 3

  以下參數可用於探測:

    • path指定 Dapr 運行狀況 API 終結點。
    • 指定 port Dapr 運行狀況 API 端口。
    • 指定 Kubernetes 在開始首次探測容器之前等待 initialDelaySeconds 的秒數。
    • periodSeconds指定 Kubernetes 在每個探測之間等待的秒數。
    • 指定 Kubernetes 在超時之前等待來自 API 的響應 timeoutSeconds 的秒數。超時被解釋為失敗。
    • 指定 Kubernetes 在考慮容器未處於活動狀態或未就緒之前將接受的失敗 failureThreshold 狀態代碼數。

四、.Net Core 應用

 1、添加以下Nuget包:

注:版本很重要,NuGet要打開包含預發行版,並且使用指定版本

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文件:添加監控

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    public IConfiguration Configuration { get; }
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddActors(option =>
        {
            option.Actors.RegisterActor<OrderStatusActor>();
        });
        //添加TelemetryTracing監控
        services.AddOpenTelemetryTracing((tracerProviderBuilder) => tracerProviderBuilder
                .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("DaprBackEnd"))
                .AddAspNetCoreInstrumentation()
                .AddHttpClientInstrumentation()
          //設置zipkin相關設置 .AddZipkinExporter(zipkinOptions
=> { zipkinOptions.Endpoint = new Uri("http://localhost:9411/api/v2/spans"); } )); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { //開啟.Net的OpenTelemetry,然后修改Diagnostics.ActivityParentId,讓當前的Tracing跟Dapr Sidecar傳來的TraceId一致 endpoints.Map("/Amazing", async (HttpContext context) => { if (context.Request.Headers.TryGetValue("traceparent", out var traceparent)) { Console.WriteLine($"TraceParent: {traceparent}"); } if (context.Request.Headers.TryGetValue("tracestate", out var tracestate)) { Console.WriteLine($"TraceState: {tracestate}"); } System.Diagnostics.Activity.Current?.SetParentId(traceparent.ToString()); _ = await new HttpClient().GetStringAsync("https://www.baidu.com"); Console.WriteLine($"Invoke succeed: traceID:{traceparent}"); }); endpoints.MapControllers(); endpoints.MapActorsHandlers(); }); } }

 3、啟動dapr應用: 

dapr run --dapr-http-port 3511 --app-port 8220 --app-id DaprBackEnd dotnet .\DaprBackEnd.dl

 4、使用Dapr CLI命令:

dapr invoke --app-id DaprBackEnd --method /Amazing

 5、查看檢測效果:

  打開Zipkin,地址:http://localhost:9411/, 來看一下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     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM