[Zipkin] 使用 OpenTelemetry 來追蹤 ASP.NET Core

這是延續之前筆記 [Jaeger] 使用 OpenTelemetry 來追蹤 ASP.NET Core 進行嘗試的筆記,過去使用 OpenTracing 時因為 Zipkin 與 .NET Core 的整合程式較低,設定上繁瑣許多,加上無法處理主要想追蹤 gRPC 所以當時並沒有採用,不過目前看相關文件看似可用,就來測試做個紀錄吧

基本環境說明

  1. macOS Big Sur 11.2.3
  2. docker desktop 3.2.2 (61853)

    • openzipkin/zipkin-slim:2
  3. .NET Core SDK 5.0.103

    • ASP.NET Core 預設專案範本
  4. NuGet packages

    • OpenTelemetry.Extensions.Hosting 1.0.0-rc3
    • OpenTelemetry.Instrumentation.AspNetCore 1.0.0-rc3
    • OpenTelemetry.Exporter.Zipkin 1.1.0-beta1

設定方式

  1. 建立 Jaeger 環境

    docker run -d -p 9411:9411 openzipkin/zipkin-slim:2
    
  2. 安裝 NuGet 套件

    • OpenTelemetry.Extensions.Hosting 1.0.0-rc3
    • OpenTelemetry.Instrumentation.AspNetCore 1.0.0-rc3
    • OpenTelemetry.Exporter.Zipkin 1.1.0-beta1
  3. 新增 config

    {
        "Zipkin": {
            "ServiceName": "zipkin-test",
            "Endpoint": "http://localhost:9411/api/v2/spans"
        }
    }
    
  4. 註冊 Jaeger

    Startup.cs 的 ConfigureServices 方法

    services.AddOpenTelemetryTracing((builder) => builder
            .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName")))
            .AddAspNetCoreInstrumentation()
            .AddZipkinExporter());
    
    services.Configure<ZipkinExporterOptions>(this.Configuration.GetSection("Zipkin"));
    
  5. 實際效果

    1zipkinui1

    2jaeger2

心得

整體設定流程與 [Jaeger] 使用 OpenTelemetry 來追蹤 ASP.NET Core 完全相同,整體使用體驗非常好,跟之前 OpenTracing 完全不同的設定方法差距很大

但有個小問題是設定方式的 官方 GitHub sample 有錯,少了 service name 的設定,幸虧與 Jaeger 設定方式完全一樣,沒造成多大的問題

官方 GitHub sample 程式碼設定會出現 unknown_service:dotnet

3zipkinnoservicename

完整程式碼可以參考:yowko/aspdotnet-core-opentelemetry

參考資訊

  1. OpenTelemetry .NET reaches v1.0
  2. open-telemetry/opentelemetry-dotnet
  3. [Jaeger] 使用 OpenTelemetry 來追蹤 ASP.NET Core
  4. yowko/aspdotnet-core-opentelemetry