Conceptos básicos de observabilidad
10 ejemplos para empezar con la observabilidad: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con la observabilidad: 7 básicos y 3 intermedios.
uv venv && source .venv/bin/activate
uv pip install "structlog>=24.0" "prometheus-client>=0.21" "opentelemetry-sdk>=1.29"Los registros JSON son buscables en Loki, CloudWatch y ELK.
import json
import logging
logging.basicConfig(level=logging.INFO, format="%(message)s")
log = logging.getLogger("api")
log.info(json.dumps({"event": "order_created", "order_id": "ord_1", "ms": 42}))order_id), no solo cadenas de mensajes.Relacionado: Registro estructurado - configuración de structlog
Vincule las líneas de registro a una única solicitud HTTP.
import uuid
from contextvars import ContextVar
request_id: ContextVar[str] = ContextVar("request_id", default="-")
def set_request_id() -> str:
rid = str(uuid.uuid4())
request_id.set(rid)
return ridX-Request-ID desde la pasarela (gateway) o genérelo en el borde (edge).request_id en cada registro de esa solicitud.Relacionado: Trazado distribuido - IDs de traza
Cuente eventos para paneles de tasa y ratio de errores.
from prometheus_client import Counter
ORDERS_CREATED = Counter("orders_created_total", "Órdenes creadas")
def create_order() -> None:
ORDERS_CREATED.inc()_total es una convención de Prometheus./metrics para su extracción (scraping).Relacionado: Métricas - histogramas y medidores (gauges)
Mida cuánto tiempo tardan las operaciones.
import time
start = time.perf_counter()
# ... trabajo ...
elapsed_ms = (time.perf_counter() - start) * 1000perf_counter es monotónico para duraciones.Relacionado: Monitorización de rendimiento (APM) - SLOs de latencia
Los balanceadores de carga necesitan una respuesta OK barata.
from fastapi import FastAPI
app = FastAPI()
@app.get("/health/live")
def live():
return {"status": "ok"}Relacionado: Salud y preparación (Health & Readiness) - diseño de sondeos (probes)
Use niveles para separar la señal del ruido.
import logging
log = logging.getLogger("worker")
log.debug("detalle para desarrollo")
log.info("trabajo finalizado")
log.warning("reintentando")
log.error("falló permanentemente")Relacionado: Mejores prácticas de observabilidad - reglas de registro
Capture rastreos de pila (stack traces) con contexto.
import logging
log = logging.getLogger("api")
try:
risky()
except Exception:
log.exception("pago fallido", extra={"order_id": "1"})log.exception incluye el rastreo automáticamente.extra (el formateador JSON debe incluirlo).Relacionado: Seguimiento de errores - Sentry
Tasa, Errores, Duración por punto de conexión.
# Tasa: contador requests_total
# Errores: contador requests_failed_total
# Duración: histograma request_duration_secondsRelacionado: Métricas - cubos de histograma (buckets)
Una ID de traza, múltiples spans entre servicios.
[Span de API] -> [Span de DB] -> [Span de publicación SQS]
Relacionado: Trazado distribuido - OpenTelemetry
Flujo de incidentes: alerta de métrica → logs con request_id → cascada de trazas.
# 1. Alerta: tasa_error > 1%
# 2. Consulta de logs: request_id="abc" AND level=ERROR
# 3. UI de traza: trace_id del campo de logtrace_id, request_id) entre los pilares.Relacionado: Mejores prácticas de observabilidad - higiene del personal de guardia (on-call)
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026