我试图通过上下文传播获取与同一跟踪上下文/traceId关联的以下链中创建的所有跨域:
service1 -> aws sqs队列-> service2
汽车。上下文传播不适用于aws和aws v2 atm (https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/3684),即使AwsTraceHeader实际上是在sqs消息中设置的,但我必须通过
traceId=Span.current().getSpanContext().getTraceId()编写traceIdtraceId读取traceId并覆盖当前span.traceId /实质上创建service1上下文然而,现在还不清楚如何在span.traceId创建的范围内真正覆盖service2,这是令人困惑的,因为对于Golang,它似乎很简单:如何从字符串跟踪创建opentelemetry。
我只看到getter,例如Span.current().getSpanContext().getTraceId(),而没有setter或builder方法。
更新:
即使通过创建一个新的跨度并使其成为当前的(不确定这是否朝着正确的方向发展),tracer.spanBuilder也没有为traceId AFAIU提供设置器)
@Inject
io.opentelemetry.api.trace.Tracer tracer;
Span consumeMessageSpan = tracer.spanBuilder("consumeMessage").startSpan();
consumeMessage.makeCurrent();更新2
这段来自otel官方文档的片段看起来很有希望。
若要从远程进程链接跨范围,只需将远程上下文设置为父进程即可。
Span childRemoteParent = tracer.spanBuilder("Child").setParent(remoteContext).startSpan(); 但是,也没有关于如何创建remoteContext和将traceId设置为从sqs消息提取的示例或想法。
有什么暗示怎么做吗?
发布于 2022-07-01 08:03:19
我为一个子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中使用这里的代码,但上面的工作目前还有效。
https://stackoverflow.com/questions/72668718
复制相似问题