部署在EC2的Java应用无法获取AWS XRay追踪及服务地图
排查AWS XRay无追踪数据问题
以下是针对你的情况的具体排查步骤:
1. 验证采样规则配置
你的代码中使用了LocalizedSamplingStrategy,需确认sampling-rules.json的配置是否正确:
- 检查文件是否存在于类路径下,内容是否包含有效的采样规则,比如默认规则的
rate是否大于0(若设为0则不会采样任何请求)。示例正确配置:{ "version": 2, "default": { "fixed_target": 5, "rate": 1.0 }, "rules": [] } - 如果自定义了规则,确保规则的匹配条件(如
http_method、url_path)与实际请求一致,避免请求未命中任何采样规则而被丢弃。
2. 确认XRay Servlet Filter生效
AWSXRayServletFilter负责为HTTP请求自动创建和管理Segment,需验证Filter是否被正确拦截请求:
- 在Filter的
doFilter方法中添加日志(或临时修改代码),确认每个目标请求都经过该Filter。 - 检查Spring Boot的Filter注册顺序,确保XRay Filter在其他可能截断请求的Filter之前执行。
3. 检查XRay Daemon运行状态
虽然你看到UDP发送日志,但需确认XRay Daemon是否正常将数据转发到AWS XRay服务:
- 执行
ps aux | grep xray确认Daemon进程正在运行。 - 查看
/var/log/xray/xray.log,查找包含Successfully sent batch的日志条目,确认Daemon成功将追踪数据发送到AWS服务。若只有UDP接收日志但无发送成功记录,需检查Daemon的网络配置(如是否能访问XRay服务端点)。
4. 验证IAM角色权限与有效性
已附加AWSXrayWriteOnlyAccess角色,仍需确认:
- 角色的信任策略是否允许EC2服务扮演该角色(信任策略需包含
ec2.amazonaws.com作为Principal)。 - 在EC2实例上执行测试命令,手动发送测试追踪段:
执行后查看XRay控制台是否能看到该测试段,若成功则说明权限和网络正常,问题出在应用代码层面。aws xray put-trace-segment --trace-segment '{"id": "12345678901234567890123456789012", "name": "test-segment", "start_time": 1620000000.0, "end_time": 1620000001.0}'
5. 排除插件冲突与Recorder初始化问题
你同时启用了EC2Plugin和ElasticBeanstalkPlugin,可能存在冲突:
- 若应用部署在Elastic Beanstalk环境,尝试仅保留
ElasticBeanstalkPlugin,移除EC2Plugin后重启应用。 - 检查Recorder初始化逻辑,确认
AWSXRay.setGlobalRecorder(builder.build())执行成功,且后续代码中未覆盖全局Recorder。
6. 忽略CloudWatch Agent提示
你遇到的CloudWatch Agent相关提示属于日志引用功能,不会影响XRay追踪数据的收集与上报,可暂时忽略该警告。
7. 确认控制台时间范围与时区
检查XRay控制台的时间范围设置,同时确认EC2实例的系统时区与控制台时区(默认UTC)是否一致,避免因时区差异导致数据显示在未选择的时间范围内。
内容的提问来源于stack exchange,提问作者Devashish Priyadarshi
相关产品推荐
相关产品推荐

