🔍 你的应用能运行…但你不知道内部发生了什么?
Source: Dev.to
¿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:
👉
🧠 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:
⚙️ 5. Configuración del Collector
El Collector:
- Recibe OTLP
- Procesa datos (resource + batch)
- Exporta a Jaeger
El processor resource agrega:
service.namedeployment.environment
☕ 6. Aplicación
La aplicación contiene:
- Controller REST
- Service
- Repository JPA
- Base H2 en memoria
Endpoints:
POST /userGET /user
🎯 7. Instrumentación automática
Variables de entorno:
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
- Se intercepta la petición HTTP.
- Se crea un span raíz.
- Se instrumentan Controller, Service y JDBC.
- Se exporta vía OTLP.
- El Collector procesa.
- 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
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.
Una vez que entiendes lo que ocurre dentro… ya no quieres volver atrás.
Si quieres probarlo ahora mismo:
👉