📚 第一部分:概念篇 ------ X-Ray 还在吗?
1. 名字变了?X-Ray vs Application Signals
很多同学现在去控制台找 "X-Ray" 发现入口变了,这里澄清一下:
-
AWS X-Ray (底层技术) :它依然存在,是 AWS 的分布式追踪服务内核。它负责接收 Trace 数据、生成服务地图。
-
CloudWatch Application Signals (现代入口) :这是 AWS 推出的新一代 APM(应用性能监控)体验。它集成了 X-Ray,并加上了 SLO(服务等级目标)和自动化的黄金指标(错误率、延迟、吞吐量)。
一句话总结 :X-Ray 是引擎,Application Signals 是仪表盘。 我们现在做的配置,本质上是"通过 OpenTelemetry 收集数据,发送给 X-Ray,最终在 Application Signals 里看"。
2. 它有什么用?(运维场景)
在微服务和区块链架构中,它就是**"全链路 CT 扫描"**。
-
场景 A:提现为什么卡住了?
-
没有 X-Ray:你只能瞎猜是 RDS 锁表了,还是 KMS 签名慢,还是 MSK 堆积了。
-
有 X-Ray :你会看到一条长长的链路图,一眼发现 "Step Functions -> KMS" 这段线变红了,耗时 5秒,直接定位是签名服务网络抖动。
-
-
场景 B:偶发报错排查
- 每天有 0.1% 的请求失败,日志里查不到规律。X-Ray 可以通过采样捕获这些特定的错误链路,告诉你是在调用 Redis 时发生了超时。
🛠 第二部分:EKS 部署实战篇 (Ops)
我们将使用 AWS Distro for OpenTelemetry (ADOT) 来实现。
📋 准备工作:IAM 权限 (IRSA)
在安装 Add-on 之前,必须先准备好权限,否则插件装好了也发不出数据。
-
创建 IAM Role (例如
EKS-ADOT-Role)。 -
附加策略:
-
AWSXRayDaemonWriteAccess(必须:允许写数据) -
CloudWatchAgentServerPolicy(可选:如果还要发指标)
-
-
配置信任关系 :确保 EKS 集群的 OIDC 允许
opentelemetry-operator-system命名空间下的 ServiceAccount 使用此角色。
🚀 第一步:安装 EKS Add-on (插件)
这是最简单的安装方式,由 AWS 托管控制平面。
-
登录 EKS 控制台 -> 点击你的集群 -> Add-ons (加载项)。
-
点击 Get more add-ons。
-
搜索并选择 AWS Distro for OpenTelemetry。
-
点击下一步安装直到完成。
- 注:这一步会在集群里安装 "ADOT Operator",它是负责管理采集器的"大管家"。
🚀 第二步:部署 Collector 实例 (采集器)
Add-on 只是装了管家,现在我们要部署干活的"邮局"。我们将使用 Kubernetes 的 CRD (自定义资源) 来部署。
创建文件 adot-collector.yaml:
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: my-collector
namespace: opentelemetry-operator-system # 建议放在这里
spec:
mode: deployment # 生产建议用 deployment 模式,甚至可以配 HPA
serviceAccount: adot-collector # ⚠️ 确保此 SA 绑定了上面的 IAM Role
config: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 1s
send_batch_size: 1024
exporters:
awsxray:
region: "ap-southeast-1" # ⚠️ 修改为你的真实区域
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [awsxray]
执行部署:
kubectl apply -f adot-collector.yaml
这一步完成后,你的 EKS 内部就有了一个地址为 my-collector-collector.opentelemetry-operator-system.svc.cluster.local:4317 的接收服务。
☕ 第三部分:Java 程序接入篇 (Dev)
我们追求无代码侵入,开发人员不需要改动 Controller 逻辑,只需要修改 Docker 镜像和 K8s 配置。
1. 修改 Dockerfile (植入探针)
FROM amazoncorretto:17
WORKDIR /app
# 复制业务 Jar
COPY target/my-app.jar /app/app.jar
# ⚠️ 下载 AWS OT Agent (核心步骤)
ADD https://github.com/aws-observability/aws-otel-java-instrumentation/releases/latest/download/aws-opentelemetry-agent.jar /app/agent.jar
# ⚠️ 启动时挂载 Agent
ENTRYPOINT ["java", "-javaagent:/app/agent.jar", "-jar", "/app/app.jar"]
2. 修改 K8s Deployment (指向采集器)
通过环境变量告诉 Agent 数据往哪里发。
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
template:
spec:
containers:
- name: app
image: my-java-app:v1
env:
# 1. 指向第二步部署的 Collector 地址 (GRPC端口)
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://my-collector-collector.opentelemetry-operator-system.svc.cluster.local:4317"
# 2. 必须指定使用 OTLP 协议
- name: OTEL_TRACES_EXPORTER
value: "otlp"
# 3. 定义服务名 (会在 CloudWatch 地图上显示的名字)
- name: OTEL_SERVICE_NAME
value: "blockchain-payment-service"
# 4. 开启 X-Ray 格式传播
- name: OTEL_PROPAGATORS
value: "xray,tracecontext,baggage"
✅ 第四部分:验证与查看
-
产生流量:访问几下你的 Java 接口。
-
查看 CloudWatch:
-
进入 AWS 控制台 -> CloudWatch。
-
左侧菜单找到 Application Signals (或 X-Ray traces)。
-
点击 Service Map (服务地图)。
-
-
验收:
-
你应该能看到
blockchain-payment-service的圆圈。 -
如果你调用了 RDS 或 S3,后面会自动连线。
-
点击圆圈可以看到延迟、错误率和具体的 Trace 详情。
-
总结 : 这套方案是目前 AWS 最推荐的 "Modern Observability" 架构:
-
控制面:EKS Add-on 管理 Operator。
-
数据面:ADOT Collector (CRD) 转发数据。
-
应用面:Java Agent 自动探针。