Я интегрировал сборщик открытой телеметрии с spring-cloud-sleuth и пытаюсь протестировать с его помощью распределенную трассировку. Мое основное требование: если приложение app1 получает заголовок для traceId, оно должно использовать его для регистрации и отслеживания. Если нет, он может сгенерировать свой собственный traceId
Я настроил spring.sleuth.baggage.remoteFields/correlationFields как traceId.
spring:
application:
name: spring-cloud-sleuth-otel-slf4j
sleuth:
otel:
config:
trace-id-ratio-based: 1.0
exporter:
otlp:
endpoint: http://otel-collector:4317
baggage:
remoteFields: requestId,serviceName,trace_id
correlationFields: requestId,serviceName,traceId
tagFields: requestId,serviceName,traceId
Я вызываю API в app1 от почтальона с заголовком X-B3-TraceId. Этот заголовок используется в журналах и трассировках, создаваемых приложением app1. Теперь я вызываю API app2 из app1, используя RestTemplate. В приложении2 я вижу заголовок с именем b3 вместо X-B3-TraceId.
Однако, если я изменю имя заголовка на traceId вместо X-B3-TraceId при вызове app1 из почтальона, оно будет распространено на app2. Однако в этом случае сгенерированная app1 трассировка не использует этот заголовок traceId, а создает новый. Нужно ли мне добавлять какие-либо дополнительные настройки для распространения этих заголовков с правильными именами?
Я смог заставить его работать. По умолчанию стиль распространения настроен на использование один заголовок, который необходимо изменить, чтобы использовать несколько заголовков. Это можно сделать, выполнив следующие шаги: - Используя смелый: -
@Bean
PropagationFactorySupplier myPropagationFactorySupplier() {
return () -> B3Propagation.newFactoryBuilder().injectFormat(B3Propagation.Format.MULTI).build();
}
Без использования храбрых:-
@Bean
public B3Propagator b3Propagator() {
return B3Propagator.injectingMultiHeaders();
}