3. Instalación de Jaeger
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-oneen 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
| Puerto | Protocolo | Para qué |
|---|---|---|
16686 | HTTP | UI web y API de query |
4317 | gRPC | OTLP (OpenTelemetry Protocol) — el que vas a usar |
4318 | HTTP | OTLP HTTP (alternativa) |
14268 | HTTP | Jaeger Thrift legado (deprecado) |
14250 | gRPC | Jaeger gRPC legado |
5775 / 6831 / 6832 | UDP | Agent legado (Jaeger v1, deprecado en v2) |
5778 | HTTP | Configuración remota de sampling |
9411 | HTTP | Zipkin 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
| Variable | Default | Descripción |
|---|---|---|
COLLECTOR_OTLP_ENABLED | false en v1.x | Habilita los puertos 4317/4318 |
MEMORY_MAX_TRACES | 0 (ilimitado) | Cap de trazas en memoria |
LOG_LEVEL | info | debug, info, warn, error |
SPAN_STORAGE_TYPE | memory | memory, badger, cassandra, elasticsearch |
BADGER_EPHEMERAL | true | Si 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.