
Руководство по отслеживанию OpenElemetry для JVM
8 августа 2025 г.Вы можете знать, что я большой поклонник Opentelemetry. Я недавно закончил разработкуМастер класс для YOW! конференцияв конце года. Во время разработки я заметил массовые различия в конфигурации и результатах между языками программирования. Хуже того, существуют различия в рамках внутри одного и того же языка программирования.
В этом посте я хочу сравнить различные подходы Opentelemetry с нулевым кодом на JVM, охватывая наиболее распространенные:
- Пружинный ботинок с трассировкой микрометра
- Spring Boot с агентом OpenElemetry
- Opentelemetry Spring Boot Starter
- Quarkus
- Quarkus с агентом Opentelemetry
Общие черты
Я держу архитектуру довольно простой:
Я использую доступ к реактивным данным как в удаленной службе, так и в базе данных, чтобы немного оживить вещи, более конкретно, коратики Kotlin. Вот общая структура:
val products = coroutineScope {
val ping = async {
// Call the ping service
}
val products = async {
// Query the database
}
println("Received ping response: ${ping.await()}")
products.await()
}
Вот функции для каждого стека:
Quarkus | Весенний ботинок | |
---|---|---|
Веб - | Мятеж | Webflux |
Http client | Отдых клиент |
|
Паттерн доступа к базе данных | Записывать | Репозиторий |
Доступ к базе данных | Священная реактивная с паначом | R2DBC |
Запуск агента OpenElemetry
Агент Java Opentelemetry - это первый подход, который я использовал в отношении Opentelemetry.
Единственная необходимая конфигурация - установить агент при запуске JVM:
java -javaagent:opentelemetry-javaagent.jar -jar otel-boot-agent.jar
Агент поддерживаетМного фреймворков и библиотек, в том числе Spring Boot, Quarkus, Ktor, Spark и многие другие. Когда поток приложения находит поддерживаемую структуру/библиотеку, он регистрирует пролет.
Агент поддерживает стандартные переменные среды Opentelemetry.
services:
otel-boot-agent:
build: otel-boot-agent
environment:
OTEL_SERVICE_NAME: OTEL Boot Agent #1
OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4318 #2
OTEL_METRICS_EXPORTER: none #3
OTEL_LOGS_EXPORTER: none #3
- Opentelemetry service name
- Endpoint Opentelemetry; Spring Boot использует http
- Ни метрики, ни журналы
Вот трассировка Jaeger при вызове конечной точки на приложении Spring Boot:
А вот тот, на Quarkus:
Spring Boot имеет дополнительный пролет, который отображает вызов репозитория. Там нет такого доступного на Quarkus, так как я использую шаблон записи для доступа к данным.
Агент выводит SQL -запрос в обеих рамках,т.е.ВSELECT product.* FROM product
ПолемАгент Java работает из коробкиПолем
Прослеживание микрометра на пружине
Spring Boot обеспечивает выделенную поддержку Opentelemetry черезПрослеживание микрометраПолем
Отслеживание микрометра обеспечивает простой фасад для самых популярных библиотек трассеров, позволяя вам приказывать ваш код приложения на основе JVM без блокировки поставщика. Он предназначен для того, чтобы добавить практически накладные расходы к вашей активности сбора трассировки, максимизируя мобильность ваших усилий по отслеживанию.
Помимо самой зависимости от микрометра, вам нужны дополнительные:
- Привод весеннего ботинка
- Мост -опентеритрия
- Экспортер -опентериметрия также
Конфигурация не следует стандарту OpenTeLemetry:
services:
otel-boot-micrometer:
environment:
SPRING_APPLICATION_NAME: OTEL Micrometer #1-2
MANAGEMENT_OTLP_TRACING_ENDPOINT: http://jaeger:4318/v1/traces #1-3
- Различные значения от спецификации OpenElemetry
- Имя приложения Spring служит именем службы OpenElemetry
- Полный путь к конечной точке API
Приведенная выше настройка не регистрирует вызов базы данных. Чтобы это исправить, нам нужна дополнительная зависимость:R2DBC ProxyПолем
Новая трасса содержит пролет базы данных:
Вы можете заметить другую проблему: вызовы в службу и базу данных являются последовательными, где они должны быть параллельными. Он связан с пружинной загрузкой, не обрабатывающей распространение контекста должным образом к прицеле. Это основная работа от весенней команды. Подписаться наВыпуск GitHubЕсли вам интересно.
Opentelemetry Spring Boot Starter
Проект OpenElemetry предоставляетСтартер весеннего ботинкаПолем Вам нужна только одна зависимость, и, как и другие стартеры, Spring Boot Magic заботится о конфигурации:
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-spring-boot-starter</artifactId>
</dependency>
Результат очень похож на предыдущий, включая непараллельную, но серийную проблему.
Quarkus
Мы увидели результаты использования агента OpenTelemetry в первом разделе. Это довольно просто использовать Opentelemetry без агента; Вам нужна единственная зависимость:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-opentelemetry</artifactId>
</dependency>
Префиксы Quarkus регулярноQUARKUS_
:
services:
otel-quarkus:
environment:
QUARKUS_OTEL_SERVICE_NAME: OTEL Quarkus #1
QUARKUS_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: http://jaeger:4317 #2
- Opentelemetry service name
- Endpoint Opentelemetry; Quarkus использует GRPC
Результаты, как и ожидалось:
Дискуссия
Подходы Opentelemetry сильно варьируются как по конфигурации, так и по результатам. Если вам нельзя было использовать Java Agents по техническим или организационным причинам, я рекомендую сначала использовать агент Opentelemetry. Он обрабатывает все, что вы можете выбросить из коробки, включая самые распространенные библиотеки. За исключением этого, вам нужно глубокое знание стека, которое вы используете, результаты не представляют, что происходит в действительности.
Полный исходный код для этого поста можно найти наGitHubПолем
Идти дальше:
- Opentelemetry Java Agent
- Кореки Котлин и Опензелеметрия Трассии
- Добавить поддержку для распространения контекста микрометра в коратиках котлин
Первоначально опубликовано вJava Geek3 августа 2025 года
Оригинал