我尝试通过上下文传播获取与同一跟踪上下文/traceId 关联的以下链中创建的所有跨度:
service1 -> aws sqs 队列 -> service2
汽车。上下文传播不适用于 aws sqs 和 aws sdk v2 atm (https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/3684),即使 AwsTraceHeader 实际上是在 sqs 消息中设置的,我必须明确地照顾它
traceId=Span.current().getSpanContext().getTraceId()
traceId
读取traceId并覆盖当前的span.traceId/本质上创建service1的上下文但是,现在还不清楚如何在 service2 创建的跨度中实际覆盖 span.traceId,这很令人困惑,因为例如使用 Golang,它似乎很简单:如何从字符串 Traceid 创建 opentelemetry span
我只看到吸气剂,例如
Span.current().getSpanContext().getTraceId()
但没有设置器或构建器方法。
更新:
即使创建一个新的跨度并将其设置为当前跨度(不确定这是否朝着正确的方向发展),
tracer.spanBuilder
也不为traceId AFAIU提供设置器)
@Inject
io.opentelemetry.api.trace.Tracer tracer;
Span consumeMessageSpan = tracer.spanBuilder("consumeMessage").startSpan();
consumeMessage.makeCurrent();
更新2
来自酒店官方文档的这段代码看起来很有希望
要从远程进程链接跨度,设置就足够了 将远程上下文作为父级。
Span childRemoteParent = tracer.spanBuilder("Child").setParent(remoteContext).startSpan();
但是,也没有示例或想法如何创建remoteContext并将traceId设置为从sqs消息中提取的traceId
有任何提示如何做到这一点吗?
我已经为子 JVM 完成了以下操作 (使用 OTel 自动检测代理运行):
public static void main(String[] args) {
Span span = createSpanLinkedToParent();
try (Scope scope = span.makeCurrent()) {
// do stuff
} finally {
span.end();
}
}
private static Span createSpanLinkedToParent() {
// Fetch the trace and span IDs from wherever you've stored them
String traceIdHex = System.getProperty("otel.traceid");
String spanIdHex = System.getProperty("otel.spanid");
SpanContext remoteContext = SpanContext.createFromRemoteParent(
traceIdHex,
spanIdHex,
TraceFlags.getSampled(),
TraceState.getDefault());
return GlobalOpenTelemetry.getTracer("")
.spanBuilder("root span name")
.setParent(Context.current().with(Span.wrap(remoteContext)))
.startSpan();
}
我计划进行下一个改进,使其序列化标志和状态,也许使用上下文传播中的代码https://opentelemetry.io/docs/instrumentation/java/manual/#context-propagation但以上适用于现在。
OpenTelemetry java 仪器指南有其中一些示例代码
Context extractedContext = opentelemetry.getPropagators().getTextMapPropagator()
.extract(Context.current(), headers, getter);
⋮
openTelemetry.getPropagators().getTextMapPropagator().inject(Context.current(), transportLayer, setter);
基本上,您将请求中的所有标头传递给 textMapPropagator,它知道如何提取正确设置跨度所需的标头。