首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在开放遥测中使用traceId创建上下文

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

Stack Overflow用户
提问于 2022-06-18 11:01:22
回答 1查看 1.3K关注 0票数 6

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

service1 -> aws sqs队列-> service2

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

  • service1:用sqs消息用户属性traceId=Span.current().getSpanContext().getTraceId()编写traceId
  • service2:从sqs消息用户属性traceId读取traceId并覆盖当前span.traceId /实质上创建service1上下文

然而,现在还不清楚如何在span.traceId创建的范围内真正覆盖service2,这是令人困惑的,因为对于Golang,它似乎很简单:如何从字符串跟踪创建opentelemetry

我只看到getter,例如Span.current().getSpanContext().getTraceId(),而没有setter或builder方法。

更新:

即使通过创建一个新的跨度并使其成为当前的(不确定这是否朝着正确的方向发展),tracer.spanBuilder也没有为traceId AFAIU提供设置器)

代码语言:javascript
复制
@Inject
io.opentelemetry.api.trace.Tracer tracer;

Span consumeMessageSpan = tracer.spanBuilder("consumeMessage").startSpan();

consumeMessage.makeCurrent();

更新2

这段来自otel官方文档的片段看起来很有希望。

若要从远程进程链接跨范围,只需将远程上下文设置为父进程即可。

代码语言:javascript
复制
Span childRemoteParent = tracer.spanBuilder("Child").setParent(remoteContext).startSpan(); 

但是,也没有关于如何创建remoteContext和将traceId设置为从sqs消息提取的示例或想法。

有什么暗示怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-01 08:03:19

我为一个子JVM (使用OTel自动仪表代理运行)做了以下工作:

代码语言:javascript
复制
    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中使用这里的代码,但上面的工作目前还有效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72668718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档