すべてのプロダクト
Search
ドキュメントセンター

Managed Service for OpenTelemetry:Zipkin を使用して .NET アプリケーションデータをレポートする

最終更新日:Dec 30, 2024

Zipkin は分散トレーシングシステムです。これは、リアルタイムデータのトレースのために Twitter によって開発されたオープンソースシステムです。Zipkin は、複数の異種システムから収集されたリアルタイム監視データを集約するために使用されます。Zipkin を使用して、Tracing Analysis で .NET アプリケーションのデータをレポートできます。この方法は C# アプリケーションにも適用されます。

前提条件

Jaeger または Zipkin のエンドポイントを取得するには、次の手順を実行します。

  1. Managed Service for OpenTelemetry コンソールにログインします。

  2. 左側のナビゲーションペインで、クラスタ設定をクリックします。表示されるページで、アクセスポイント情報タブをクリックします。

  3. 上部のナビゲーションバーで、リージョンを選択します。クラスタ情報セクションで、トークンを表示をオンにします。

  4. クライアントパラメータを Jaeger または Zipkin に設定します。この例では、Jaeger が選択されています。

    下部の表の関連情報列で、Jaeger または Zipkin のエンドポイントを取得します。

    Jaeger/Zipkin接入点信息

    説明

    アプリケーションが Alibaba Cloud の本番環境にデプロイされている場合は、VPC エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。一般的に、Zipkin には v2 のエンドポイントを使用します。Zipkin についてよく知っている場合にのみ、v1 のエンドポイントを使用してください。

ASP.NET Core を使用して .NET アプリケーションをインストゥルメント化する

ASP.NET Core を使用してアプリケーションをインストゥルメントするには、次の手順を実行します。

説明 デモプロジェクトをダウンロードし、README.md ファイルの指示に従ってプログラムを実行します。
  1. NuGet パッケージをインストールします。
    // 次のコンポーネントを追加します。
    // zipkin4net.middleware.aspnetcore、ASP.NET Core ミドルウェア
    // 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");
        // Tracing Analysis コンソールで Zipkin エンドポイントを取得します。エンドポイントには /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 を使用して .NET アプリケーションをインストゥルメント化する

Open Web Interface for .NET (OWIN) を使用してアプリケーションをインストゥルメントするには、次の手順を実行します。

説明 デモプロジェクトをダウンロードし、README.md ファイルの指示に従ってプログラムを実行します。
  1. NuGet パッケージをインストールします。
    // 次のコンポーネントを追加します。
    // zipkin4net.middleware.aspnetcore、ASP.NET Core ミドルウェア
    // zipkin4net、トレーサー
    
    dotnet add  package zipkin4net.middleware.aspnetcore
    dotnet add  package zipkin4net
  2. Zipkin を登録して起動します。
    // トレーシングを設定します。
    TraceManager.SamplingRate = 1.0f;
    var logger = new ConsoleLogger();
    // Tracing Analysis コンソールで Zipkin エンドポイントを取得します。エンドポイントには /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);
    
    // アプリの破棄時に TraceManager を停止します
    var properties = new AppProperties(appBuilder.Properties);
    var token = properties.OnAppDisposing;
    
    if (token != CancellationToken.None)
    {
    token.Register(() =>
    {
    TraceManager.Stop();
    });
    }
    
    // Owin ミドルウェアを設定します
    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);
        }

.NET アプリケーションを手動でインストゥルメント化する

前のセクションでは、既存のコンポーネントを使用して .NET アプリケーションをインストゥルメントする方法について説明しました。また、.NET アプリケーションを手動でインストゥルメントして、Zipkin を使用してアプリケーションのデータを Tracing Analysis コンソールにレポートすることもできます。

説明 デモプロジェクトをダウンロードし、README.md ファイルの指示に従ってプログラムを実行します。
  1. NuGet パッケージをインストールします。
    // zipkin4net、トレーサーを追加します。
    
    dotnet add  package zipkin4net
  2. Zipkin を登録して起動します。
    TraceManager.SamplingRate = 1.0f;
    var logger = new ConsoleLogger();
    // Tracing Analysis コンソールで Zipkin エンドポイントを取得します。エンドポイントには /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"));
    // ...何かを実行します
    testCall();
    
    trace.Record(Annotations.ClientRecv());
    説明

    上記のコードを実行して、リクエストのルート操作を記録できます。リクエストの前後の操作を記録する必要がある場合は、Child メソッドを呼び出します。サンプルコード:

    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"));
    // ...何かを実行します
    trace.Record(Annotations.ServerSend());
  4. オプション:迅速なトラブルシューティングのために、カスタムタグをスパンに追加します。たとえば、エラーが発生したかどうかを確認したり、リクエストの戻り値を記録したりするために、カスタムタグを追加できます。
    tracer.activeSpan().setTag("http.status_code", "200");
  5. 分散システムでは、リモートプロシージャコール (RPC) リクエストはトレースデータとともに送信されます。トレースデータには、TraceId、ParentSpanId、SpanId、および Sampled パラメータの値が含まれています。Extract または Inject メソッドを呼び出して、HTTP リクエストヘッダーでデータを渡すことができます。全体的なプロセスは次のとおりです。
       クライアントスパン                                                サーバースパン
    ┌──────────────────┐                                       ┌──────────────────┐
    │                  │                                       │                  │
    │   TraceContext   │           HTTP リクエストヘッダー        │   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 メソッドを呼び出して、コンテキスト情報を挿入します。
      _injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers);
    2. サーバーで Extract メソッドを呼び出して、コンテキスト情報を抽出します。
      Ivar traceContext = traceExtractor.Extract(context.Request.Headers);
      var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);

FAQ

Q:デモプログラムを実行した後、コンソールにデータがレポートされないのはなぜですか?

A:senderConfiguration で正しいエンドポイントが設定されているかどうかを確認してください。

// Tracing Analysis コンソールで Zipkin エンドポイントを取得します。エンドポイントには /api/v2/spans が含まれていないことに注意してください。
var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");