Observabilidad como capacidad arquitectónica | Nicolás Garzón
Observabilidad es la capacidad de inferir qué ocurre dentro del sistema a partir de señales externas. No consiste en acumular logs: consiste en poder detectar impacto, formular preguntas nuevas, seguir causalidad y actuar con evidencia.
Un sistema observable permite responder preguntas que no fueron programadas como dashboards específicos:
¿Por qué aumentó la latencia solo para un tenant?
¿Dónde quedó atascado un pedido?
¿Qué dependencia provocó el timeout?
¿Cuántos pagos están pendientes y desde cuándo?
¿Qué versión introdujo el cambio?
¿Existe saturación o un error lógico?
La observabilidad debe diseñarse junto con límites, contratos y flujos. Si cada módulo usa identificadores y semánticas distintas, ninguna herramienta reconstruirá mágicamente la historia.
Supón que usuarios reportan pedidos confirmados que no llegan a preparación.
Logs aislados pueden mostrar:
Texto
Copiar 200 POST /orders/confirm
published message
consumer startedPero todavía faltan respuestas:
¿Pertenecen al mismo pedido?
¿El evento fue duplicado?
¿Qué versión procesó el consumer?
¿Falló después de actualizar una parte?
¿Cuánto tiempo lleva pendiente?
¿Qué tenants están afectados?
La observabilidad conecta señales técnicas con el estado de negocio.
Texto
Copiar síntoma observable
→ alcance e impacto
→ flujo causal
→ recurso saturado o decisión fallida
→ acción
→ verificación de recuperaciónRecolectar datos sin este recorrido produce ruido. Una señal útil ayuda a decidir.
Comprueba condiciones conocidas:
CPU alta.
Error rate superior a umbral.
Cola demasiado grande.
Permite investigar situaciones no anticipadas combinando dimensiones, eventos y causalidad.
Ambas son necesarias. Monitoring detecta; observabilidad explica.
Series temporales numéricas agregadas.
Tendencias.
Alertas.
Capacidad.
SLO.
Comparación entre versiones.
Texto
Copiar http_requests_total
request_duration_seconds
queue_lag_seconds
payment_pending_totalEventos discretos con contexto.
Errores detallados.
Decisiones específicas.
Auditoría técnica.
Datos de alta cardinalidad.
Un log debe ser estructurado, no una frase difícil de consultar.
JSON
Copiar {
"level" : "error" ,
"event" : "stock_reservation_failed" ,
"order_id" : "o-10" ,
"tenant_id" : "t-2" ,
"trace_id" : "abc" ,
"reason" : "insufficient_stock"
} Representan causalidad y tiempo entre operaciones.
Texto
Copiar confirm order
├── validate membership
├── reserve stock
│ └── UPDATE inventory
├── save order
└── publish outboxAyudan a localizar latencia, fan-out y errores distribuidos.
Muestran dónde se consume CPU, memoria, locks o tiempo de ejecución.
Son esenciales cuando las métricas indican saturación, pero no qué código la causa.
Una alerta detecta p95 elevado.
Métricas muestran que solo afecta confirmación de pedidos.
Una traza revela espera de conexión a base.
Logs muestran timeouts y tenant afectado.
Perfil o métricas de base confirman contention.
Ninguna señal aislada resuelve todo.
El contexto debe cruzar HTTP, colas, jobs y procesos.
trace_id.
span_id.
correlation_id.
causation_id.
request_id.
tenant_id.
Actor o tipo de actor.
Operación de negocio.
Versión de aplicación.
Región.
ID de agregado.
No todos pertenecen a métricas por cardinalidad. Pueden vivir en logs y trazas.
Agrupa spans de una ejecución técnica.
Relaciona operaciones de un proceso de negocio que puede durar horas o cruzar varias trazas.
Ejemplo: pedido, pago y entrega.
Indica qué evento o comando provocó otro.
Texto
Copiar OrderConfirmed event-10
→ NotificationRequested event-11
causation_id = event-10Permite reconstruir cadenas sin asumir orden temporal perfecto.
Una traza HTTP tradicional termina al publicar. Para continuar:
Propaga trace context en headers.
Registra message ID.
Conserva correlation y causation.
Mide publish latency y consumer lag.
Distingue tiempo en cola de tiempo de procesamiento.
Registra retry attempt y DLQ.
No conviertas el payload de negocio en contenedor de metadata técnica si el protocolo ofrece headers.
Cuánto tarda el trabajo, separando éxito y error.
Cuánto trabajo llega y se completa.
Fallos técnicos y resultados de negocio rechazados deben distinguirse.
Qué recurso se acerca a límite: CPU, memoria, pool, cola, locks, disco o conexiones.
Una tasa de errores baja puede coexistir con saturación creciente; el sistema todavía no cayó, pero ya está acumulando riesgo.
Utilization.
Saturation.
Errors.
Combinarlas ayuda a conectar experiencia con infraestructura.
Las métricas técnicas no muestran todo.
Pedidos creados, confirmados y rechazados.
Reservas expiradas.
Pagos pendientes por antigüedad.
Diferencias de reconciliación.
Órdenes en preparación fuera de SLA.
Intentos de acceso cross-tenant bloqueados.
Outbox age.
Una aplicación puede responder 200 mientras el negocio no avanza.
Service Level Indicator es la medición concreta de un comportamiento.
Texto
Copiar proporción de confirmaciones válidas
que terminan en estado confirmado
en menos de 2 segundosUn buen SLI se mide desde la perspectiva del usuario o consumidor, no solo desde una instancia.
Service Level Objective es el objetivo del SLI.
Texto
Copiar 99,9 % de confirmaciones válidas
completan en menos de 2 s
durante 30 días
Ventana.
Población.
Qué cuenta como éxito.
Exclusiones justificadas.
Fuente de medición.
Es un compromiso contractual con consecuencias. No debe confundirse con SLO interno.
El SLO puede ser más estricto para conservar margen antes de violar SLA.
Si el SLO permite 0,1 % de fallos, ese margen es el error budget.
Velocidad de cambio.
Fiabilidad.
Trabajo de reducción de riesgo.
Cuando se consume demasiado rápido, el equipo puede pausar cambios riesgosos y priorizar estabilidad.
No es permiso para fallar deliberadamente. Es una herramienta de decisión.
Mide qué tan rápido se consume el error budget.
Una alerta multi-window puede detectar:
Consumo extremo reciente.
Degradación lenta y sostenida.
Alertar por cada error individual produce ruido. Alertar por impacto sobre SLO conecta mejor con usuarios.
Qué capacidad está afectada.
Impacto.
Severidad.
Alcance.
Evidencia inicial.
Dashboard o consulta.
Runbook.
Owner.
Una alerta que no requiere acción debería ser métrica o reporte, no despertar a alguien.
Prefiere alertar por síntomas de usuario:
Confirmaciones fallidas.
Latencia elevada.
Backlog fuera de objetivo.
Después usa alertas de causa para diagnóstico:
CPU.
Replica lag.
Pool saturation.
Alertar solo CPU puede no tener impacto; alertar solo errores sin recursos dificulta diagnóstico.
Cardinalidad es cantidad de combinaciones de labels.
Texto
Copiar request_duration{user_id, order_id, trace_id}Millones de IDs crean millones de series y costos altos.
Método.
Ruta normalizada.
Código de estado.
Región.
Versión.
Tier de tenant.
Resultado limitado.
User ID.
Order ID.
Trace ID.
Raw URL.
Error message.
Medir cada tenant como label puede ser útil con pocos tenants y peligroso con miles.
Tier o segmento en métricas.
Top-N calculado.
Exemplars hacia trazas.
Logs consultables por tenant.
Métricas específicas solo para tenants empresariales.
La necesidad de aislamiento no justifica destruir el sistema de métricas.
Para latencia, conserva histogramas o sketches adecuados.
Promedios no permiten reconstruir percentiles correctamente entre instancias.
Buckets mal elegidos pueden ocultar distribución. Deben alinearse con SLO y rango esperado.
Guardar todas las trazas puede ser costoso.
Decide al inicio. Es simple, pero puede descartar una traza que termina en error.
Decide después de conocer resultado. Puede conservar:
Errores.
Latencia alta.
Operaciones raras.
Muestra de éxitos.
Requiere buffering y más infraestructura.
Flujos críticos, tenants o canaries pueden tener tasa mayor.
No uses sampling para auditoría obligatoria.
Campos estables.
Evento nombrado.
Nivel coherente.
Timestamp y zona.
IDs de contexto.
Error type separado de message.
Sin duplicar el mismo error en cada capa.
JSON
Copiar {
"level" : "warn" ,
"event" : "payment_reconciliation_required" ,
"payment_id" : "p-10" ,
"order_id" : "o-20" ,
"tenant_id" : "t-2" ,
"provider" : "x" ,
"state" : "unknown" ,
"trace_id" : "abc"
}
Passwords.
Tokens.
Cookies.
Secrets.
Tarjetas completas.
Datos personales innecesarios.
Bodies completos por defecto.
Queries con valores sensibles.
Redacta en origen, no confíes solo en filtros del backend de logs.
Un audit log necesita garantías diferentes:
Actor.
Acción.
Recurso.
Antes/después cuando corresponde.
Timestamp confiable.
Integridad.
Retención.
Acceso restringido.
No debe depender de sampling ni perderse durante rotación normal.
Un span debe representar una operación con significado.
Nombre estable.
Resultado.
Dependencia.
Recurso normalizado.
Tenant segmentado con cuidado.
Retry attempt.
Message ID.
No crees spans por cada función trivial; aumenta ruido y costo.
Excepción.
Status.
Tipo de error.
Si fue esperado o fallo técnico.
Una validación de negocio insufficient_stock puede no ser error del servicio. Clasificar todo como error distorsiona SLO.
Produce rate.
Consume rate.
Queue depth.
Age del mensaje más antiguo.
Processing duration.
Messages in flight.
Retry count.
DLQ.
La profundidad sola puede ser engañosa. Una cola de 1.000 mensajes puede ser normal si se procesa en segundos; la edad revela impacto.
Registros pendientes.
Edad máxima.
Publicaciones por segundo.
Reintentos.
Poison events.
Duplicados.
Eventos fuera de orden.
Conflictos de versión.
Tiempo hasta aplicar.
Conecta estas señales con pedidos o pagos afectados.
Query latency.
Slow queries.
Lock waits.
Deadlocks.
Pool wait.
Connections.
Replica lag.
I/O.
Cache hit.
Transaction duration.
Evita registrar parámetros sensibles de consultas.
Texto
Copiar pedido confirmado en UI
pero preparación no inicia
Buscar order ID en audit/log.
Obtener correlation ID.
Ver traza de confirmación.
Confirmar commit y outbox insert.
Revisar outbox age.
Seguir publish span.
Revisar consumer inbox y versión.
Ver DLQ.
Comparar estado autoritativo y proyección.
Ejecutar reconciliación si corresponde.
Sin IDs y señales diseñadas, cada paso requiere adivinar.
Alerta: p95 de confirmación aumenta.
Segmentación muestra solo tenants con catálogo grande.
Trazas revelan query con muchas líneas; métricas de base muestran sort a disco.
La causa no es CPU general. Se necesita índice, paginación o límite de tamaño.
La observabilidad evita escalar instancias incorrectamente.
Un runbook útil contiene:
Descripción del síntoma.
Impacto.
Dashboards.
Consultas.
Posibles causas.
Mitigaciones seguras.
Riesgos.
Escalamiento.
Verificación posterior.
Debe probarse durante ejercicios y actualizarse después de incidentes.
Cada servicio o módulo necesita owner de:
SLO.
Alertas.
Dashboards.
Runbooks.
Instrumentación.
Incidentes.
Una plataforma puede ofrecer herramientas, pero el equipo del dominio define qué significa correcto.
Una nueva capacidad no está completa si no permite:
Medir éxito.
Detectar fallo.
Seguir una operación.
Conocer backlog.
Diagnosticar dependencia.
Verificar recuperación.
Incluye requisitos de observabilidad en definición de terminado.
La aplicación no debería caer por no poder exportar telemetría. Usa buffers acotados y drop controlado. Auditoría crítica puede necesitar canal más fuerte.
Sampling, batching y límites. La observabilidad no debe ser el cuello.
Trazas y logs parecen fuera de orden. Usa sincronización y relaciones causales, no solo timestamps.
La historia se rompe. Prueba propagación y establece headers estándar.
Un label usa URL completa o ID. Detecta series nuevas y aplica governance.
Cada capa registra la misma excepción. Define dónde se maneja y registra.
Un debug temporal filtra tokens. Usa defaults seguros y revisión.
Sin métricas, trazas, contexto y preguntas, solo existe almacenamiento de texto.
Genera fatiga. Conecta con SLO y negocio.
Jobs, mensajes, cron y reconciliación quedan invisibles.
Aumenta costo y riesgo de privacidad.
Se vuelve obsoleto y no guía acción.
Puede ocultar un proceso de negocio fallido.
Romper una dependencia y localizar causa.
Seguir un pedido por HTTP y broker.
Detectar mensaje en DLQ.
Identificar tenant afectado sin label de alta cardinalidad.
Verificar redacción de secretos.
Simular backend de métricas caído.
Validar alertas con burn rate.
Ejecutar runbook.
Comprobar sampling de errores.
Reconstruir timeline de incidente.
Una prueba de observabilidad pregunta: ¿podemos explicar y actuar?, no solo ¿se emitió un log?
Monitoring detecta condiciones conocidas; observabilidad permite investigar preguntas nuevas.
Métricas, logs, trazas y perfiles se complementan.
Propaga contexto a través de procesos y mensajes.
Mide señales técnicas y resultados de negocio.
SLI y SLO conectan fiabilidad con experiencia.
Alertas deben ser accionables y orientadas a síntomas.
Controla cardinalidad y datos sensibles.
Colas se observan por lag y edad, no solo profundidad.
Runbooks y ownership completan la capacidad.
¿Por qué un 200 no demuestra que el proceso de negocio terminó correctamente?
¿Qué diferencia existe entre trace ID y correlation ID?
¿Por qué order_id no debería ser label de una métrica general?
¿Qué alertarías primero: CPU alta o confirmaciones fallidas?
¿Cómo demostrarías que un sistema es observable?
Ver respuestas orientativas
Porque puede aceptar el request y fallar después en mensajería, procesamiento o reconciliación.
Trace ID sigue una ejecución técnica; correlation ID puede unir varias ejecuciones de un proceso largo.
Porque crea cardinalidad potencialmente ilimitada; debe usarse en logs o trazas.
Confirmaciones fallidas como síntoma; CPU ayuda a diagnosticar causa.
Simulando un fallo y verificando que puede detectarse, localizarse, mitigarse y confirmarse la recuperación.
Arquitectura de seguridad y threat modeling utiliza estos límites y señales para identificar amenazas, aplicar defensa en profundidad y detectar abuso o aislamiento roto.