9. La UI de Jaeger

Por: Artiko
jaegeruisearchtimelinemonitor

9. La UI de Jaeger

Las trazas no sirven si no las podés leer. La UI de Jaeger es la herramienta principal para diagnosticar incidentes, y dominarla cambia cuánto tiempo tardás en encontrar la causa raíz de un problema.

Capturas tomadas en una instancia real con dos servicios: jaeger-all-in-one (el propio Jaeger) y unisimon-backend (un servicio de ejemplo).


Punto de entrada. Buscás trazas filtrando por servicio, operación, tags, duración y rango temporal.

UI de búsqueda de Jaeger con resultados

Filtros principales:

CampoPara qué
ServiceSelecciona el servicio. Es el atributo service.name de tus apps
OperationFiltra por operación específica del servicio (ej. POST /webhooks/kapso)
TagsFiltros por atributos: http.status_code=500, error=true, user.tier=premium
LookbackRango temporal: última hora, día, custom
Min/Max DurationTrazas más rápidas o más lentas que un umbral
Limit ResultsCantidad de resultados

El gráfico de scatter

En la captura, arriba de la lista hay un gráfico tiempo (x) vs duración (y) donde cada punto es una traza. Sirve para detectar:

Tags útiles

Tag queryPara qué
error=trueSolo trazas con algún span en error
http.status_code=500Errores HTTP server
http.status_code>=400Errores client + server
db.system=postgresql user.id=4221Trazas que tocaron Postgres para un usuario específico

Los tags soportan AND implícito entre claves. Para OR usás múltiples búsquedas o el endpoint de la API directo.


Vista 2 — Trace Timeline

El corazón del debugging. Mostrá una traza completa con todos sus spans en un Gantt.

Timeline de un trace de webhook con 21 spans

En esta captura:

Cómo leer el timeline

  1. El primer span (root) es el que recibió la request.
  2. Cada barra representa un span — su largo es la duración, su posición horizontal es cuándo empezó.
  3. Indentación = jerarquía. Span hijo aparece debajo y a la derecha del padre.
  4. Color depende del servicio. En sistemas multi-servicio cada color es un servicio.

Patrones visuales típicos

█████████████████████          ← root span (toda la duración)
█████                          ← op 1 secuencial
     ████                      ← op 2 (espera a 1)
         ████████              ← op 3 (espera a 2)
                 █████          ← op 4 (lo que se está debuggeando — el cuello)

vs

█████████████████████
█████ █████ █████              ← varias ops paralelas

vs

█████████████████████
                █████          ← gap antes de la op 2 — algo bloqueó
                     █████

El “gap” es información valiosa: si entre dos spans hay tiempo sin otro span explicándolo, alguien (típicamente el thread principal) estuvo trabajando sin instrumentar. Acá necesitás más spans manuales.

Búsqueda dentro del trace

Arriba de la lista de spans hay un buscador. Escribí error o el nombre de una operación y los spans matching se resaltan. Esencial en trazas con cientos de spans.


Vista 3 — Span Detail

Click en cualquier span y se expande con todo su detalle.

Detalle expandido de un span

Información disponible:

SecciónContenido
Tags / AttributesTodos los atributos del span: HTTP method, status, route, etc.
ProcessAtributos del recurso: service.name, host, k8s metadata
Logs / EventsEventos puntuales con timestamp
ReferencesParent y links a otros spans

Triada habitual de búsqueda

Para un span lento, tres lugares para mirar:

  1. Tags db.statement / http.url: ¿qué query exacta o qué URL llamó?
  2. Tags de error: ¿status code? ¿exception type?
  3. Logs / Events: ¿hubo eventos internos al span que expliquen el tiempo (cache miss, retry)?

Vista alternativa: Trace Graph

En lugar del Gantt, podés ver la traza como un grafo de servicios o como un flame graph. Tabs arriba a la derecha del timeline:


Vista 4 — System Architecture

Grafo dirigido de las dependencias entre servicios, derivado automáticamente de las trazas.

System Architecture: grafo de dependencias entre servicios

Cómo se calcula:

Casos de uso:

Limitación: en backends como Cassandra el grafo se calcula con un job batch (Spark), no en vivo. En Elasticsearch puede ser en vivo pero más caro.


Vista 5 — Monitor (SPM)

Service Performance Monitoring: RED metrics (Rate, Errors, Duration) derivadas de las trazas.

Monitor / SPM: latencia, request rate y error rate por servicio

Tres métricas estándar por servicio:

Ventaja sobre métricas tradicionales: si un endpoint particular está lento, click → buscás trazas lentas de ese endpoint en ese rango de tiempo. Te lleva del agregado a la traza individual.

Requisito: Jaeger tiene que estar configurado con un backend de métricas (Prometheus normalmente) y un componente que genere métricas a partir de los spans (spanmetrics processor). Cubrimos la setup en el capítulo 13.


Vista 6 — Compare

Permite comparar dos trazas lado a lado y ver diferencias estructurales.

Cuándo usarlo:

Acceso: desde la vista de Search, seleccionás dos trazas con los checkboxes y click en “Compare Traces”.


Lookup by Trace ID

Arriba a la derecha hay un input de “Lookup by Trace ID…”. Pegás un trace ID y vas directo al timeline.

Caso de uso clave: tu sistema de logs incluye trace_id en cada log estructurado. Cuando un usuario reporta un problema con un timestamp, encontrás el log → tomás el trace_id → lookup → tenés el trace completo.

Ejemplo de log con trace_id:

{
  "level": "error",
  "message": "payment failed",
  "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
  "user_id": "9374"
}

Esa correlación logs ↔ trazas es el superpoder que el observability stack te da. Sin trace_id en logs, no estás capitalizando la inversión.


Atajos de teclado útiles

TeclaAcción (en timeline)
fFoco en el buscador de spans
gIr al inicio del timeline
GIr al final del timeline
+ / -Zoom in / out

Consejo final

La UI no es donde investigás todo. Es donde terminás la investigación.

Flujo eficiente:

  1. Métricas dicen “hay un problema”: p99 subió.
  2. Logs o alertas dan un trace_id sospechoso.
  3. Jaeger UI te muestra exactamente qué span y por qué.

Si solo abrís Jaeger reactivamente cuando ya pasó algo, estás dejando valor en la mesa. Mirá el Monitor (SPM) o construí dashboards de Grafana con las métricas de tu collector — esos son los que disparan la investigación.


¿Qué viene?

Sabés generar trazas, propagarlas, samplearlas y leerlas. Falta el problema operacional grande: dónde guardarlas a escala. En el próximo capítulo comparamos los backends de storage soportados.