Datadog迁移至OpenTelemetry后Ingested Spans异常增多及子Span统计疑问
关于Datadog Ingested Spans机制与OTEL迁移后的差异解析
一、Datadog原生SDK的默认行为
是的,使用Datadog Go原生SDK时,默认仅根Span会被统计为Ingested Spans,同时仅为根Span的operationName生成请求量、延迟等指标。
背后的逻辑是:
- 采用Trace级采样,当一个Trace被采样后,仅根Span会作为独立的Ingested Span上报,子Span只会作为根Span的附属数据出现在追踪详情页中,不会单独计入Ingested Spans统计,也不会生成独立的操作指标。
- 内置了服务内部子Span的过滤逻辑,默认不会将内部操作类的子Span(如你示例中的Span B)单独上报为可统计的Ingested Span。
二、迁移至OTEL SDK后行为变化的原因
迁移到OpenTelemetry SDK后子Span被纳入统计,核心是OTEL与Datadog的集成逻辑和原生SDK存在本质差异:
- Span上报规则不同:OTEL遵循OpenTelemetry标准,默认会将Trace中所有被采样到的Span(包括子Span)都单独上报给Datadog后端。每个被上报的Span都会被计入Ingested Spans统计,同时为每个Span的
operationName生成对应的指标(也就是你看到的other.operation指标)。 - 默认过滤逻辑缺失:Datadog原生SDK默认过滤内部子Span的独立上报,而OTEL SDK没有这个默认规则,所有符合采样条件的Span都会被独立上报。
- 采样与上报的分离:虽然OTEL也默认采用Trace级采样,但采样后会将Trace内的所有Span作为独立实体上报,而非像Datadog原生SDK那样只上报根Span并附带子Span数据。
三、调整建议(可选)
如果需要恢复到和Datadog原生SDK一致的行为,可通过以下方式配置OTEL:
- 在OTEL Collector中添加
filter处理器,过滤掉非根Span(通过判断parent_span_id是否为空),仅保留根Span上报给Datadog。 - 调整Datadog OTEL Exporter的配置,开启类似原生SDK的内部Span过滤逻辑。
内容的提问来源于stack exchange,提问作者oren
相关产品推荐
相关产品推荐

