Datadog tracer 忽略 Ingress/Egress — 所有跨度都会获得 `span.kind:internal` (客户端/服务器指标已消失)
*Title*: Datadog tracer ignores Ingress/Egress — all spans get `span.kind:internal` (client/server metrics gone) *Description*: 从 Istio 1.17 (基于 OpenTracing 的 Datadog tracer) 升级到 Istio 1.30.2 (Envoy 1.38.x / `envoy.tracers.datadog` 通过 dd-trace-cpp) 后, Datadog APM 为 Envoy 代理范围的指标停止在 `span.kind:client` 和 `span.kind:server` 上进行分割。所有流量都移到了 `span.kind:internal` 中。 观察到 (prod, kube_cluster_name=prod-use1-eks1): | 窗口 | client | server | internal | --- | --- | --- | --- | 切换前 (Istio 1.17, 旧的 Datadog tracer) | ~half | ~half | none | 切换后 (Istio 1.30.2 / Envoy 1.38.3) | none | none | 100% | 客户端/服务器系列在切换边界上降至零; `internal` 同时出现。范围仍然正确发送 (`operation_name=envoy.proxy`, `component=proxy`, `language=cpp`), 方向仍然可以通过 `upstream_cluster` (`inbound|…` 与 `outbound|…`) 来查看。唯一缺少的分类是 `span.kind`。 预期: Envoy 应从流量方向中设置 Datadog `span.kind`: - `Tracing::OperationName::Ingress` → `span.kind=server` - `Tracing::OperationName::Egress` → `span.kind=client` 恐慌的根原因: 在 `source/extensions/tracers/datadog/tracer.cc` (`Tracer::startSpan`) 和 `span.cc` (`Span::spawnChild`) 中, 驱动程序明确忽略了 `Tracing::Config`: // OpenTracing 实现忽略了 `Tracing::Config` 参数, 因此我们也会这样做。 `Tracing::Config::operationName()` 因此从未映射到 dd-trace-cpp 范围。没有 `span.kind` 标签, Datadog 将范围视为 `internal`。 最小修复 - 停止忽略 `config`, 在创建范围后设置: switch (config.operationName()) { case Tracing::OperationName::Ingress: span.set_tag("span.kind", "server"); break; case Tracing::OperationName::Egress: span.set_tag("span.kind", "client"); break; } (在 `spawnChild` 中相同), 以及单元测试覆盖 Ingress/Egress 生成相应的 `span.kind` 元数据。 这看起来像是一个从 OpenTracing 到 dd-trace-cpp 重写的回归类 (#26284), 类似于 #30235 / #31366 中修复的命名问题。如果维护者同意此方法, 我很乐意开一个 PR。请考虑将其回移到 Envoy 1.38.x 线 (Istio 1.30 发行版中提供的内容)。 cc @xlamorlette-datadog @zacharycmontoya @mattklein123 *Repro steps*: 1. 运行 Envoy 1.38.x (或 Istio 1.30.x 侧车), 并启用 Datadog tracer, 例如通过 Istio Telemetry: apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: mesh-logging namespace: istio-system spec: tracing: - providers: - name: datadog randomSamplingPercentage: 100 使用 `meshConfig.extensionProviders` 指向端口 8126 上的 Datadog 代理 (或等效的 bare-Envoy `envoy.tracers.datadog` 配置)。 2. 生成入站 (ingress) 和出站 (egress) HTTP 流量。 3. 在 Datadog 中, 绘制图表: …
内容来源: envoyproxy/envoy