DEV Community

Juan Manuel Hoyos
Juan Manuel Hoyos

Posted on

🔍 ¿Tu aplicación funciona… pero no sabes qué pasa dentro?

¿Te ha pasado que tu aplicación responde lento…
pero no sabes exactamente dónde está el problema?

¿El controller responde, pero no sabes cuánto tardó el service?
¿La base de datos está lenta o es tu lógica?
¿Todo funciona en local… pero no entiendes qué ocurre internamente?

Ahí es donde entra la observabilidad moderna.

En este artículo vas a entender, de forma práctica y profunda:

  • Qué es realmente la observabilidad

  • Cómo funcionan las trazas distribuidas

  • Qué hace OpenTelemetry internamente

  • Para qué sirve el Collector

  • Cómo Jaeger visualiza todo

  • Cómo instrumentar automáticamente una aplicación Spring Boot

Todo aplicado a una aplicación tradicional, sencilla, real.

Y lo mejor: puedes ejecutarlo tú mismo en este repositorio:

👉 https://github.com/juanhcode/otel-jaeger-observability-demo


🧠 1. Observabilidad

La observabilidad se basa en tres pilares fundamentales:

  • Logs → Qué ocurrió

  • Métricas → Cuánto ocurrió

  • Trazas → Cómo ocurrió

Las trazas permiten reconstruir el recorrido completo de una solicitud dentro de tu aplicación.

No importa si es una app pequeña.
Si quieres entender su comportamiento interno, necesitas trazas.


🔎 2. ¿Qué es una traza?

Una traza representa el recorrido completo de una petición.

Cliente → Controller → Service → Repository → Base de datos

Cada parte es un Span.

Una traza incluye:

  • Trace ID
  • Span ID
  • Relaciones padre-hijo
  • Atributos
  • Eventos
  • Duración

🏗 3. Arquitectura implementada

Spring Boot

OpenTelemetry Java Agent

OTLP

OpenTelemetry Collector

Jaeger

Jaeger UI


🐳 4. Infraestructura

Se utiliza Docker Compose para levantar:

  • Jaeger All-in-One
  • OpenTelemetry Collector

Jaeger UI disponible en:

http://localhost:16686


⚙️ 5. Configuración del Collector

El Collector:

  • Recibe OTLP
  • Procesa datos (resource + batch)
  • Exporta a Jaeger

El processor resource agrega:

  • service.name
  • deployment.environment

☕ 6. Aplicación

La aplicación contiene:

  • Controller REST
  • Service
  • Repository JPA
  • Base H2 en memoria

Endpoints:

POST /user\
GET /user


🎯 7. Instrumentación automática

Variables:

export OTEL_PROTOCOL="grpc"\
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:4318"\
export OTEL_METRICS_EXPORTER=none

Ejecución:

java -javaagent:opentelemetry-javaagent.jar -jar demo-0.0.1-SNAPSHOT.jar


👀 8. Flujo interno

  1. Se intercepta la petición HTTP
  2. Se crea un span raíz
  3. Se instrumentan Controller, Service y JDBC
  4. Se exporta vía OTLP
  5. El Collector procesa
  6. Jaeger visualiza

🚀 9. Beneficios

  • Detectar cuellos de botella

  • Identificar latencias exactas

  • Entender el flujo real de ejecución

  • Tener observabilidad estándar

  • Evitar vendor lock-in

Y todo esto en una aplicación sencilla.

No necesitas tener 20 microservicios para necesitar observabilidad.


🏁 Conclusión

La observabilidad no es solo para arquitecturas complejas.

Incluso una aplicación tradicional puede beneficiarse enormemente de entender qué ocurre internamente.

Con OpenTelemetry y Jaeger puedes pasar de “no sé qué está pasando”
a tener visibilidad completa de tu aplicación en minutos.

Y una vez entiendes lo que ocurre dentro… ya no quieres volver atrás.

Y si quieres probarlo ahora mismo:

👉 https://github.com/juanhcode/otel-jaeger-observability-demo

Top comments (0)