3. Instalación de Jaeger

Por: Artiko
jaegerinstalaciondockerall-in-one

3. Instalación de Jaeger

El binario all-in-one

Jaeger tiene un binario llamado all-in-one que mete todos los componentes (collector, query, storage en memoria) en un solo proceso. Es la forma estándar de probarlo localmente.

No usés all-in-one en producción. Usa storage en memoria que se pierde al reiniciar y no escala. Para producción se separan los componentes y se conectan a un storage persistente — ver capítulo 12.


Opción 1: Docker (la más rápida)

docker run -d --name jaeger \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14268:14268 \
  -p 14250:14250 \
  jaegertracing/all-in-one:1.62

Abrí http://localhost:16686/ y ya tenés la UI andando. Vacía, claro — todavía no hay trazas porque no instrumentaste nada.

Puertos importantes

PuertoProtocoloPara qué
16686HTTPUI web y API de query
4317gRPCOTLP (OpenTelemetry Protocol) — el que vas a usar
4318HTTPOTLP HTTP (alternativa)
14268HTTPJaeger Thrift legado (deprecado)
14250gRPCJaeger gRPC legado
5775 / 6831 / 6832UDPAgent legado (Jaeger v1, deprecado en v2)
5778HTTPConfiguración remota de sampling
9411HTTPZipkin compat (si lo necesitás)

Recomendación: usá 4317 (OTLP gRPC). Es el estándar moderno, lo soportan todos los SDKs de OpenTelemetry, y es lo que va a quedar en Jaeger v2.


Opción 2: Docker Compose para desarrollo

docker-compose.yml listo para copiar:

services:
  jaeger:
    image: jaegertracing/all-in-one:1.62
    container_name: jaeger
    environment:
      COLLECTOR_OTLP_ENABLED: "true"
      LOG_LEVEL: "info"
    ports:
      - "16686:16686"   # UI
      - "4317:4317"     # OTLP gRPC
      - "4318:4318"     # OTLP HTTP
    restart: unless-stopped

  app:
    build: .
    environment:
      OTEL_EXPORTER_OTLP_ENDPOINT: "http://jaeger:4317"
      OTEL_SERVICE_NAME: "mi-app"
      OTEL_TRACES_EXPORTER: "otlp"
    depends_on:
      - jaeger

Levantás todo con docker compose up -d y tu app ya empieza a mandar trazas a Jaeger.


Opción 3: Binario nativo

Para entornos donde no podés usar Docker:

# Linux x86_64
curl -L https://github.com/jaegertracing/jaeger/releases/download/v1.62.0/jaeger-1.62.0-linux-amd64.tar.gz \
  | tar xz
cd jaeger-1.62.0-linux-amd64
./jaeger-all-in-one --collector.otlp.enabled

El binario es estático (Go), no necesita runtime adicional.


Opción 4: Kubernetes con Helm

Para entornos Kubernetes de desarrollo o staging:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update

helm install jaeger jaegertracing/jaeger \
  --set allInOne.enabled=true \
  --set provisionDataStore.cassandra=false \
  --set provisionDataStore.elasticsearch=false \
  --set storage.type=memory

Para producción Kubernetes preferís el Jaeger Operator, que cubrimos en el capítulo 12.


Verificación rápida

# UI responde
curl -s http://localhost:16686/api/services | jq
# {"data":null,"total":0,"limit":0,"offset":0,"errors":null}

# OTLP gRPC abierto
nc -zv localhost 4317
# Connection to localhost (::1) 4317 port [tcp/*] succeeded!

Si ves la UI vacía con “No services found” y el puerto OTLP responde, estás listo.


Variables de entorno útiles del all-in-one

VariableDefaultDescripción
COLLECTOR_OTLP_ENABLEDfalse en v1.xHabilita los puertos 4317/4318
MEMORY_MAX_TRACES0 (ilimitado)Cap de trazas en memoria
LOG_LEVELinfodebug, info, warn, error
SPAN_STORAGE_TYPEmemorymemory, badger, cassandra, elasticsearch
BADGER_EPHEMERALtrueSi usás badger, false persiste a disco

Para persistir trazas en disco con Badger sin necesidad de Cassandra/ES:

docker run -d --name jaeger \
  -e SPAN_STORAGE_TYPE=badger \
  -e BADGER_EPHEMERAL=false \
  -e BADGER_DIRECTORY_VALUE=/badger/data \
  -e BADGER_DIRECTORY_KEY=/badger/key \
  -v jaeger-badger:/badger \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 16686:16686 -p 4317:4317 \
  jaegertracing/all-in-one:1.62

Útil cuando querés probar persistencia sin levantar más servicios.


Errores comunes en la instalación

”OTLP endpoint not enabled”

Olvidaste COLLECTOR_OTLP_ENABLED=true (necesario en versiones < 1.50; en 1.50+ está habilitado por default pero igual conviene declararlo).

“address already in use”

Otro proceso (Datadog agent, Prometheus en 9411, etc.) está usando uno de los puertos. Mapeá a otro puerto del host:

docker run ... -p 16687:16686 jaegertracing/all-in-one:1.62

“No services found” después de horas

Tu app no está exportando las trazas. Lo más común: variable OTEL_EXPORTER_OTLP_ENDPOINT mal configurada o protocolo equivocado (gRPC vs HTTP).

Para debug rápido, levantá el log del container:

docker logs -f jaeger | grep -i error

¿Y ahora?

Tenés Jaeger corriendo. Falta lo más importante: mandarle trazas. Eso lo hacemos en el próximo capítulo con un hello world en Node.js que va a generar tu primera traza visible en la UI.