Skip to content
SP StackPractices
intermediate

Playbook de Guardias e Incidentes (On-Call)

Playbook práctico para ingenieros on-call: triage, escalamiento, comunicación y postmortems. Reduce el MTTR y construye una cultura de respuesta a incidentes resiliente.

Temas: devops

Playbook de Guardias e Incidentes (On-Call)

Introducción

Los incidentes son inevitables. Lo que separa a los equipos resilientes de los frágiles no es la ausencia de fallos, sino la velocidad y calidad de su respuesta. Este playbook proporciona un enfoque estructurado para manejar incidentes en producción — desde la primera alerta hasta el postmortem.

Ciclo de Vida de la Respuesta a Incidentes

Detectar → Triage → Mitigar → Resolver → Postmortem
   ↑                                           │
   └────────── Monitorear y Comunicar ─────────┘

1. Detección

Principios de Alertamiento

AlertaPor Qué ImportaUmbral
Pico de tasa de errorLos usuarios ven fallos> 0.1% de requests por 2 minutos
Latencia p99Experiencia de usuario degradada> 500ms por 5 minutos
SaturaciónAgotamiento de recursos acercándoseCPU > 80%, memoria > 85%, disco > 90%
Falla de dependenciaServicio downstream caídoHealth check falla 3 veces

La Fatiga de Alertas Es Real

Si una alerta suena y el ingeniero on-call no toma acción, no es una alerta — es ruido. Elimina o degrada alertas con tasa de falsos positivos > 80%.

2. Triage

Checklist del Primer Minuto

Cuando te paginan, responde estas preguntas en orden:

  1. ¿Qué está fallando? — nombre del servicio, endpoint, región
  2. ¿Quién se ve afectado? — todos los usuarios, un subconjunto, solo internos?
  3. ¿Cuándo empezó? — hora exacta del primer fallo (revisa logs de deploy)
  4. ¿Qué cambió? — algún deploy, cambio de config o shift de dependencia?
  5. ¿Está empeorando? — tendencia de tasa de error en el tiempo

Niveles de Severidad

SeveridadDefiniciónTiempo de RespuestaEjemplo
SEV-1Outage completo o pérdida de datos15 minutosSistema de pagos caído para todos
SEV-2Funcionalidad mayor degradada30 minutosBúsqueda devuelve vacío para 50%
SEV-3Impacto menor o workaround existe2 horasDashboard admin lento, API rápido
SEV-4Sin impacto a usuarios, riesgo potencialPróximo día hábilPico de logs, sin errores aún

3. Mitigación

Detén la Sangría Primero

Tu primer objetivo no es arreglar la causa raíz — es restaurar el servicio. Prefiere rollback sobre forward-fix durante un incidente.

# Rollback de un deploy malo
kubectl rollout undo deployment/api-service

# Activar un kill switch de feature flag
curl -X POST "https://config-service/flags/checkout-v2" \
  -d '{"enabled": false}'

# Escalar horizontalmente para absorber carga
kubectl scale deployment/api-service --replicas=20

Tácticas Comunes de Mitigación

ProblemaMitigación Rápida
Deploy maloRollback a última versión buena
Pico de tráficoEscalar horizontalmente, activar rate limiting
Falla de dependenciaActivar circuit breaker, servir cache viejo
Sobrecarga de base de datosMatar queries lentas, agregar réplicas de lectura
Error de configuraciónRevertir config, reiniciar con valores previos

4. Comunicación

Actualizaciones de Estado Internas

Publica en tu canal de incidentes cada 10 minutos:

[SEV-2] Latencia de checkout elevada
- Inicio: 14:32 UTC
- Impacto: ~30% de requests de checkout timeout
- Causa: pool de conexiones a base de datos agotado tras deploy v2.4.1
- Mitigación: rollback a v2.4.0 a las 14:45, monitoreando recuperación
- ETA: 15:00 UTC si la tendencia se mantiene
- Comandante: @alice

Comunicación Externa

Severidad¿Notificar Externamente?Quién
SEV-1Sí, inmediatoSoporte + página de estado
SEV-2Sí, si > 30 minSoporte + página de estado
SEV-3No, a menos que pregunteSolo interno
SEV-4NoSolo interno

Reglas de Comunicación Sin Culpa

  • No nombres individuos como causas
  • No uses “error humano” como causa raíz
  • Enfócate en qué pasó, qué se hizo, y qué sigue

5. Resolución

Definición de Resuelto

Un incidente se considera resuelto cuando:

  • Las tasas de error vuelven a línea base por 10 minutos
  • Todas las mitigaciones son estables
  • No aparecen nuevos síntomas
  • El comandante de incidente declara “todo claro”

Después del Todo Claro

  1. Detén el reloj (registra duración total del incidente)
  2. Agenda postmortem dentro de 24 horas para SEV-1/2
  3. Crea tickets de seguimiento con dueños y fechas límite
  4. Actualiza runbooks con lo aprendido

6. Postmortem

Los Cinco Por Qué

Pregunta “por qué” recursivamente hasta llegar a un problema sistémico, no a un síntoma.

Problema: La API de pagos devolvió 500 por 20 minutos.

¿Por qué? → El pool de conexiones a base de datos se agotó.
¿Por qué? → v2.4.1 aumentó el pool por defecto pero olvidó cerrar conexiones en retry.
¿Por qué? → El cambio no fue probado bajo carga.
¿Por qué? → Los tests de carga no cubren el flujo de checkout.
¿Por qué? → Los escenarios de carga no se actualizaron en 6 meses.

Acción: Agregar flujo de checkout a tests de carga semanales; requerir pase de carga en CI.

Plantilla de Postmortem

# Postmortem: [Nombre del Incidente] ([SEV-X])

## Resumen
- Fecha: 2024-06-12
- Duración: 23 minutos
- Impacto: 12% de intentos de checkout fallidos

## Línea de Tiempo
- 14:32 — Primera alerta: spike de tasa de error en /api/checkout
- 14:35 — On-call reconoció
- 14:40 — Identificado agotamiento de pool de conexiones
- 14:45 — Rollback a v2.4.0
- 14:55 — Tasas de error volvieron a línea base

## Causa Raíz
v2.4.1 introdujo un loop de retry que filtraba conexiones a base de datos.

## Lo Que Salió Bien
- Rollback completado en menos de 5 minutos
- El monitoreo apuntó claramente al agotamiento del pool

## Lo Que Salió Mal
- Los tests de carga no cubrían la nueva lógica de retry
- No había detección de filtrado de conexiones en staging

## Acciones
| Acción | Dueño | Fecha Límite |
|--------|-------|-------------|
| Agregar flujo de checkout a tests de carga | @bob | 2024-06-19 |
| Agregar alerta de filtrado de conexiones | @alice | 2024-06-15 |

Mejores Prácticas

  • Rota on-call de forma justa — nadie debería estar on-call más de 1 semana en 4
  • Compensa por horas extras — paga extra o da tiempo libre compensatorio
  • Shadow on-call — nuevos ingenieros hacen shadow por 2-4 semanas antes de recibir el pager
  • Automatiza runbooks — si un paso del runbook es manual, agrégalo al backlog de automatización
  • Revisa alertas trimestralmente — elimina ruido, ajusta umbrales, arregla alertas intermitentes

Errores Comunes

  • Saltarse postmortems porque “estamos muy ocupados”
  • Culpar individuos en lugar de arreglar sistemas
  • Forward-fixear durante un incidente en lugar de hacer rollback
  • Comunicar demasiado tarde a clientes
  • No tener on-call secundario para escalamiento
  • Mantener la misma persona on-call por semanas

Preguntas Frecuentes

¿Qué pasa si no sé cómo arreglar el problema?

Esperado. Tu trabajo es contener el impacto y encontrar a la persona correcta — no saber cada sistema. Escalá temprano y claramente. Una escalación de 5 minutos es mejor que 30 minutos solo.

¿Cómo balanceo respuesta a incidentes con trabajo de features?

Los incidentes son trabajo no planificado. Rastrealos. Si un equipo gasta > 20% de capacidad de sprint en incidentes, es una señal de invertir en confiabilidad (tests, automatización, refactor) en lugar de nuevas features.

¿Deberían los ingenieros juniors estar on-call?

Sí, con mentoría. Hacer shadow de ingenieros senior durante incidentes es una de las formas más rápidas de aprender cómo fallan los sistemas. Empieza con rotaciones de baja severidad y páralos con un senior el primer mes.