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 以跟蹤分佈式事務。此設計有如下優點:

  

   步驟:

  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 系統服務及其運行時生成一組大量指標。示例包括:

NgyYRM

  配置指標:

運行時,可以通過在 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 基於以下結構生成日誌:  

DBLOni

   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

  以下參數可用於探測:

四、.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.Activity的ParentId,讓當前的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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/K8iYBfAaF6GC5eWvvD2__Q