Блог Amazon Web Services

Распределённая трассировка с использованием AWS Distro для OpenTelemetry

Оригинал статьи: ссылка (Nizar Tyrewalla, Principal Product Mgr.)

Все больше и больше приложений разрабатываются с использованием бессерверных архитектур, включающих несколько микросервисов. Клиенты используют управляемые сервисы AWS, такие как AWS Lambda, Amazon ECS и Amazon EKS, работающие и на Amazon Elastic Cloud Compute (EC2), и на AWS Fargate, для запуска своего кода вместе с такими сервисами, как Amazon API Gateway, Amazon SNS, Amazon SQS, Amazon DynamoDB, Amazon S3 и другими. Разработчики используют несколько SDK и агентов из разных сервисов мониторинга AWS и партнерских решений для а и анализа различных данных о производительности своих приложений. Это увеличивает время, необходимое для создания приложения, и каждый раз, когда происходит обновление любого из решений для мониторинга, разработчикам приходится пересобирать, повторно тестировать и повторно развертывать все приложение. Необходимость запуска нескольких агентов также увеличивает потребление ресурсов и стоимость работы приложения. Кроме того, клиенты тратят много времени на сопоставление логов, трассировок и метрик от разных агентов вручную, чтобы получить полное представление о производительности приложений. В результате многие клиенты хотят использовать новый набор стандартизованных агентов, API и SDK OpenTelemetry для сбора, сопоставления и отправки данных о производительности приложений в различные решения для мониторинга.

OpenTelemetry — это результат совместных усилий всех поставщиков решений для трассировки, направленных на создание общей основы для инструментирования приложений. Вместо необходимости каждому провайдеру иметь собственные инструменты все они поддерживают общий формат, определенный OpenTelemetry. По своей сути OpenTelemetry — это спецификация, описывающая, как нужно осуществлять инструментирование. Существуют также проекты OpenTelemetry для конкретных языков программирования, например для Java. Такие проекты создают среду инструментирования (OpenTelemetry SDK), а также интегрируют ее с популярными библиотеками, такими как Spring, gRPC и Flask. Включите эту среду в ваши приложения один раз, и вы получите поддержу любого провайдера трассировки, который соответствует вашим потребностям.

26 октября AWS X-Ray запустил поддержку трассировки приложений, работающих в Amazon EC2, Amazon ECS, Amazon EKS и локальных дата центрах, с использованием API-интерфейсов и SDK OpenTelemetry с открытым исходным кодом через AWS Distro для OpenTelemetry. AWS Distro для OpenTelemetry — это дистрибутив проекта OpenTelemetry от AWS, который позволяет разработчикам использовать стандартизированный набор API-интерфейсов, SDK и агентов с открытым исходным кодом для того чтобы, единожды инструментировав свои приложения, собирать коррелированные метрики и трассировки и загружать их в различные решения мониторинга, включая AWS X-Ray для трассировки и Amazon CloudWatch для метрик. Это производительная и безопасная сборка компонентов OpenTelemetry, протестированных для использования в производственной среде и поддерживаемых AWS. Разработчики могут использовать Java-агент автоинструментирования для автоматического обнаружения и сбора данных трассировки из приложений без какого-либо изменения исходного кода приложений. AWS Distro для OpenTelemetry также предоставляет SDK для Java и JavaScript для более глубокого анализа приложений и сбора более подробных метрик и трассировок на уровне функций. Затем вы можете использовать консоль вашего решения мониторинга для отладки приложений и расследования происшествий.

Поддержка трассировки в AWS Distro для OpenTelemetry

С помощью AWS Distro для OpenTelemetry вы можете собирать данные трассировок из ваших приложений и отправлять их в систему мониторинга по вашему выбору, например, в AWS X-Ray. В будущем мы добавим поддержку партнерских решений и других сервисов AWS. Вы можете использовать Java-агент автоинструментирования OpenTelemetry для сбора трассировок и данных о производительности приложений, без необходимости повторно инструментировать приложения. Кроме того, с помощью SDK для Java и JavaScript вы можете оснастить свои приложения для сбора дополнительной информации, связанной с бизнес-функциями и логикой приложений, например, для создания дополнительных трассировок (spans) и добавления метаданных и аннотаций, которые могут помочь в анализе приложений. В то же время мы работаем с сообществом над расширением функционала SDK и ускорением поддержки .NET, Python, Go, Ruby и других языков, поддерживаемых OpenTelemetry.

AWS Distro для OpenTelemetry — это не ответвление проекта OpenTelemetry, а дистрибутив. OpenTelemetry — это попытка сообщества упростить инструментарий наблюдения для всех. Как преданный и активный член этого сообщества, AWS следует подходу “upstream-first”, когда все наши улучшения в первую очередь вносятся в основной репозиторий проекта OpenTelemetry. Затем наш дистрибутив создается с использованием исходного кода оттуда.

Пакеты, которые мы создали и добавили в основной репозиторий OpenTelemetry, позволяют автоматически обнаруживать метаданные AWS: например, идентификатор инстанса EC2, имя кластера ECS, идентификаторы подов (Pod) в EKS и другие. Мы также добавили поддержку заголовка AWS Trace Header, который используется X-Ray для передачи информации о запросе между управляемыми сервисами AWS. Этот подход гарантирует, что вы можете увидеть полную трассировку вашего запроса, даже когда он проходит через управляемые сервисы, такие как Amazon API Gateway, AWS Lambda, и другие.

Начало работы с трассировкой в Java с использованием AWS Distro для OpenTelemetry

Давайте пройдемся по этапам инструментирования тестового приложения на Java и сбора трассировок с помощью OpenTelemetry для AWS X-Ray. В этом примере мы будем использовать шаблонное Java приложение, собирать данные приложения с помощью Java-агента автоинструментирования OpenTelemetry и отправлять данные в AWS X-Ray с помощью коллектора OpenTelemetry, предоставляемого AWS Distro для OpenTelemetry.

Шаг 1. Скачайте шаблонное приложение

Вы можете использовать любое существующее приложение на Java или загрузить образец приложения Spring PetClinic. Давайте сначала соберем приложение:

git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic
./mvnw package

Шаг 2. Загрузите и установите коллектор OpenTelemetry

Скачайте последнюю версию коллектора OpenTelemetry из AWS Distro для OpenTelemetry. Следуйте руководству по установке коллектора для вашей среды. Коллектор уже настроен для отправки данных трассировки в AWS X-Ray. Прочтите раздел «Настройка разрешений для сборки телеметрии», чтобы разрешить отправку трассировок в AWS X-Ray.

Шаг 3. Загрузите Java-агент автоинструментирования и запустите приложение.

Java-агент — это отдельный двоичный Java-файл. При запуске приложения зарегистрируйте его, передав флаг -javaagent в JVM. Затем он автоматически найдет поддерживаемые библиотеки в вашем приложении и подключит их к OpenTelemetry — никаких изменений кода не требуется. Последнюю версию агента автоинструментирования для Java можно загрузить из репозитория GitHub.

А теперь давайте запустим приложение. Обратите внимание, что вам необходимо установить переменную OTEL_RESOURCE_ATTRIBUTES, по аналогии с примером, показанным ниже, чтобы назвать ваш service (один из узлов в наборе сервисов, обрабатывающих запрос). Для этой демонстрации мы установили экспортер в otlp. Java-агент пересылает данные трассировки коллектору. Коллектор настроен на использование приемника и экспортера AWS X-Ray, для отправки собранных данных трассировки в серверную часть X-Ray.

OTEL_RESOURCE_ATTRIBUTES=service.name=PetClinicService OTEL_EXPORTER=otlp java -javaagent:aws-opentelemetry-agent.jar -jar target/*.jar

Теперь перейдите на страницу приложения по адресу http://localhost:8080/ в вашем браузере. Попробуйте зайти на несколько страниц, например «Find Owners». Затем откройте консоль управления AWS X-Ray. Вы должны увидеть карту сервисов (Service Map). Вы также можете анализировать отдельные трассировки, используя интерфейс Trace, показанный ниже.

AWS X-Ray Service Map showing traced requests

Карта сервисов AWS X-Ray, отображающая отслеживаемые запросы

Trace map with Segment timeline

 

Карта трассировки с временной шкалой сегментов

Если вы хотите опробовать более сложное решение с большим количеством серверных компонентов, у нас есть тестовое приложение для вас. Если вы отправите ему запрос и откроете X-Ray, вы увидите такую трассировку:

Trace map with Segment timeline details

Карта трассировки в режиме просмотра деталей сегментов временной шкалы

В ней появляются Spring, gRPC, MySQL, Redis, AWS SDK и другие, и все они автоматически обрабатываются агентом. Вы можете увидеть список поддерживаемых вариантов инструментирования в репозитории opentelemetry-java-Instrumentation. Вы также можете дополнить существующие инструментирования, добавив к ним аннотации и метаданные, и создать настраиваемые трассировки с помощью OpenTelemetry API. Используйте примеры, приведенные в документации.

Заключение

С помощью AWS Distro для OpenTelemetry разработчики могут один раз инструментировать свои приложения, используя API и SDK OpenTelemetry с открытым исходным кодом, и отправлять трассировки и метрики в один или несколько бэкэндов для мониторинга. Для распределенной трассировки мы рассмотрели пример использования агента автоинструментирования для Java для отправки данных в X-Ray. Запросы могут проходить через сочетание управляемых сервисов и приложений AWS, работающих на вычислительных мощностях, оснащенных инструментами OpenTelemetry. Затем разработчики могут использовать консоль управления AWS X-Ray для отладки и сортировки проблем, определения основных причин и затронутых конечных пользователей. Узнайте больше об AWS Distro для OpenTelemetry и о том, как начать использовать трассировку в различных вычислительных сервисах, на нашем портале для разработчиков. Вы можете связаться с нами и оставить отзыв на нашем форуме. Если вы заинтересованы в участии в проекте с открытым исходным кодом, найдите репозиторий OpenTelemetry для вашего любимого языка программирования, и ознакомьтесь со списком проблем.