Spring Boot集成Otel与AppInsight:采样请求生成PropagatedSpan的疑问
问题描述
我们的Spring Boot应用集成了OpenTelemetry SDK 1.23.1和AppInsight Agent v3.4.16,遇到以下现象:
- 当自动检测到带有采样标记(如
00-155346606a87c80bab0c375534b1155e-1ad5743907b9fd93-01)的traceparentHTTP请求时,应用会创建PropagatedSpan(本质是NoOp Span),导致无法为该Span设置自定义属性、更新状态,这直接影响了HTTP请求遥测的准确性(比如监控误判、错误码设置)。 - 当
traceflag=00或无traceparent时,应用会创建支持自定义属性的SdkSpan。
现咨询两个问题:
- 为何带有采样标记的请求会生成
PropagatedSpan? - 是否有办法覆盖此行为?
解答
1. 采样请求生成PropagatedSpan的原因
这是OpenTelemetry SDK默认采样逻辑与AppInsight Agent协同作用的结果:
- 按照W3C Trace Context规范,
traceparent末尾的01代表该Trace已被上游标记为采样状态。 - AppInsight Agent检测到上游的采样标记后,会默认复用这个采样决策,此时OpenTelemetry SDK会创建
PropagatedSpan来传递Trace上下文,但不会生成本地可修改的Span实例——因为PropagatedSpan本质是无操作(NoOp)实现,仅负责上下文传递,不支持属性修改或状态更新。 - 这种设计初衷是避免重复采样、减少遥测数据冗余,但在需要本地增强Span属性的场景下会形成限制。
2. 覆盖此行为的方案
可以通过两种方式修改默认逻辑,强制生成可修改的SdkSpan:
方案一:自定义采样器
实现自定义Sampler,忽略上游采样标记,强制对所有请求生成本地可修改的Span:
public class ForceLocalSampler implements Sampler { @Override public SamplingResult shouldSample(Context parentContext, String traceId, String name, SpanKind spanKind, Attributes attributes, List<Link> links) { // 强制采样,生成可修改的SdkSpan return SamplingResult.recordAndSample(); } @Override public String getDescription() { return "ForceLocalSampler{force record and sample all spans}"; } }
在OpenTelemetry配置中替换默认采样器:
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider(TracerProviderSdk.builder() .setSampler(new ForceLocalSampler()) .build()) .buildAndRegisterGlobal();
方案二:调整AppInsight Agent配置
修改applicationinsights.json配置文件,禁用上游采样决策复用,强制本地生成Span:
{ "instrumentation": { "opentelemetry": { "sampling": { "overrideParentDecision": true } } } }
该配置会让Agent忽略上游的traceflag标记,强制本地执行采样逻辑,从而生成可修改的SdkSpan。
注意事项
- 自定义采样器会增加遥测数据量,需根据监控系统承载能力调整。
- 修改Agent配置后,需重启应用生效。
内容的提问来源于stack exchange,提问作者kinf1
相关产品推荐
相关产品推荐

