この記事 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
TraceId値を含むヘッダーを追加しようとしたときにも同じ問題が発生しました。
ModelValidationを使用していくつかのテストを行うと、この種のエラー応答よりも「traceId」値が正しいことがわかりましたが、httpコンテキスト変数からこの値を取得できませんでした。
次に、ネットコアのソースコードに行って、DefaultProblemDetailsFactoryの実装と驚きを確認しました。 「traceId」値は、これを実行して取得されます。
var traceId = Activity.Current?.Id ?? httpContext?.TraceIdentifier;
はい、Activity静的変数を使用してtraceIdを取得できます。