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)
验证步骤
- 配置好导出器后重启iex
- 执行修正后的代码
- 控制台会输出包含父子Span关联信息的链路数据,其中子Span的
parent_span_id会匹配traceparent中的span ID
内容的提问来源于stack exchange,提问作者user1453428
相关产品推荐
相关产品推荐

