2

我已按照 AWS 文档为部署在 AWS ECS 上的 Spring Boot 应用程序设置 XRAY,但我无法在 AWS 控制台中看到我的服务的跟踪。这是我实施的更改的高级视图:

向我的 EC2 添加了具有策略权限的角色

"xray:BatchGetTraces",
"xray:GetServiceGraph",
"xray:GetTraceGraph",
"xray:GetTraceSummaries",
"xray:PutTelemetryRecords",
"xray:PutTraceSegments"

添加了跟踪过滤器

@Bean
public Filter TracingFilter() {
    return new AWSXRayServletFilter("myService");
}

将 XRAY 依赖项添加到我们的 POM 文件中,并将@XRayEnabled注释添加到我们的 Controller 方法中:

将 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
4

1 回答 1

3

我猜这个问题是因为您在 EC2 主机上运行 X-Ray 守护程序,并且您的 java 容器127.0.0.1:2000默认情况下尝试将事件发送到 java 容器本身内部而不是主机地址。Docker 容器127.0.0.1视为在容器范围内。

您需要在 Java 应用程序上正确配置 X-Ray 守护程序地址。

AWS_XRAY_DAEMON_ADDRESS – 设置 X-Ray 守护程序侦听器的主机和端口。默认情况下,SDK 对跟踪数据 (UDP) 和采样 (TCP) 使用 127.0.0.1:2000。如果您已将守护程序配置为在不同的端口上侦听或者如果它在不同的主机上运行,​​请使用此变量。

格式

相同的端口 - 地址:端口

不同的端口 – 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 守护程序作为 ECS 容器运行(作为守护程序调度类型)。 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 守护程序作为 Docker 容器与在主机上运行它?

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

  1. 您无需维护脚本/序列即可将 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/

同样,这只是我的意见,但您也可以采用所需的方式。

于 2018-12-30T18:26:45.803 回答