
OpenTelemetry 使用 TextMapPropagator.inject() 替代 OpenTracing 的 inject() 方法,将当前 Span 上下文序列化到传输载体(如 HTTP headers),实现跨进程链路追踪透传。
opentelemetry 使用 `textmappropagator.inject()` 替代 opentracing 的 `inject()` 方法,将当前 span 上下文序列化到传输载体(如 http headers),实现跨进程链路追踪透传。
在从 OpenTracing 迁移至 OpenTelemetry 的过程中,inject() 是关键的上下文传播操作之一。OpenTracing 中通过 Tracer.inject(spanContext, format, carrier) 将 Span 上下文写入请求头等载体;而 OpenTelemetry 将该能力统一抽象为 Propagators(传播器),并通过 TextMapPropagator 实现基于键值对(如 Map<string string></string> 或 HTTP Header)的跨进程上下文注入。
✅ 等效写法(Java)
// 获取全局 OpenTelemetry 实例(通常通过 OpenTelemetrySdk.builder().build() 初始化)
OpenTelemetry openTelemetry = ...;
// 注入当前 Context(含活跃 Span)到 transportLayer(例如 HTTP headers)
openTelemetry.getPropagators()
.getTextMapPropagator()
.inject(Context.current(), transportLayer, setter);其中:
-
transportLayer:目标载体对象,例如HttpURLConnection、HttpRequest或自定义Map<string string></string>; -
setter:一个Setter<t></t>回调接口,用于将 trace context 的 key-value 对写入载体。常见实现如下:
// 示例:向 Map<String, String> 注入
Map<String, String> headers = new HashMap<>();
Setter<Map<String, String>> setter = (carrier, key, value) -> carrier.put(key, value);
openTelemetry.getPropagators()
.getTextMapPropagator()
.inject(Context.current(), headers, setter);// 示例:向 HTTP 请求头(如 OkHttp Request.Builder)注入
Request.Builder requestBuilder = ...;
Setter<Request.Builder> setter = (builder, key, value) -> builder.header(key, value);
openTelemetry.getPropagators()
.getTextMapPropagator()
.inject(Context.current(), requestBuilder, setter);⚠️ 注意事项
-
Context.current()必须包含活跃的 Span(即已通过Span.wrap(context).makeCurrent()或自动 instrumentation 激活),否则注入的 trace ID 为空; - OpenTelemetry 默认使用 W3C TraceContext(
traceparent/tracestate)格式,兼容性优于 OpenTracing 的uber-trace-id;如需兼容旧系统,可注册自定义 Propagator(如 Jaeger 或 B3); - 不要手动构造或修改
Context—— 应始终通过Context.current()获取,并依赖Scope管理生命周期。
✅ 总结
OpenTracing 的 tracer.inject(...) 在 OpenTelemetry 中由 TextMapPropagator.inject() 承担,其设计更解耦、更可扩展。迁移时只需替换调用方式,并确保 Setter 正确桥接上下文字段与传输层载体。配合标准传播器(如 W3CTraceContextPropagator),即可无缝支持分布式链路追踪透传。

















