Как получить текущий TraceId и SpanId - PullRequest
0 голосов
/ 10 февраля 2020

Эта статья, https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/, рассказывает мне, что поле TraceId доступно в качестве идентификатора корреляции, что здорово!

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)'

На самом деле, я вижу это в наш приемник журналов работает так, как объявлено: когда веб-приложение A обслуживает запрос и при этом вызывает веб-приложение B, они оба записывают одно и то же значение TraceId в журнал.

Насколько я понимаю, любое ASP. NET Базовое приложение, которое получает входящий заголовок Request-Id, присоединит тот же заголовок к исходящим запросам, но если заголовок не существует во входящем запросе для исходящего запроса будет сгенерировано новое значение.

Нас попросили добавить это значение в ответ от веб-приложения A, но (что неудивительно) недоступно для входящего запроса.

Я смотрю на класс System.Diagnostics.Activity, но доступ к Activity.Current не дает мне экземпляра с чем-нибудь полезным - TraceID просто {} - то есть пуст.

Мой вопрос это: Как я могу получить доступ к значению TraceId в контексте веб-приложения?

-S

1 Ответ

0 голосов
/ 23 апреля 2020

У меня была такая же проблема, когда я пытался добавить заголовок со значением TraceId.

При выполнении некоторых тестов с ModelValidation я видел, что в этом типе ответа об ошибке значение "traceId" было правильным, но я мог не получить это значение из переменной контекста http любым способом.

Затем я перешел к net исходному коду ядра, чтобы увидеть DefaultProblemDetailsFactory реализацию и сюрприз! Значение «traceId» получается следующим образом:

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

Да, вы можете получить THE traceId, используя переменную Activity stati c.

...