Closed lrwh closed 11 months ago
尝试使用 MinIO 作为 s3 存储,程序运行一切正常。
经过反复测试源码最终找到了问题的根本,在 TracingRequestHandler
类下找到了一下这段代码:
if (Config.get().isAwsPropagationEnabled()) {
try {
propagate().inject(span, request, DECORATE, TracePropagationStyle.XRAY);
} catch (Throwable e) {
log.warn("Unable to inject trace header", e);
}
}
这段代码含义是:如果开启了 aws 的传播器,设置当前的传播器类型为TracePropagationStyle.XRAY
,则会往对应的 request 的 header 添加当前 span 信息。
通过 XRay
传播器,很清楚的知道当前传递的 header key 信息。
setter.set(carrier, X_AMZN_TRACE_ID, buf.toString());
...
static final String X_AMZN_TRACE_ID = "X-Amzn-Trace-Id";
通过探索&发现
,得出以下结论:
同时使用 s3 sdk 和 ddtrace,会往对应的请求添加 header 信息,由于
XSKY
作为后端存储,相关接口对 header 做了限制,导致最终请求为 403 .
-Ddd.aws.propagation.enabled=false
,只是不进行链路的向下传递,但不影响 span 生成。XSKY
提出建议,APM 这块都是需要用到 header,不论是 DDTrace
还是 OpenTelemetry
,又或者是其他的 APM 类 Agent 。关于 XRAY 传播器更多资料可以通过 XRAY官方文档 了解
背景
使用 ddtrace 后,s3 相关接口异常,异常信息如下:
去掉 ddtrace 后,相关接口正常
推断
疑是 ddtrace 探针问题,还需要进一步排查