XRay跟踪未在AWS控制台中显示

时间:2018-12-28 18:19:41

标签: amazon-web-services amazon-ecs aws-xray

我已遵循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

1 个答案:

答案 0 :(得分:1)

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

您将需要在Java应用程序中正确配置X射线守护程序地址。

  

AWS_XRAY_DAEMON_ADDRESS –设置X-Ray守护程序的主机和端口   听众。默认情况下,SDK使用127.0.0.1:2000来获取两个跟踪数据   (UDP)和采样(TCP)。如果您已经配置了   守护程序在其他端口上侦听,或者是否在某个端口上运行   不同的主机。

     

格式

     

同一端口-地址:端口

     

不同的端口– 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射线后台驻留程序作为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 Daemon进程作为EC2 AMI的一部分。
  2. 您不必授予整个EC2角色将数据发送到X-Ray的权限,而是使用容器,只有特定的任务角色才具有权限,而其他所有权限都没有。
  3. 如果由于某种原因停止了进程,则必须手动启动进程或从群集中删除EC2或维护AMI上的复杂脚本。但是,由于是ECS托管容器,因此可以确保任务始终运行。
  4. ECS守护程序调度文档说您的情况就是为什么他们带了这种类型的容器。

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

再次,这只是我的意见,但是您也可以按照自己的方式去做。