web-dev-qa-db-ja.com

現在のTraceIdとSpanIdを取得する方法

この記事 https://devblogs.Microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/ は、フィールドTraceIdは相関IDとして使用できます。

info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
     => ConnectionId:0HLR1BR0PL1CH 
     => RequestPath:/weatherforecastproxy 
        RequestId:0HLR1BR0PL1CH:00000001, 
        SpanId:|363a800a-4cf070ad93fe3bd8., 
        TraceId:363a800a-4cf070ad93fe3bd8, 
        ParentId: Executed endpoint 'FrontEndApp.Controllers.WeatherForecastProxyController.Get
(FrontEndApp)'

実際、ログシンクではこれがアドバタイズされたとおりに機能していることがわかります。WebアプリケーションAがリクエストを処理し、WebアプリケーションBを呼び出すと、両方が同じTraceId値をログに書き込みます。

私が理解している限り、着信Request-Idヘッダーを受信するASP.NET Coreアプリケーションは同じヘッダーを発信要求に添付しますが、ヘッダーが着信要求に存在しない場合、新しい値が生成されます発信リクエスト。

その値をWebアプリケーションAからの応答に追加するように求められましたが、(当然のことながら)着信要求では使用できません。

私はSystem.Diagnostics.Activityクラスを見てきましたが、Activity.Currentにアクセスしても、有用なインスタンスは提供されません-TraceIDは{}だけです-つまり空です。

私の質問はこれです:WebアプリケーションのコンテキストでTraceId値にアクセスするにはどうすればよいですか?

-S

3
Sigurd Garshol

TraceId値を含むヘッダーを追加しようとしたときにも同じ問題が発生しました。

ModelValidationを使用していくつかのテストを行うと、この種のエラー応答よりも「traceId」値が正しいことがわかりましたが、httpコンテキスト変数からこの値を取得できませんでした。

次に、ネットコアのソースコードに行って、DefaultProblemDetailsFactoryの実装と驚きを確認しました。 「traceId」値は、これを実行して取得されます。

var traceId = Activity.Current?.Id ?? httpContext?.TraceIdentifier;

はい、Activity静的変数を使用してtraceIdを取得できます。