Observabilidad de LLMs en producción con OpenObserve: guía práctica y scripts listos para usar (2026)
Introducción
Los modelos de lenguaje grande (LLM) ya no son un experimento de laboratorio; están detrás de los chats de atención al cliente, los asistentes de código y los sistemas de recomendación de miles de empresas. ¿El problema? Cuando un LLM se comporta mal – sesgo inesperado, latencia excesiva o costes descontrolados – el daño se siente al instante.
En esta guía verás paso a paso cómo instrumentar cualquier endpoint de LLM con OpenTelemetry y OpenObserve, exportar métricas a Grafana/Prometheus y depurar en tiempo real sin tocar la lógica de negocio. Todo con ejemplos de código, comandos listos para copiar y una checklist de compliance.
1. Observabilidad vs. monitorización: la diferencia clave
| Concepto | Qué mide | Qué permite inferir |
|---|---|---|
| Monitorización | Métricas estáticas (CPU, RAM, latencia, error rate). | Si el número supera el umbral, el servicio está “roto”. |
| Observabilidad | Traces, logs estructurados y métricas personalizadas generadas por el propio modelo. | Permite reconstruir el estado interno del LLM (prompt, tokens, decisiones) y descubrir la causa raíz sin reproducir el error. |
2. Comparativa rápida de plataformas (2026)
| Plataforma | Integración OpenTelemetry | Soporte LLMs | UI de traces | Export a Grafana/Prometheus | Precio (USD/mes) |
|---|---|---|---|---|---|
| OpenObserve | ✔️ (SDK oficial) | ✅ (ChatGPT, Claude, Llama 2, custom) | UI web + API | ✔️ (exporter nativo) | $0 – $199 (según retención) |
| LangChain‑Trace | ✔️ (middleware) | ✅ (solo LangChain) | Minimalista | ❌ (requiere Prometheus) | $49 |
| Arize AI | ✔️ (auto‑instrumentación) | ✅ (todos) | Dashboard avanzado | ✔️ (via webhook) | $299 |
| Evidently AI | ✔️ (SDK) | ❌ (solo modelos tabulares) | Simple | ✔️ (Prometheus) | $0 – $99 |
Conclusión: OpenObserve ofrece la mejor relación costo‑beneficio para equipos que usan varios frameworks y quieren una solución “out‑of‑the‑box”.
3. Preparando el entorno
# 1. Instala OpenTelemetry SDK y el exporter de OpenObserve
pip install opentelemetry-sdk opentelemetry-instrumentation \
opentelemetry-exporter-openobserve
# 2. Inicia OpenObserve (Docker) – versión 2.5.1
docker run -d --name openobserve \
-p 5080:5080 -p 4317:4317 \
-e OPENOBSERVE_API_KEY=YOUR_API_KEY \
-e OPENOBSERVE_RETENTION_DAYS=30 \
otel/openobserve:2.5.1
Tip: Usa la variable
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317para que cualquier aplicación instrumentada envíe datos directamente a OpenObserve.
4. Instrumentando un endpoint de LLM (FastAPI + OpenAI)
# app.py
from fastapi import FastAPI, Request
from opentelemetry import trace
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.openai import OpenAIInstrumentor
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
app = FastAPI()
# 1️⃣ Configuración del tracer
resource = Resource(attributes={"service.name": "llm‑api"})
provider = TracerProvider(resource=resource)
processor = BatchSpanProcessor(OTLPSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
# 2️⃣ Instrumentación automática
FastAPIInstrumentor().instrument_app(app)
OpenAIInstrumentor().instrument()
@app.post("/chat")
async def chat(request: Request):
body = await request.json()
prompt = body.get("prompt", "")
# Llamada a OpenAI (o cualquier otro proveedor)
response = await openai.ChatCompletion.acreate(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
return {"answer": response.choices[0].message.content}
Qué se está registrando automáticamente
| Dato | Uso práctico |
|---|---|
trace_id / span_id
|
Correlacionar una petición con sus logs y métricas. |
prompt (scrubbed) |
Analizar sesgos o palabras prohibidas. |
tokens_in, tokens_out
|
Calcular coste por request. |
latency_ms |
Detectar cuellos de botella en tiempo real. |
5. Exportando métricas a Grafana/Prometheus
# prometheus.yml (añade el job openobserve)
scrape_configs:
- job_name: 'openobserve'
static_configs:
- targets: ['localhost:5080']
metrics_path: '/metrics'
scheme: 'http'
# Reinicia Prometheus
docker exec prometheus kill -HUP 1
En Grafana crea un dashboard con estas queries básicas:
# Latencia media de los endpoints LLM
avg_over_time(http_server_duration_seconds_sum{service="llm-api"}[5m])
/
avg_over_time(http_server_duration_seconds_count{service="llm-api"}[5m])
# Tokens procesados por minuto
rate(openobserve_tokens_total[1m])
6. Depuración en vivo (debugging)
-
Busca el trace problemático en la UI de OpenObserve → Traces → filtra por
status_code = 500oerror = true. -
Abre el span y revisa los atributos
prompt,response_time_msyerror_message. -
Reproduce la petición usando el
trace_idcomo headerX-Trace-Idpara que el nuevo request se agregue al mismo trace.
curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-H "X-Trace-Id: 0a1b2c3d4e5f" \
-d '{"prompt":"¿Cuál es el precio del oro hoy?"}'
7. Checklist de compliance y seguridad
- [ ] Anonimización: activa
scrubbingen OpenObserve (scrub_fields = ["prompt", "user_id"]). - [ ] Retención: configura
OPENOBSERVE_RETENTION_DAYS(máximo 90 días para GDPR). - [ ] Cifrado en reposo: usa bucket S3 con SSE‑KMS y habilita
encryption_at_rest = true. - [ ] Control de accesos: define roles
viewer,operator,adminen OpenObserve IAM. - [ ] Auditoría: exporta logs a CloudTrail / Azure Monitor cada 24 h.
8. Mini‑infografía del flujo de datos
Cliente → API FastAPI → OpenTelemetry SDK → OTLP (gRPC) → OpenObserve
│ │
└─> OpenAI/Claude/Llama2 ←─────────┘
│
└─> Métricas (latencia, tokens) → Prometheus → Grafana
(Puedes descargar la versión PNG en el repositorio del artículo.)
9. Preguntas frecuentes
| Pregunta | Respuesta |
|---|---|
| ¿Necesito cambiar mi código de inferencia para usar OpenObserve? | No. Sólo añades el wrapper de OpenTelemetry (como en el ejemplo) y el resto del código sigue igual. |
| ¿Cómo garantizo que los datos cumplen GDPR? | Usa la capa de scrubbing de OpenObserve, establece una retención corta y almacena los logs en un bucket cifrado con KMS. |
| ¿Puedo combinar OpenObserve con herramientas de A/B testing? | Sí. Añade un atributo experiment_id a cada span y filtra en la UI para comparar versiones. |
| ¿Qué pasa si mi endpoint recibe 10 000 RPS? | OpenObserve escala horizontalmente; basta con añadir más réplicas del contenedor (docker compose scale openobserve=3). |
| ¿Hay límite de métricas personalizadas? | No, pero se recomienda no crear más de 50 métricas por servicio para evitar sobrecarga de almacenamiento. |
10. Recursos
Herramienta mencionada: Groq Cloud
Top comments (0)