如何在开放遥测中使用traceId创建上下文

问题描述 投票:0回答:2

我尝试通过上下文传播获取与同一跟踪上下文/traceId 关联的以下链中创建的所有跨度:

service1 -> aws sqs 队列 -> service2

汽车。上下文传播不适用于 aws sqs 和 aws sdk v2 atm (https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/3684),即使 AwsTraceHeader 实际上是在 sqs 消息中设置的,我必须明确地照顾它

  • service1:在sqs消息用户属性中写入traceId
    traceId=Span.current().getSpanContext().getTraceId()
  • service2:从sqs消息用户属性
    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

有任何提示如何做到这一点吗?

java amazon-sqs quarkus open-telemetry
2个回答
5
投票

我已经为子 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但以上适用于现在。


0
投票

OpenTelemetry java 仪器指南有其中一些示例代码

        Context extractedContext = opentelemetry.getPropagators().getTextMapPropagator()
                .extract(Context.current(), headers, getter);
        ⋮
        openTelemetry.getPropagators().getTextMapPropagator().inject(Context.current(), transportLayer, setter);

基本上,您将请求中的所有标头传递给 textMapPropagator,它知道如何提取正确设置跨度所需的标头。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.