Zipkin は分散トレーシングシステムです。これは、リアルタイムデータのトレースのために Twitter によって開発されたオープンソースシステムです。Zipkin は、複数の異種システムから収集されたリアルタイム監視データを集約するために使用されます。Zipkin を使用して、Tracing Analysis で .NET アプリケーションのデータをレポートできます。この方法は C# アプリケーションにも適用されます。
前提条件
ASP.NET Core を使用して .NET アプリケーションをインストゥルメント化する
ASP.NET Core を使用してアプリケーションをインストゥルメントするには、次の手順を実行します。
説明 デモプロジェクトをダウンロードし、README.md ファイルの指示に従ってプログラムを実行します。
- NuGet パッケージをインストールします。
// 次のコンポーネントを追加します。 // zipkin4net.middleware.aspnetcore、ASP.NET Core ミドルウェア // zipkin4net、トレーサー dotnet add package zipkin4net.middleware.aspnetcore dotnet add package zipkin4net - 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); - 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 ファイルの指示に従ってプログラムを実行します。
- NuGet パッケージをインストールします。
// 次のコンポーネントを追加します。 // zipkin4net.middleware.aspnetcore、ASP.NET Core ミドルウェア // zipkin4net、トレーサー dotnet add package zipkin4net.middleware.aspnetcore dotnet add package zipkin4net - 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"]); - 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 ファイルの指示に従ってプログラムを実行します。
- NuGet パッケージをインストールします。
// zipkin4net、トレーサーを追加します。 dotnet add package zipkin4net - 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); - リクエストデータを記録します。
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()); - オプション:迅速なトラブルシューティングのために、カスタムタグをスパンに追加します。たとえば、エラーが発生したかどうかを確認したり、リクエストの戻り値を記録したりするために、カスタムタグを追加できます。
tracer.activeSpan().setTag("http.status_code", "200"); - 分散システムでは、リモートプロシージャコール (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 │ │ │ └──────────────┘ │ └───────────────────┘ │ └──────────────┘ │ │ │ │ │ └──────────────────┘ └──────────────────┘- クライアントで Inject メソッドを呼び出して、コンテキスト情報を挿入します。
_injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers); - サーバーで Extract メソッドを呼び出して、コンテキスト情報を抽出します。
Ivar traceContext = traceExtractor.Extract(context.Request.Headers); var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);
- クライアントで Inject メソッドを呼び出して、コンテキスト情報を挿入します。
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");