You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Erlang/Elixir中OpenTelemetry传播:子Span无法生成问题排查

gRPC API OpenTelemetry链路追踪:子Span生成问题排查

问题背景

为gRPC API添加OpenTelemetry链路追踪时,请求中已包含trace/span ID,但无法正确生成子Span,在iex控制台中看不到Span输出。测试代码如下:

require OpenTelemetry.Tracer
alias OpenTelemetry.Tracer

:otel_propagator_text_map.extract([{"traceparent", "00-00000000000000001f28325aa9c79b59-37ab46991f7a64e1-00"}])
_parent = :otel_tracer.current_span_ctx()

span_ctx = Tracer.start_span("otel-test")
Tracer.set_current_span(span_ctx)
# start doing some work
:timer.sleep(100)
# work done

Tracer.end_span(span_ctx)

问题原因及修复方案

1. 子Span未关联父上下文

原代码中start_span调用时未显式指定父Span上下文,导致新创建的Span无法关联到从traceparent提取的父Span,而是生成了独立的根Span(或未正确关联)。

修正后的代码需要在启动子Span时通过with_parent参数绑定提取到的父上下文:

require OpenTelemetry.Tracer
alias OpenTelemetry.Tracer

# 提取traceparent中的链路上下文
:otel_propagator_text_map.extract([{"traceparent", "00-00000000000000001f28325aa9c79b59-37ab46991f7a64e1-00"}])
parent_span_ctx = :otel_tracer.current_span_ctx()

# 显式指定父上下文启动子Span
span_ctx = Tracer.start_span("otel-test", %{with_parent: parent_span_ctx})
Tracer.set_current_span(span_ctx)

# 模拟业务操作
:timer.sleep(100)

# 结束子Span
Tracer.end_span(span_ctx)

2. 未配置Span导出器

如果控制台看不到Span输出,大概率是未配置OpenTelemetry的Span导出器。需要在项目的config.exs中添加控制台导出配置:

config :opentelemetry, :processors,
  otel_batch_processor: %{
    exporter: {:otel_exporter_stdout, []}
  }

3. 确保OpenTelemetry应用已启动

在iex中测试时,需要确保OpenTelemetry相关应用已启动,可手动执行:

Application.ensure_all_started(:opentelemetry)

验证步骤

  1. 配置好导出器后重启iex
  2. 执行修正后的代码
  3. 控制台会输出包含父子Span关联信息的链路数据,其中子Span的parent_span_id会匹配traceparent中的span ID

内容的提问来源于stack exchange,提问作者user1453428

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:52:32