Руководство по отслеживанию OpenElemetry для JVM

Руководство по отслеживанию OpenElemetry для JVM

8 августа 2025 г.

Вы можете знать, что я большой поклонник Opentelemetry. Я недавно закончил разработкуМастер класс для YOW! конференцияв конце года. Во время разработки я заметил массовые различия в конфигурации и результатах между языками программирования. Хуже того, существуют различия в рамках внутри одного и того же языка программирования.

В этом посте я хочу сравнить различные подходы Opentelemetry с нулевым кодом на JVM, охватывая наиболее распространенные:

  • Пружинный ботинок с трассировкой микрометра
  • Spring Boot с агентом OpenElemetry
  • Opentelemetry Spring Boot Starter
  • Quarkus
  • Quarkus с агентом Opentelemetry

Общие черты

Я держу архитектуру довольно простой:

Architecture overview

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

Отдых клиент

WebClient

Паттерн доступа к базе данных

Записывать

Репозиторий

Доступ к базе данных

Священная реактивная с паначом

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
  1. Opentelemetry service name
  2. Endpoint Opentelemetry; Spring Boot использует http
  3. Ни метрики, ни журналы

Вот трассировка Jaeger при вызове конечной точки на приложении Spring Boot:

Trace of Spring Boot with OpenTelemetry Agent

А вот тот, на Quarkus:

Trace of Quarkus with OpenTelemetry Agent

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
  1. Различные значения от спецификации OpenElemetry
  2. Имя приложения Spring служит именем службы OpenElemetry
  3. Полный путь к конечной точке API

Приведенная выше настройка не регистрирует вызов базы данных. Чтобы это исправить, нам нужна дополнительная зависимость:R2DBC ProxyПолем

Новая трасса содержит пролет базы данных:

Trace of Spring Boot with Micrometer and R2DBC Proxy

Вы можете заметить другую проблему: вызовы в службу и базу данных являются последовательными, где они должны быть параллельными. Он связан с пружинной загрузкой, не обрабатывающей распространение контекста должным образом к прицеле. Это основная работа от весенней команды. Подписаться наВыпуск GitHubЕсли вам интересно.

Opentelemetry Spring Boot Starter

Проект OpenElemetry предоставляетСтартер весеннего ботинкаПолем Вам нужна только одна зависимость, и, как и другие стартеры, Spring Boot Magic заботится о конфигурации:

<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-spring-boot-starter</artifactId>
</dependency>

Trace of Spring Boot with the OpenTelemetry Starter

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

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
  1. Opentelemetry service name
  2. Endpoint Opentelemetry; Quarkus использует GRPC

Результаты, как и ожидалось:

Trace of Quarkus

Дискуссия

Подходы Opentelemetry сильно варьируются как по конфигурации, так и по результатам. Если вам нельзя было использовать Java Agents по техническим или организационным причинам, я рекомендую сначала использовать агент Opentelemetry. Он обрабатывает все, что вы можете выбросить из коробки, включая самые распространенные библиотеки. За исключением этого, вам нужно глубокое знание стека, которое вы используете, результаты не представляют, что происходит в действительности.

Полный исходный код для этого поста можно найти наGitHubПолем

Идти дальше:

  • Opentelemetry Java Agent
  • Кореки Котлин и Опензелеметрия Трассии
  • Добавить поддержку для распространения контекста микрометра в коратиках котлин

Первоначально опубликовано вJava Geek3 августа 2025 года


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE