Интеграция OpenTelemetry с Spring Boot позволяет собирать распределенные трассировки и другие данные телеметрии из вашего приложения, предоставляя ценную информацию о его производительности и поведении в распределенной среде.

Что такое OpenTelemetry?

OpenTelemetry определяет API и протоколы для сбора данных телеметрии, таких как метрики, трассировки и журналы, а также предоставляет множество библиотек, агентов и интеграций для популярных языков программирования и технологий.

OpenTelemetry — это открытое и независимое от поставщика решение, которое обеспечивает единый подход к наблюдению, упрощая организациям управление сложной облачной инфраструктурой. Он позволяет организациям собирать телеметрию из своих приложений и отправлять ее в различные распределенные инструменты трассировки.

Приложение Conduit

Spring Boot — это популярная платформа Java, упрощающая разработку приложений Java. Он обеспечивает подход, основанный на соглашениях, а не настройке, и поставляется со встроенной поддержкой внедрения зависимостей, управления конфигурацией и некоторыми другими функциями.

Пример приложения RealWorld — это полнофункциональное приложение под названием Conduit, состоящее из серверной части, обслуживающей JSON API, и пользовательского интерфейса внешнего интерфейса. Существует множество реализаций для разных языков и фреймворков, но в этом руководстве вы будете использовать серверную часть Spring и интерфейс React.

Серверная часть реального мира

Начнем с загрузки исходного кода бэкенда:

git clone https://github.com/gothinkster/spring-boot-realworld-example-app.git

Затем вам нужно собрать JAR из загруженного исходного кода:

cd spring-boot-realworld-example-app
./gradlew bootJar

Если вы получаете Could not find snakeyaml-1.27-android.jar (org.yaml:snakeyaml:1.27), примените следующую разницу к build.gradle и повторите попытку:

diff --git a/build.gradle b/build.gradle
index 12781f0..52a8f71 100644
--- a/build.gradle
+++ b/build.gradle
@@ -33,6 +33,7 @@ dependencies {
     implementation 'io.jsonwebtoken:jjwt:0.9.1'
     implementation 'joda-time:joda-time:2.10.6'
     implementation 'org.xerial:sqlite-jdbc:3.34.0'
+    implementation 'org.yaml:snakeyaml:1.28'

Теперь вы можете запустить приложение, используя скомпилированный JAR:

java -jar build/libs/spring-boot-realworld-example-app-0.0.1-SNAPSHOT.jar

Вы можете проверить, что бэкэнд работает, посетив http://localhost:8080/tags:

curl http://localhost:8080/tags
{"tags":[]}

Давайте пока остановим приложение, нажав CTRL+C.

Java-агент OpenTelemetry

Чтобы интегрировать OpenTelemetry с приложением Spring Boot, вы можете использовать Java-агент OpenTelemetry, который предоставляет инструменты для различных платформ Java, включая Spring Boot, для автоматического сбора данных телеметрии.

Агент OpenTelemetry Java — это автономный процесс, который обеспечивает автоматическое инструментирование и возможности трассировки для приложений Java без каких-либо изменений кода. Он подключается к приложению Java во время выполнения и перехватывает вызовы методов для сбора данных телеметрии, таких как трассировки и метрики.

Агент находится между инструментальным приложением и серверными системами или платформами наблюдения, что позволяет централизованно и оптимизировать обработку данных телеметрии.

Чтобы загрузить последнюю версию агента OpenTelemetry:

wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

Агент Otel принимает различные параметры конфигурации либо через системные свойства, либо через переменные среды.

Uptrace

Uptrace — это APM с открытым исходным кодом для OpenTelemetry, который поддерживает распределенную трассировку, метрики и журналы. Вы можете использовать его для мониторинга приложений и устранения неполадок.

Uptrace поставляется с интуитивно понятным конструктором запросов, богатыми информационными панелями, правилами оповещения с уведомлениями и интеграциями для большинства языков и платформ.

Uptrace может обрабатывать миллиарды диапазонов и метрик на одном сервере и позволяет вам отслеживать ваши приложения в 10 раз дешевле.

Uptrace DSN (имя источника данных) — это строка подключения, которая используется для подключения и отправки данных в серверную часть Uptrace. Получить DSN можно после установки Uptrace и создания проекта.

Используйте следующие переменные среды, чтобы настроить OpenTelemetry Java для отправки данных в Uptrace.

export OTEL_RESOURCE_ATTRIBUTES=service.name=myservice,service.version=1.0.0
export OTEL_TRACES_EXPORTER=otlp
export OTEL_METRICS_EXPORTER=otlp
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_COMPRESSION=gzip
export OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.uptrace.dev:4317
export OTEL_EXPORTER_OTLP_HEADERS=uptrace-dsn=https://<token>@uptrace.dev/<project_id>
export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=DELTA
export OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION=BASE2_EXPONENTIAL_BUCKET_HISTOGRAM

Давайте снова запустим серверное приложение, но на этот раз вы будете использовать агент Java для автоматического инструментирования JAR:

java -javaagent:opentelemetry-javaagent-all.jar -jar build/libs/spring-boot-realworld-example-app-0.0.1-SNAPSHOT.jar

Как обычно, вы можете открыть http://localhost:8080/tags, чтобы проверить, работает ли API.

Интерфейс реального мира

У вас есть работающий бэкенд, но без фронтенда не очень интересно. Давайте продолжим и установим интерфейс React + Redux, который будет служить пользовательским интерфейсом:

git clone https://github.com/gothinkster/react-redux-realworld-example-app.git

Приложение поставляется с различными зависимостями JS:

cd react-redux-realworld-example-app
npm install

Теперь вам нужно настроить внешнее приложение для использования нашего внутреннего интерфейса, работающего по адресу http://localhost:8080/. Вы можете сделать это, отредактировав файл src/agent.js:

const API_ROOT = 'http://localhost:8080'

После чего вы можете запустить приложение React и наслаждаться пользовательским интерфейсом в http://localhost:4100/register:

npm start

Щелкнув по нескольким ссылкам, вы должны увидеть следы, подобные этой, поступающие в ваш проект Uptrace:

Заключение

С помощью агента Java OpenTelemetry вы можете настроить приложение Java, не изменяя ни одной строки кода. Хотите попробовать оснастить свое приложение? Зарегистрируйте бесплатную учетную запись Uptrace и следуйте этому руководству. Удачи.