XRay Traces 未显示在 AWS 控制台中
XRay Traces not showing up in AWS Console
我已经按照 AWS 文档为我们在 AWS ECS 上部署的 Spring 启动应用程序设置 XRAY,但我无法在 AWS 控制台中看到我的服务的踪迹。以下是我实施的更改的高级视图:
向我的 EC2 添加了具有策略权限的角色
"xray:BatchGetTraces",
"xray:GetServiceGraph",
"xray:GetTraceGraph",
"xray:GetTraceSummaries",
"xray:PutTelemetryRecords",
"xray:PutTraceSegments"
添加了跟踪过滤器
@Bean
public Filter TracingFilter() {
return new AWSXRayServletFilter("myService");
}
向我们的 POM 文件添加了 XRAY 依赖项,并向我们的控制器方法添加了 @XRayEnabled 注释:
将 XRAY 守护程序下载到我们的 ec2 实例并安装
curl https://s3.dualstack.us-east-1.amazonaws.com/aws-xray-assets.us-east-1/xray-daemon/aws-xray-daemon-3.x.rpm -o /home/ec2-user/xray.rpm
yum install -y /home/ec2-user/xray.rpm
我已经确认我们看到的是 UDP 日志记录语句,例如:
com.amazonaws.xray.emitters.UDPEmitter:
{
"name" : "myService",
"id" : "1234",
"start_time" : 1.546020031234E9,
"trace_id" : "myTraceId",
"end_time" : 1.546020031234E9,
"http" : {
"request" : {
"method" : "POST",
"client_ip" : "myIp",
"url" : "myURL",
"user_agent" : "PostmanRuntime/7.4.0",
"x_forwarded_for" : true
},
"response" : {
"content_length" : 200,
"status" : 200
}
},
"aws" : {
"xray" : {
"sdk_version" : "1.2.1",
"sdk" : "X-Ray for Java"
}
},
"service" : {
"runtime" : "OpenJDK 64-Bit Server VM",
"runtime_version" : "1.8.0_151"
}
}
而且我还使用 netstat -tulpn
验证了守护进程在 ec2 上 运行
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 127.0.0.1:2000 0.0.0.0:* 14126/xray
还需要什么才能让 XRAY 跟踪显示在 AWS 控制台中?
我已经在启用日志记录的情况下启动了 docker 守护程序,但我没有看到任何迹象表明 docker 守护程序正在向 AWS 发送数据,只是启动信息而已:
2018-12-28T23:14:19Z [Info] Initializing AWS X-Ray daemon 3.0.0
2018-12-28T23:14:19Z [Info] Using buffer memory limit of 304 MB
2018-12-28T23:14:19Z [Info] 4864 segment buffers allocated
2018-12-28T23:14:19Z [Info] Using region: us-east-1
2018-12-28T23:14:19Z [Info] Starting proxy http server on 127.0.0.1:2000
我猜这个问题是因为你是 EC2 主机上的 运行 X-Ray Daemon 并且你的 java 容器默认情况下试图将事件发送到 127.0.0.1:2000
里面java 容器本身而不是主机地址。 Docker 容器将 127.0.0.1
视为在容器范围内。
您需要在 Java 应用程序上正确配置 X-Ray 守护程序地址。
AWS_XRAY_DAEMON_ADDRESS – Set the host and port of the X-Ray daemon
listener. By default, the SDK uses 127.0.0.1:2000 for both trace data
(UDP) and sampling (TCP). Use this variable if you have configured the
daemon to listen on a different port or if it is running on a
different host.
Format
Same port – address:port
Different ports – tcp:address:port udp:address:port
由于您正在检测基于 ECS 的应用程序,我建议将 X-Ray 守护进程启动为 Docker 容器,而不是 EC2 主机上的实际进程。
例子-
- 运行 X-Ray Daemon 作为 ECS 容器(作为 Daemon 调度类型)。
https://docs.aws.amazon.com/xray/latest/devguide/xray-daemon-ecs.html
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html#service_scheduler
- 根据您在 ECS 上使用的网络模型,您应该能够与 java 容器中的 X-Ray 容器地址和端口进行交互。
如果您有任何问题,请告诉我。
更新-
X-RAY Daemon 作为 Docker 容器与 运行 它在主机上?
这只是一些意见,似乎是 AWS 推荐的一些方法。我能想到的几个优点是
- 您无需维护 scripts/sequence 即可将 X-Ray 守护进程作为 EC2 AMI 的一部分。
- 您不必授予整个 EC2 角色权限即可将数据发送到 X-Ray,但使用容器时,只有该特定任务角色具有权限,而不是其他所有角色。
- 如果进程由于任何原因停止,您必须手动启动进程或从集群中删除 EC2 或在 AMI 上维护复杂的脚本。但是作为 ECS 管理的容器,它将确保任务总是 运行。
- ECS Daemon 调度文档说你的情况是他们带来这种类型的容器的原因。
https://aws.amazon.com/about-aws/whats-new/2018/06/amazon-ecs-adds-daemon-scheduling/
同样,这只是我的意见,但您也可以按照自己的意愿去做。
我已经按照 AWS 文档为我们在 AWS ECS 上部署的 Spring 启动应用程序设置 XRAY,但我无法在 AWS 控制台中看到我的服务的踪迹。以下是我实施的更改的高级视图:
向我的 EC2 添加了具有策略权限的角色
"xray:BatchGetTraces",
"xray:GetServiceGraph",
"xray:GetTraceGraph",
"xray:GetTraceSummaries",
"xray:PutTelemetryRecords",
"xray:PutTraceSegments"
添加了跟踪过滤器
@Bean
public Filter TracingFilter() {
return new AWSXRayServletFilter("myService");
}
向我们的 POM 文件添加了 XRAY 依赖项,并向我们的控制器方法添加了 @XRayEnabled 注释:
将 XRAY 守护程序下载到我们的 ec2 实例并安装
curl https://s3.dualstack.us-east-1.amazonaws.com/aws-xray-assets.us-east-1/xray-daemon/aws-xray-daemon-3.x.rpm -o /home/ec2-user/xray.rpm
yum install -y /home/ec2-user/xray.rpm
我已经确认我们看到的是 UDP 日志记录语句,例如: com.amazonaws.xray.emitters.UDPEmitter:
{
"name" : "myService",
"id" : "1234",
"start_time" : 1.546020031234E9,
"trace_id" : "myTraceId",
"end_time" : 1.546020031234E9,
"http" : {
"request" : {
"method" : "POST",
"client_ip" : "myIp",
"url" : "myURL",
"user_agent" : "PostmanRuntime/7.4.0",
"x_forwarded_for" : true
},
"response" : {
"content_length" : 200,
"status" : 200
}
},
"aws" : {
"xray" : {
"sdk_version" : "1.2.1",
"sdk" : "X-Ray for Java"
}
},
"service" : {
"runtime" : "OpenJDK 64-Bit Server VM",
"runtime_version" : "1.8.0_151"
}
}
而且我还使用 netstat -tulpn
验证了守护进程在 ec2 上 运行Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 127.0.0.1:2000 0.0.0.0:* 14126/xray
还需要什么才能让 XRAY 跟踪显示在 AWS 控制台中?
我已经在启用日志记录的情况下启动了 docker 守护程序,但我没有看到任何迹象表明 docker 守护程序正在向 AWS 发送数据,只是启动信息而已:
2018-12-28T23:14:19Z [Info] Initializing AWS X-Ray daemon 3.0.0
2018-12-28T23:14:19Z [Info] Using buffer memory limit of 304 MB
2018-12-28T23:14:19Z [Info] 4864 segment buffers allocated
2018-12-28T23:14:19Z [Info] Using region: us-east-1
2018-12-28T23:14:19Z [Info] Starting proxy http server on 127.0.0.1:2000
我猜这个问题是因为你是 EC2 主机上的 运行 X-Ray Daemon 并且你的 java 容器默认情况下试图将事件发送到 127.0.0.1:2000
里面java 容器本身而不是主机地址。 Docker 容器将 127.0.0.1
视为在容器范围内。
您需要在 Java 应用程序上正确配置 X-Ray 守护程序地址。
AWS_XRAY_DAEMON_ADDRESS – Set the host and port of the X-Ray daemon listener. By default, the SDK uses 127.0.0.1:2000 for both trace data (UDP) and sampling (TCP). Use this variable if you have configured the daemon to listen on a different port or if it is running on a different host.
Format
Same port – address:port
Different ports – tcp:address:port udp:address:port
由于您正在检测基于 ECS 的应用程序,我建议将 X-Ray 守护进程启动为 Docker 容器,而不是 EC2 主机上的实际进程。
例子-
- 运行 X-Ray Daemon 作为 ECS 容器(作为 Daemon 调度类型)。 https://docs.aws.amazon.com/xray/latest/devguide/xray-daemon-ecs.html https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html#service_scheduler
- 根据您在 ECS 上使用的网络模型,您应该能够与 java 容器中的 X-Ray 容器地址和端口进行交互。
如果您有任何问题,请告诉我。
更新-
X-RAY Daemon 作为 Docker 容器与 运行 它在主机上?
这只是一些意见,似乎是 AWS 推荐的一些方法。我能想到的几个优点是
- 您无需维护 scripts/sequence 即可将 X-Ray 守护进程作为 EC2 AMI 的一部分。
- 您不必授予整个 EC2 角色权限即可将数据发送到 X-Ray,但使用容器时,只有该特定任务角色具有权限,而不是其他所有角色。
- 如果进程由于任何原因停止,您必须手动启动进程或从集群中删除 EC2 或在 AMI 上维护复杂的脚本。但是作为 ECS 管理的容器,它将确保任务总是 运行。
- ECS Daemon 调度文档说你的情况是他们带来这种类型的容器的原因。
https://aws.amazon.com/about-aws/whats-new/2018/06/amazon-ecs-adds-daemon-scheduling/
同样,这只是我的意见,但您也可以按照自己的意愿去做。