Puede saber que soy un gran admirador de OperElemetry. ¡Recientemente terminé de desarrollar una clase magistral para el yow! Conferencia a fin de año. Durante el desarrollo, noté diferencias masivas en la configuración y los resultados en los lenguajes de programación. Peor aún, existen diferencias en los marcos dentro del mismo lenguaje de programación.
En esta publicación, quiero comparar los diferentes enfoques de Opentelemety de código cero en el JVM, cubriendo los más extendidos:
- Bota de resorte con rastreo de micrómetro
- Boot de primavera con el agente de OperElemetry
- Arrancador de arranque de primavera operentelemetry
- Quarkus
- Quarkus con el agente de OperElemetry
Puntos en común
Mantengo la arquitectura bastante easy:
Estoy usando el acceso a datos reactivos tanto en el servicio remoto como en la base de datos para darle vida un poco las cosas, más específicamente, Kotlin Coroutines. Aquí está la estructura basic:
val merchandise = coroutineScope {
val ping = async {
// Name the ping service
}
val merchandise = async {
// Question the database
}
println("Obtained ping response: ${ping.await()}")
merchandise.await()
}
Aquí están las características para cada pila:
Quarkus |
Arranque de primavera |
|
---|---|---|
Net |
Motín |
Flúcito internet |
Cliente HTTP |
Cliente de descanso |
|
Patrón de acceso a la base de datos |
Registro |
Repositorio |
Acceso a la base de datos |
Hibernado Reactivo con estilo |
R2DBC |
Ejecutando el agente de Operentelemetry
El agente Java Operentelemetry es el primer enfoque que utilicé con respecto a OPENTELEMETRY.
La única configuración necesaria es establecer el agente al ejecutar el JVM:
java -javaagent:opentelemetry-javaagent.jar -jar otel-boot-agent.jar
El agente admite muchos marcos y bibliotecas, incluidos Spring Boot, Quarkus, Ktor, Spark y muchos otros. Cuando el flujo de la aplicación encuentra un marco/biblioteca suitable, registra un tramo.
El agente defiende las variables estándar de entorno OperElemetry.
companies:
otel-boot-agent:
construct: otel-boot-agent
surroundings:
OTEL_SERVICE_NAME: OTEL Boot Agent #1
OTEL_EXPORTER_OTLP_ENDPOINT: #2
OTEL_METRICS_EXPORTER: none #3
OTEL_LOGS_EXPORTER: none #3
- Nombre del servicio de Operentelemetry
- Punto ultimate de operentelemetría; Spring Boot usa HTTP
- Ni métricas ni registros
Aquí está el Jaeger Hint al llamar al punto ultimate en la aplicación Spring Boot:
Y aquí está el de Quarkus:
Spring Boot presenta un tramo adicional que muestra la llamada del repositorio. No hay tal cosa disponible en Quarkus, ya que estoy usando el patrón de registro para acceder a los datos.
El agente genera la consulta SQL en ambos marcos, es decir, SELECT product.* FROM product
. El agente de Java trabaja fuera de la caja.
Rastreo de micrómetro en la bota de resorte
Spring Boot proporciona soporte de operación dedicada a través del trazado de micrómetro.
El trazado de micrómetro proporciona una fachada easy para las bibliotecas trazador más populares, lo que le permite instrumentar su código de aplicación basado en JVM sin bloqueo del proveedor. Está diseñado para agregar poco a ninguna sobrecarga a su actividad de recolección de rastreo al tiempo que maximiza la portabilidad de su esfuerzo de rastreo.
Además de la dependencia del rastreo de micrómetro en sí, necesita una adicional:
- El actuador de arranque de primavera
- Un puente -opentelemetría
- Un exportador -opentelemetría también
La configuración no sigue el estándar de OpenTelemetry:
companies:
otel-boot-micrometer:
surroundings:
SPRING_APPLICATION_NAME: OTEL Micrometer #1-2
MANAGEMENT_OTLP_TRACING_ENDPOINT: /v1/traces #1-3
- Diferentes valores de la especificación OperElemetry
- El nombre de la aplicación de primavera sirve como el nombre del servicio Operentelemetry
- Camino completo al punto ultimate de la API
La configuración anterior no registra la llamada de la base de datos. Para solucionarlo, necesitamos una dependencia adicional: proxy R2DBC.
La nueva traza contiene la base de la base de datos:
Puede notar otro problema: las llamadas al servicio y la base de datos son secuenciales, donde deben ser paralelas. Se deriva de la propagación del contexto de la bota de primavera no manejando correctamente al alcance de la coroutina. Es un trabajo subyacente del equipo de primavera. Suscríbase al problema de GitHub si está interesado.
Arrancador de arranque de primavera operentelemetry
El proyecto OperTelemetry proporciona un iniciador de arranque de primavera. Solo necesita una dependencia y, como otros entrantes, Spring Boot Magic se encarga de la configuración:
io.opentelemetry.instrumentation
opentelemetry-spring-boot-starter
El resultado es muy comparable al anterior, incluido el problema no paralelo pero serial.
Quarkus
Vimos los resultados del uso del agente OperElemetry en la primera sección. Es bastante sencillo usar Opentelemety sin el agente; Necesita una sola dependencia:
io.quarkus
quarkus-opentelemetry
Quarkus prefijos regulares Nombres de variables de entorno de opereelemetry con QUARKUS_
:
companies:
otel-quarkus:
surroundings:
QUARKUS_OTEL_SERVICE_NAME: OTEL Quarkus #1
QUARKUS_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: #2
- Nombre del servicio de Operentelemetry
- Punto ultimate de operentelemetría; Quarkus usa GRPC
Los resultados son los esperados:
Discusión
Los enfoques de Operentelemety varían ampliamente tanto en la configuración como en los resultados. A menos que se le impida usar agentes de Java por razones técnicas u organizativas, recomiendo usar primero el agente Operentelemetry. Maneja todo lo que puede arrojarlo fuera de la caja, incluidas las bibliotecas más comunes. Salvo eso, necesita un conocimiento profundo de la pila que está utilizando, los resultados no representan lo que sucede en la realidad.
El código fuente completo para esta publicación se puede encontrar en GitHub.
Para ir más allá:
Publicado originalmente en un geek de Java el 3 de agosto de 2025