Трассировки XRay не отображаются в консоли AWS - PullRequest
0 голосов
/ 28 декабря 2018

Я следовал документации AWS по настройке XRAY для нашего приложения Spring Boot, развернутого в AWS ECS, но я не могу увидеть следы своих сервисов в консоли 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"
  }
}

И я также проверил, что демон работает на ec2, используя netstat -tulpn

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 отправляет данные в 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 голосов
/ 30 декабря 2018

Я предполагаю, что проблема в том, что вы запускаете X-Ray Daemon на хосте EC2, и ваш java-контейнер пытается отправить события на 127.0.0.1:2000 по умолчанию, который находится внутри самого java-контейнера, но не адреса хоста.Контейнер Docker видит 127.0.0.1 как в области действия контейнера.

Вам необходимо правильно настроить адрес демона X-Ray в приложении Java.

AWS_XRAY_DAEMON_ADDRESS - установить хост ипорт слушателя X-Ray демона.По умолчанию SDK использует 127.0.0.1:2000 как для данных трассировки (UDP), так и для выборки (TCP).Используйте эту переменную, если вы настроили демон для прослушивания на другом порту или если он работает на другом хосте.

Формат

Тот же порт - адрес: порт

Разные порты - tcp: адрес: порт udp: адрес: порт

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

Поскольку вы работаете с приложением на основе ECS, я бы посоветовал ускорить X-Ray Daemonкак Docker Container, но не как фактический процесс на хосте 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, вы должны иметь возможность взаимодействовать с адресом и портом контейнера X-Ray из вашего контейнера Java.

Дайте мне знать, если у вас есть какие-либо вопросы.

Обновление -

X-RAY Daemon в качестве 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/

Опять же, это только мое мнение, но вы также можете пойти по желаемому пути.

...