Construyendo un AI Incident Responder que Realmente Funciona

Bioluminescent neural mesh of gold and cyan synapses diagnosing an incident above a sleeping SRE engineer at dawn, DEVOPSARG coffee mug on desk

Eran las 3:47 AM de un martes cuando nuestro Slack explotó: "API latency spike — p99 por encima de 8 segundos." El ingeniero de on-call abrió la notebook, se restregó los ojos y arrancó el ritual de siempre: revisar Grafana, grep-ear los logs, trazar el request, revisar el historial de deploys, tratar de correlacionar eventos a través de 14 microservicios.

Para cuando encontraron la causa raíz — una config de connection pool rota deployada 6 horas antes — ya habían pasado 2.5 horas. El incidente se resolvió, pero el daño estaba hecho: breach de SLA, clientes quejándose y un ingeniero agotado.

Ese incidente fue la gota que rebalsó el vaso. Decidimos construir algo mejor.

El Problema: El Incident Response es Principalmente Recolección de Datos

Acá hay un secreto sucio sobre el incident response: el 80% del tiempo se gasta recopilando contexto, no solucionando cosas. El fix real suele ser simple — hacer rollback de un deploy, escalar un servicio, reiniciar un pod. Pero encontrar qué hay que fixear requiere correlacionar datos de decenas de fuentes.

Mapeamos lo que nuestros ingenieros hacen realmente durante un incidente:

  1. Revisar los dashboards de alertas (Grafana/Datadog)
  2. Leer los últimos 15 minutos de logs de los servicios afectados
  3. Revisar los deploys recientes (kubectl rollout history)
  4. Mirar la utilización de recursos (CPU, memoria, conexiones)
  5. Trazar un request fallido de ejemplo a través de los servicios
  6. Revisar si pasaron incidentes similares antes
  7. Formular una hipótesis y verificarla

Los pasos 1-6 son recolección de datos pura. Un agente de IA puede hacer todo eso más rápido y de manera más consistente que un humano privado de sueño.

Arquitectura: El Agente de Tres Fases

Construimos nuestro incident responder como un Cloudflare Worker que se conecta a Claude vía la Anthropic API. El agente funciona en tres fases:

Fase 1: Recolección de Contexto

Cuando se dispara una alerta, un webhook activa nuestro agente. Inmediatamente empieza a recolectar contexto en paralelo:

async function collectContext(alert) {
  const [logs, deploys, metrics, traces] = await Promise.all([
    fetchRecentLogs(alert.service, '15m'),
    fetchRecentDeploys(alert.namespace, '24h'),
    fetchMetricsSnapshot(alert.service),
    fetchFailingTraces(alert.service, 5),
  ]);

  return { alert, logs, deploys, metrics, traces };
}

Traemos datos de:

  • Loki para logs (vía LogQL API)
  • ArgoCD para el historial de deploys
  • Prometheus para métricas (CPU, memoria, error rates, percentiles de latencia)
  • Jaeger para trazas distribuidas

Todo se trae en paralelo. Tiempo total de recolección: menos de 3 segundos.

Fase 2: Análisis con Claude

Enviamos el contexto recolectado a Claude Haiku con un system prompt cuidadosamente diseñado:

const analysis = await anthropic.messages.create({
  model: 'claude-haiku-4-5-20251001',
  max_tokens: 2048,
  system: `You are an SRE incident analyst. Given alert data, logs, 
    metrics, deployment history, and traces, identify the most likely 
    root cause and suggest remediation steps.
    
    Rules:
    - Be specific: name the exact service, pod, or config that's failing
    - Correlate timing: if a deploy happened before the alert, flag it
    - Suggest the safest fix first (rollback > restart > scale > config change)
    - Rate your confidence: HIGH / MEDIUM / LOW
    - If unsure, say so — never guess on production systems`,
  messages: [{ role: 'user', content: formatContext(context) }],
});

Elegimos Claude Haiku por la velocidad — el análisis completa en menos de 2 segundos. Para incidentes complejos, escalamos a Sonnet.

Fase 3: Recomendación de Acciones

El agente postea en Slack con un brief de incidente estructurado:

🔴 INCIDENT DETECTED — api-gateway latency spike

📊 Summary:
- p99 latency jumped from 200ms to 8.2s at 03:41 UTC
- Error rate increased from 0.1% to 12.3%
- Affected: api-gateway, user-service (downstream)

🔍 Root Cause (HIGH confidence):
Deploy api-gateway v2.14.3 at 21:30 UTC changed connection 
pool max from 100 to 10 (likely typo in PR #847)

💡 Recommended Actions:
1. ROLLBACK api-gateway to v2.14.2 (safest)
   → kubectl rollout undo deployment/api-gateway -n production
2. OR hotfix: set POOL_MAX=100 in configmap
   → kubectl edit configmap api-gateway-config -n production

📋 Evidence:
- Connection pool exhaustion visible in logs (47 occurrences)
- Latency spike correlates exactly with deploy timestamp
- Pre-deploy metrics were healthy (p99: 180ms)

El ingeniero de on-call ahora puede actuar de inmediato en lugar de pasar 2 horas juntando contexto.

Resultados: De 2.5 Horas a 8 Minutos

Después de 3 meses en producción:

Métrica Antes Después
MTTR promedio 2.5 horas 18 minutos
MTTR (incidentes diagnosticados por el agente) 2.5 horas 8 minutos
Incidentes auto-diagnosticados correctamente 62%
Tasa de falsos positivos 8%
Satisfacción del on-call (sobre 5) 2.1 4.3

La mayor sorpresa fue que los ingenieros empezaron a confiar en el agente dentro de la primera semana. Cuando vieron que identificaba correctamente una falla en cascada a través de 3 servicios en 4 segundos — algo que a ellos les hubiera llevado 30+ minutos — quedaron convencidos.

Lo Que Aprendimos

Empezar con read-only. Nuestro agente no ejecuta ninguna acción automáticamente. Solo recomienda. Eso fue crítico para construir confianza. Vamos a agregar auto-remediación para casos simples (como rollbacks) una vez que tengamos 6 meses de datos de precisión.

Haiku es suficientemente rápido. Inicialmente planeamos usar Sonnet para todo, pero la velocidad de Haiku (análisis en menos de 2 segundos) hace una diferencia real a las 3 AM. Solo escalamos a Sonnet para incidentes multi-servicio.

El formateo del contexto importa más que el prompt engineering. Gastamos más tiempo formateando los datos que le enviamos a Claude (excerpts limpios de logs, métricas pre-agregadas, diffs de deploys) que en el system prompt. Garbage in, garbage out.

Loggeá todo. Registramos cada análisis junto a la causa raíz real (determinada post-incidente). Eso nos da métricas de precisión y datos para mejorar nuestros prompts.

Qué Sigue

Estamos trabajando en la Fase 2: auto-remediación para diagnósticos de alta confianza. Si el agente tiene 95%+ de confianza y el fix es un rollback, ¿para qué despertar a un humano? Estamos construyendo un flujo de confirmación donde el agente propone, una segunda instancia de Claude valida, y solo entonces ejecuta.

El objetivo no es reemplazar a los ingenieros de on-call — es dejarlos dormir durante los incidentes que no requieren creatividad humana.

Qué Haríamos Diferente

Empezar a loggear el contexto completo desde el día uno. En las primeras dos semanas no loggeábamos el payload completo que le mandábamos a Claude, solo el resultado. Cuando quisimos debuguear por qué el agente erraba en ciertos incidentes, no teníamos los datos para rastrear el problema hasta el formateo del contexto. Perdimos dos semanas de datos de entrenamiento potencial.

Parametrizar las ventanas de tiempo más temprano. Hardcodeamos '15m' para logs y '24h' para deploys al principio. Para incidentes lentos que se desarrollan durante horas, la ventana de 15 minutos corta exactamente antes del evento desencadenante. Ahora hacemos que la ventana sea dinámica basada en el tiempo de inicio de la alerta, pero ese ajuste llegó recién en el mes dos.

Armar el runbook de escalada de Haiku→Sonnet antes del go-live. Sabíamos que íbamos a escalar a Sonnet para incidentes complejos, pero el criterio de escalada era vago ("cuando Haiku no está seguro"). En la práctica, algunos incidentes multi-servicio recibieron un diagnóstico HIGH-confidence incorrecto de Haiku porque el modelo procesó el contexto de manera superficial. Ahora el gate de escalada está basado en el conteo de servicios afectados (>2 servicios → siempre Sonnet), no solo en el score de confianza.


¿Querés construir algo similar? Ayudamos a varios equipos a implementar incident response potenciado con IA. Escribinos — compartimos nuestro playbook.

Preguntas frecuentes

¿Por qué Claude Haiku en lugar de Sonnet u Opus para incident response?

La velocidad gana a las 3 AM. Haiku analiza un contexto de incidente completo en menos de 2 segundos. Sonnet tarda 4-6 segundos, Opus 8-12. A las 3 AM con un spike en el p99, el ingeniero necesita una respuesta AHORA, no una respuesta más matizada más tarde. Para el 5-10% de incidentes donde la confianza de Haiku es baja, escalamos a Sonnet automáticamente. Esto cubre fallas en cascada multi-servicio donde importa más razonamiento.

¿La auto-remediación es realmente segura para producción?

Solo detrás de gates de confianza estrictos y para acciones seguras. Nuestro gate actual: el agente debe calificar HIGH confidence, una segunda instancia de Claude debe validar el diagnóstico, y la acción debe estar en la safe-list (rollback, restart de pod, scale up — nunca cambios de config, nunca mutaciones de datos, nunca edits de políticas de red). Empezamos con recomendaciones read-only y solo activamos la auto-remediación después de 6 meses de datos de precisión que muestren 95%+ de corrección en confianza HIGH.

¿A qué fuentes de datos necesita acceso el agente?

Cuatro como mínimo: (1) logs (usamos Loki vía LogQL API, pero Datadog/CloudWatch/Elasticsearch también funcionan), (2) métricas (Prometheus o equivalente — CPU, memoria, error rates, percentiles de latencia), (3) historial de deploys (ArgoCD API, o cualquier herramienta GitOps que dispare los rollouts), (4) trazas distribuidas (Jaeger, Tempo, o Datadog APM). El agente trae todo eso en paralelo con Promise.all — la recolección total de contexto suele estar por debajo de 3 segundos.

¿Cómo medimos la precisión del agente a lo largo del tiempo?

Logueamos cada análisis junto a la causa raíz real (determinada durante la revisión post-incidente). Eso nos da dos métricas: precisión del diagnóstico (¿el call de HIGH confidence fue correcto?) y cobertura (¿qué fracción de incidentes intentó diagnosticar el agente?). Las rastreamos en el mismo dashboard de Grafana que las métricas de infraestructura, así la tendencia es visible para todo el equipo.

¿Qué pasa si el agente se equivoca?

Como es read-only durante la fase de construcción de confianza, equivocarse solo significa que el ingeniero ignora la recomendación y debuguea manualmente — costo cero. Rastreamos la tasa de falsos positivos (actualmente ~8%) y usamos esos incidentes para mejorar el formateo del contexto y el system prompt. La regla de 'garbage in, garbage out' aplica fuerte acá — la mayoría de las ganancias de precisión vienen de mejor formateo de datos, no de mejores prompts.

¿Puede esto reemplazar a los ingenieros de on-call?

No, y ese no es el objetivo. El objetivo es dejar que los ingenieros de on-call duerman durante los incidentes que no requieren creatividad humana. Incidentes simples — mala config, problema de scaling, patrón conocido — el agente los maneja. Incidentes nuevos, fallas multi-sistema, cualquier cosa que requiera juicio — los humanos siguen al mando. El agente es un amplificador, no un reemplazo. La mayoría de los pages a las 3 AM deberían ser rollbacks aburridos; lo novedoso puede esperar a un humano cafeinado en la mañana.