В общем, не все так просто как казалось.
Пришлось скачать исходники opentelemetry
https://github.com/open-telemetry/opentelemetry-dotnet и посмотреть, как устроено распространение трассировочной информации в инструментарии AspNetCore.
Сохранение, передача и восстановление TraceID (и доп информации) называется Propogation.
В пакете OpenTelemetry Есть специальный класс:
OpenTelemetry.Context.Propagation.Propagators
Который возвращает этих пропогаторов с помощью которых производиться внедрение и извлечение контекстной информации (информации о трассировке).
Чтобы куда-нибудь внедрить данные о трассировке, можно использовать примерно такой код:
//достаем текстового распространителя
var textMapPropagator = Propagators.DefaultTextMapPropagator;
//формируем контекст распространения
var propContext = new OpenTelemetry.Context.Propagation.PropagationContext(Activity.Current.Context, Baggage.Current);
//этот метод вызывает для каждого необходимого значения их контекста распространения ваш же метод, который сохраняет пару ключ-значения для последующего восстановления
textMapPropagator.Inject(propContext,context, (ctx, name, val) =>
{
ctx.Headers.Set(name,val);
});
На другой стороне нужно контекст трассировки восстановить. код примерно такой:
//извлекаем из среды распространяемую трейс-информацию
var propagator = Propagators.DefaultTextMapPropagator;
PropagationContext propagationContext = propagator.Extract(default, context,
(ctx, name) => { return new string[] { ctx.Headers.Get<string>(name) }; });
if (propagationContext.ActivityContext.IsValid())
{
//формируем новый спан.
newOne = new Activity("Consumer");
newOne.SetParentId(propagationContext.ActivityContext.TraceId,
propagationContext.ActivityContext.SpanId,
propagationContext.ActivityContext.TraceFlags);
newOne.TraceStateString = propagationContext.ActivityContext.TraceState;
newOne.Start();
newOne.IsAllDataRequested = false;
Baggage.Current = propagationContext.Baggage;
}
в результате контекст трассировки восстанавливается и в Jaeger попадает в связанном виде.
Единственная проблема в том, что именно этот Span не сохраняется (хотя все последующие в цепочке - да) и появляется Warning вида: "invalid parent span IDs=b3f757a84de75eda; skipping clock skew adjustment"
Что с ним делать - пока не знаю. чего-то все такие не хватает