Следы XRay не отображаются в консоли AWS

Я следил за документацией 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 к нашему методу контроллера:

Скачал XRAY Daemon в наш экземпляр 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?

Я запустил демон докера с включенным ведением журнала, но я не вижу никаких признаков того, что демон докера отправляет данные в 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

person greenJavaDev    schedule 28.12.2018    source источник
comment
Я считаю, что происходит то, что данные не поступают от задачи к демону хоста ec2, но я не уверен, как проверить, что это проблема.   -  person greenJavaDev    schedule 29.12.2018


Ответы (1)


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

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

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 Daemon как контейнер 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, вы должны иметь возможность взаимодействовать с адресом и портом контейнера X-Ray из вашего java-контейнера.

Дайте знать, если у вас появятся вопросы.

Обновлять -

X-RAY Daemon как Docker-контейнер против запуска его на хосте?

Это просто какое-то мнение, и это похоже на какой-то рекомендуемый способ от AWS. Я могу придумать несколько преимуществ:

  1. Вам не нужно поддерживать сценарии / последовательность для включения процесса X-Ray Daemon в ваш 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/

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

person Imran    schedule 30.12.2018
comment
Спасибо, Имран. Не могли бы вы пояснить, почему вы бы посоветовали использовать X-RAY Daemon в качестве контейнера Docker, а не запускать его на хосте? У меня нет предпочтений, но я просто хочу понять плюсы и минусы в этом случае. - person greenJavaDev; 31.12.2018
comment
@greenJavaDev Есть "за" и "против", я обновил свой ответ, добавив несколько хороших "за". Вы тоже можете пойти желаемым путем. :) Пожалуйста, проголосуйте и примите ответ, если вы в порядке. - person Imran; 31.12.2018
comment
Я попробовал три варианта на основе вашего ответа, и ни один из них, к сожалению, не сработал 1) установка com.amazonaws.xray.emitters.daemonAddress = 127.0.0.1: 2000 2) установка com.amazonaws.xray.emitters.daemonAddress = 127.0.0.1: 2000 и используя параметр docker -p 2000: 2000 3) просто используя -p 2000: 2000 без набора daemonAddress - person greenJavaDev; 31.12.2018
comment
также 4) -p 2000: 2000 -p 2000: 2000 / udp + адрес демона. Я собираюсь попытаться узнать больше о сети докеров, а также реализовать планирование Daemon на ECS. - person greenJavaDev; 31.12.2018
comment
Используете ли вы какое-либо обнаружение служб в кластере ECS, где каждая служба может взаимодействовать друг с другом? Route53 ?. Консул?. etcd ?. какой тип сети вы используете в кластере ?. awsvpc или по умолчанию (мост)? - person Imran; 31.12.2018
comment
Для целей тестирования вы все равно можете сохранить x-ray в качестве демона на хосте EC2 и настроить частный IP-адрес EC2 или частное DNS-имя в качестве своего AWS_XRAY_DAEMON_ADDRESS. - person Imran; 31.12.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Imran; 31.12.2018
comment
Я принимаю это решение, потому что считаю, что развертывание демона как отдельного контейнера докеров - это ответ на мою исходную проблему. У меня все еще есть некоторые проблемы с тем, чтобы заставить работать контейнерный подход docker daemon, но я не думаю, что было бы целесообразно использовать их здесь, поэтому это будет отдельный вопрос - person greenJavaDev; 03.01.2019
comment
попытался запустить как контейнер докеров, но он все еще не работает - person Madeo; 03.03.2020
comment
Пример запуска демона X-Ray на ECS доступен по адресу Инструменты для приложений Amazon ECS. Чтобы настроить простое многоконтейнерное приложение на платформе Docker (Amazon Linux 2) на Elastic Beanstalk, см. этот ответ. - person J. Christian; 29.04.2021