← SCRAM AI Lab
Labels útiles (org_id, session_id, tier, provider) sin caer en high-cardinality. LogQL patterns para errores por tier, p99 latency y costos por hora. Retention 30d hot.
May 21, 2026
9 lecturas
Loki no es Elasticsearch. No indexa el contenido de los logs; indexa labels. Si pones user_id o request_id como label, generas un stream por cada valor único y Loki muere — vimos un cluster crecer de 4GB a 380GB de índices en 48h por meter trace_id como label. Para logs de chatbot LLM, el set correcto de labels es chico, fijo y de baja cardinalidad.
Todo lo demás — user_id, session_id, request_id, tokens, costos — va en el JSON payload del log, no como label. Loki te deja queriarlos con | json sin generar streams nuevos.
Tasa de errores por tier en la última hora:
sum by (tier) (
rate({service="chat-api", level="error"}[1h])
)
p99 de latencia por provider:
quantile_over_time(0.99,
{service="chat-api"} | json | unwrap latency_ms [5m]
) by (provider)
Costo acumulado por hora por org:
sum by (org_id) (
sum_over_time(
{service="chat-api"} | json | unwrap cost_usd [1h]
)
)
Top 10 sessions con más tokens de output:
topk(10,
sum by (session_id) (
sum_over_time(
{service="chat-api"} | json | unwrap tokens_out [1h]
)
)
)
Lista de cosas que nunca deben ser labels:
session_id (miles de valores por día)user_id (escala con usuarios)request_id / trace_id (uno por request)endpoint con path variables (/users/123/profile != /users/456/profile)error_message dinámicoTodos esos van en el payload JSON. Si necesitas filtrar por ellos, usas | json | session_id="..." en LogQL — más lento que un label pero no destruye el índice.
La pregunta abierta: ¿deberían los logs estructurados de chatbot tener también un span_id de OpenTelemetry para joinear con traces? Sí, y es lo que cuenta el siguiente artículo.
Artículos relacionados
Traefik v2.10 con auto-renewal certs para 94 containers
Wildcard *.scram2k.com cubre la mayoría, certs individuales para el resto. acme.json shared, DNS-01 para wildcards, HTTP-01 para subdomains. Anti-patrón: cert por container.
OpenTelemetry tracing para pipelines LLM
Instrumentar pipelines LLM multi-tier con spans nested: router → tier-selection → provider-call → parsing → side-effects. Atributos gen_ai semantic conventions y flame chart en Tempo.
Docker soft limits en GCP: por qué nunca hard limits
Regla operativa sobre 94 contenedores en e2-standard-4: mem_limit prohibido, solo reservations. Hard limits causan OOMKilled en bursts; reservations garantizan piso.