全部產品
Search
文件中心

Application Real-Time Monitoring Service:通過Zipkin上報 .NET應用資料

更新時間:Aug 08, 2024

通過Zipkin為應用埋點並上報鏈路資料至Managed Service for OpenTelemetry後,Managed Service for OpenTelemetry即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控資料。本文介紹如何使用ASP.NET Core/Owin組件進行自動埋點或直接進行手動埋點。

重要

為獲得更豐富的功能、更先進的鏈路追蹤能力,以及最佳使用體驗,建議您使用OpenTelemetry協議將應用接入Managed Service for OpenTelemetry

我們為您提供了詳細的OpenTelemetry接入指南和最佳實務,協助您快速上手Managed Service for OpenTelemetry。更多資訊,請參見接入應用

前提條件

擷取存取點資訊

  1. 登入ARMS控制台,在左側導覽列單擊接入中心

  2. 服務端應用地區單擊Zipkin卡片。

  3. 在彈出的Zipkin面板中選擇資料需要上報的地區。

    說明

    初次接入的地區將會自動進行資源初始化。

  4. 選擇串連方式,然後複製存取點資訊。

    說明
    • 若您的服務部署在阿里雲上,且所屬地區與選擇的接入地區一致,推薦使用阿里雲內網方式,否則選擇公網方式。

    • 一般情況下請使用v2版本存取點,v1版本存取點推薦對Zipkin十分瞭解的高階使用者使用。

    image.png

背景資訊

Zipkin是一款開源的分布式即時資料追蹤系統(Distributed Tracking System),由Twitter公司開發和貢獻。其主要功能是彙總來自各個異構系統的即時監控資料。

通過Zipkin上報資料的原理

通過ASP.NET Core組件自動埋點

請按照以下步驟通過ASP.NET Core組件埋點。

說明

下載Demo源碼,並按照Readme的說明運行程式。

  1. 安裝NuGet包。

    // 添加以下組件。
    // zipkin4net.middleware.aspnetcore(aspnetcore中介軟體)
    // zipkin4net(追蹤器)
    
    dotnet add  package zipkin4net.middleware.aspnetcore
    dotnet add  package zipkin4net
  2. 註冊和啟動Zipkin。

    lifetime.ApplicationStarted.Register(() => {
        TraceManager.SamplingRate = 1.0f;
        var logger = new TracingLogger(loggerFactory, "zipkin4net");
        // 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。
        var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");
    
        var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
        TraceManager.RegisterTracer(tracer);
        TraceManager.Start(logger);
     });
    lifetime.ApplicationStopped.Register(() => TraceManager.Stop());
    app.UseTracing(applicationName);
  3. 在發送Get/Post請求的HttpClient中添加tracinghandler(追蹤處理者)。

    public override void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient("Tracer").AddHttpMessageHandler(provider =>
            TracingHandler.WithoutInnerHandler(provider.GetService<IConfiguration>()["applicationName"]));
    }

通過Owin組件自動埋點

請按照以下步驟通過Owin組件埋點。

說明

下載Demo源碼,並按照Readme的說明運行程式。

  1. 安裝NuGet包。

    // 添加以下組件。
    // zipkin4net.middleware.aspnetcore(aspnetcore中介軟體)
    // zipkin4net(追蹤器)
    
    dotnet add  package zipkin4net.middleware.aspnetcore
    dotnet add  package zipkin4net
  2. 註冊和啟動Zipkin。

    // 設定Tracing。
    TraceManager.SamplingRate = 1.0f;
    var logger = new ConsoleLogger();
    // 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。
    var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");
    
    var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
    TraceManager.RegisterTracer(tracer);
    TraceManager.Start(logger);
    
    //Stop TraceManager on app dispose
    var properties = new AppProperties(appBuilder.Properties);
    var token = properties.OnAppDisposing;
    
    if (token != CancellationToken.None)
    {
    token.Register(() =>
    {
    TraceManager.Stop();
    });
    }
    
    // Setup Owin Middleware
    appBuilder.UseZipkinTracer(System.Configuration.ConfigurationManager.AppSettings["applicationName"]);
  3. 在發送Get/Post請求的HttpClient中添加tracinghandler(追蹤處理者)。

    using (var httpClient = new HttpClient(new TracingHandler(applicationName)))
        {
           var response = await httpClient.GetAsync(callServiceUrl);
           var content = await response.Content.ReadAsStringAsync();
    
           await context.Response.WriteAsync(content);
        }

手動埋點

要通過Zipkin將.Net應用資料上報至Managed Service for OpenTelemetry控制台,除了利用各種現有外掛程式實現埋點的目的,也可以手動埋點。

說明

下載Demo源碼,並按照Readme的說明運行程式。

  1. 安裝NuGet包。

    // 添加zipkin4net(追蹤器)。
    
    dotnet add  package zipkin4net
  2. 註冊和啟動Zipkin。

    TraceManager.SamplingRate = 1.0f;
    var logger = new ConsoleLogger();
    // 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。
    var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");
    
    var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
    TraceManager.RegisterTracer(tracer);
    TraceManager.Start(logger);
  3. 記錄請求資料。

    var trace = Trace.Create();
    
    Trace.Current = trace;
    trace.Record(Annotations.ClientSend());
    
    trace.Record(Annotations.Rpc("client"));
    trace.Record(Annotations.Tag("mytag", "spanFrist"));
    trace.Record(Annotations.ServiceName("dotnetManual"));
    // ...do something
    testCall();
    
    trace.Record(Annotations.ClientRecv());
    說明

    以上代碼用於記錄請求的根操作,如果需要記錄請求的上一步和下一步操作,則需要調用ChildOf方法。樣本:

    var trace = Trace.Current.Child();
    Trace.Current = trace;
    trace.Record(Annotations.ServerRecv());
    trace.Record(Annotations.Rpc("server"));
    trace.Record(Annotations.Tag("mytag", "spanSecond"));
    trace.Record(Annotations.ServiceName("dotnetManual"));
    // ...do something
    trace.Record(Annotations.ServerSend());
  4. 可選:為了快速排查問題,您可以為某個記錄添加一些自訂標籤,例如記錄是否發生錯誤、請求的傳回值等。

    tracer.activeSpan().setTag("http.status_code", "200");
  5. 在分布式系統中發送RPC請求時會帶上Tracing資料,包括TraceId、ParentSpanId、SpanId、Sampled等。您可以在HTTP請求中使用Extract/Inject方法在HTTP Request Headers上透傳資料。總體流程如下:

       Client Span                                                Server Span
    ┌──────────────────┐                                       ┌──────────────────┐
    │                  │                                       │                  │
    │   TraceContext   │           Http Request Headers        │   TraceContext   │
    │ ┌──────────────┐ │          ┌───────────────────┐        │ ┌──────────────┐ │
    │ │ TraceId      │ │          │ X-B3-TraceId      │        │ │ TraceId      │ │
    │ │              │ │          │                   │        │ │              │ │
    │ │ ParentSpanId │ │ Inject   │ X-B3-ParentSpanId │Extract │ │ ParentSpanId │ │
    │ │              ├─┼─────────>│                   ├────────┼>│              │ │
    │ │ SpanId       │ │          │ X-B3-SpanId       │        │ │ SpanId       │ │
    │ │              │ │          │                   │        │ │              │ │
    │ │ Sampled      │ │          │ X-B3-Sampled      │        │ │ Sampled      │ │
    │ └──────────────┘ │          └───────────────────┘        │ └──────────────┘ │
    │                  │                                       │                  │
    └──────────────────┘                                       └──────────────────┘
    1. 在用戶端調用Inject方法傳入Context資訊。

      _injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers);
    2. 在服務端調用Extract方法解析Context資訊。

      Ivar traceContext = traceExtractor.Extract(context.Request.Headers);
      var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);

常見問題

問:Demo程式執行成功,為什麼控制台上沒有上報資料?

答:請檢查senderConfiguration配置中的Endpoint是否填寫正確。

// 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。
var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");