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

https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray-sdk-java-configuration-envvars

由于您正在检测基于 ECS 的应用程序,我建议将 X-Ray 守护进程启动为 Docker 容器,而不是 EC2 主机上的实际进程。

例子-

  1. 运行 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
  2. 根据您在 ECS 上使用的网络模型,您应该能够与 java 容器中的 X-Ray 容器地址和端口进行交互。

如果您有任何问题,请告诉我。

更新-

X-RAY Daemon 作为 Docker 容器与 运行 它在主机上?

这只是一些意见,似乎是 AWS 推荐的一些方法。我能想到的几个优点是

  1. 您无需维护 scripts/sequence 即可将 X-Ray 守护进程作为 EC2 AMI 的一部分。
  2. 您不必授予整个 EC2 角色权限即可将数据发送到 X-Ray,但使用容器时,只有该特定任务角色具有权限,而不是其他所有角色。
  3. 如果进程由于任何原因停止,您必须手动启动进程或从集群中删除 EC2 或在 AMI 上维护复杂的脚本。但是作为 ECS 管理的容器,它将确保任务总是 运行。
  4. ECS Daemon 调度文档说你的情况是他们带来这种类型的容器的原因。

https://aws.amazon.com/about-aws/whats-new/2018/06/amazon-ecs-adds-daemon-scheduling/

同样,这只是我的意见,但您也可以按照自己的意愿去做。