Salud de la guardia (On-Call)
La guardia solo funciona a largo plazo cuando las rotaciones son justas, las alertas son accionables y el tiempo de recuperación está protegido. Las flotas de Python se ahogan en ruido cuando cada reintento de Celery y cada reinicio de trabajador de Gunicorn notifican a alguien.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
## Lista de verificación de higiene de alertas (mensual)
- [ ] Cada alerta activa tiene una URL de runbook en la anotación
- [ ] Ninguna alerta se activó >3 veces el mes pasado sin ticket
- [ ] Las alertas de quema basadas en SLO reemplazan los umbrales estáticos siempre que sea posible
- [ ] Se separan las alertas de horario comercial vs gravedad de llamada de atención
- [ ] Las notificaciones por turno de guardia se rastrean en el panel# Prefiere la quema de SLO sobre los 5xx brutos
- alert: CheckoutErrorBudgetBurn
expr: slo_error_budget_burn_rate{service="orders-api"} > 1
for: 10m
labels:
severity: page
annotations:
runbook: https://github.com/acme/runbooks/orders-api.mdCuándo usar esto:
- Los ingenieros evitan los turnos de guardia o se agotan
- La misma alerta notifica semanalmente sin acción
- MTTR bueno pero moral baja
- Escalando el equipo sin escalar la carga del buscapersonas
Ejemplo de trabajo
"""on_call_metrics.py - Rastreador simple de carga del buscapersonas para retrospectivas."""
from __future__ import annotations
from dataclasses import dataclass
from datetime import date
@dataclass
class ShiftStats:
engineer: str
week: date
pages: int
actionable: int # condujo a trabajo que afectó al cliente
false_positive: int
def health_score(stats: ShiftStats) -> str:
if stats.pages == 0:
return "quiet"
action_rate = stats.actionable / stats.pages
if stats.pages > 10 and action_rate < 0.3:
return "noisy_rotation"
if stats.pages > 15:
return "overloaded"
return "healthy"
def main() -> None:
sample = ShiftStats("ana", date(2026, 7, 7), pages=12, actionable=4, false_positive=8)
print(sample.engineer, health_score(sample))
if __name__ == "__main__":
main()Lo que esto demuestra:
- Rastrea las notificaciones accionables vs. falsos positivos por turno
- La puntuación de salud resalta las rotaciones ruidosas que necesitan ajuste de alertas
- Los datos impulsan la revisión operativa mensual, no las anécdotas
- Los enlaces de runbook en las anotaciones de alerta reducen el tiempo medio de mitigación
Profundización
Cómo funciona
- Diseño de rotación - Primario + secundario, semanas consecutivas máximas, equidad en el intercambio de zonas horarias.
- Niveles de alerta - Notificación (llamada de atención), ticket (día siguiente), registro (solo panel).
- Notificación basada en SLO - Las tasas de quema en ventanas múltiples reducen los falsos positivos en comparación con los umbrales estáticos.
- Seguimiento del sol - Opcional para flotas globales; se requiere un documento de traspaso.
- Recuperación - Tiempo compensatorio o pago; sin cultura de héroes para el ruido prevenible.
Plantilla de rotación sostenible
| Regla | Directriz |
|---|---|
| Duración del turno | 1 semana primaria, 1 semana secundaria |
| Traspaso | 15 minutos de superposición, lista de incidentes abiertos |
| Máximo de notificaciones por turno | Investigar si >10 accionables o >20 en total |
| Sombra | El nuevo empleado observa 2 turnos antes de hacerlo solo |
| Escalada | Secundario después de 15 minutos de SEV1 sin IC |
Fuentes de ruido de la flota de Python
| Fuente | Solución |
|---|---|
| Tormenta de reintentos de Celery | Alerta sobre la antigüedad de la cola, no sobre cada fallo de tarea |
| Reinicio de trabajador OOM | Barrera de protección contra fugas de memoria + alerta de tasa de reinicio |
| Tiempo de espera del trabajador de Gunicorn | Alerta separada para p99 sostenido |
| Advertencias de depreciación | Métrica de registro, no notificar |
Trampas
- Alertar sobre el recuento de ERROR de registro - Los problemas de terceros notifican a todos. Solución: Notificar sobre la quema de SLO con duración
for:. - Sin secundario - Las vacaciones se convierten en riesgo de interrupción. Solución: Siempre programar un respaldo con integración de calendario.
- Runbooks solo en wiki - Enlaces rotos a las 3 a.m. Solución: Ruta del runbook en el repositorio en cada anotación de alerta.
- Ignorar la tasa de falsos positivos - Los ingenieros silencian el canal. Solución: Eliminar o arreglar mensualmente las alertas con >50% de falsos positivos.
- Siempre la misma persona de guardia - Factor de autobús y agotamiento. Solución: La herramienta de rotación garantiza la equidad; el gerente audita trimestralmente.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Guardia SRE dedicado | Flota grande multiserVICIO | Equipo de producto pequeño |
| Seguimiento del sol | Base de clientes global | MVP de una sola región |
| Proveedor de guardia gestionada | Necesidad de 24/7 inmediatamente | Fuerte cultura de operaciones interna |
| Sin guardia (horario comercial) | Solo herramientas internas | API crítica para ingresos |
Preguntas frecuentes
¿Cuántas notificaciones por semana son demasiadas?
Investigar cuando las notificaciones totales superan 10 por turno o la tasa de acciones cae por debajo del 30%.
¿Deben las alertas de staging notificar?
Solo ticket a menos que staging replique el ejercicio de SLO de producción. Nunca despertar para entornos que no sean de producción por defecto.
¿Cómo incorporar a un nuevo guardia?
Observar turnos, leer runbooks, simular incidente en día de juego, emparejar la primera notificación real.
¿Qué pasa con los trabajos de entrenamiento de ML?
Los fallos por lotes se registran en ticket; notificar solo si bloquean la inferencia de producción o el SLA del conjunto de datos.
¿Los gerentes toman guardia?
Los líderes técnicos deben hacerlo periódicamente para sentir el dolor y priorizar la higiene de las alertas.
¿Cómo manejar la superposición de vacaciones?
Intercambiar turnos en la herramienta de calendario; nunca dejar un hueco. El secundario escala automáticamente.
¿Puede la IA resumir incidentes para el traspaso?
Sí, para resúmenes de registros; el humano aún posee el registro de decisiones en el ticket.
¿Qué métricas para el liderazgo?
Notificaciones por ingeniero, MTTR, tasa de falsos positivos, barreras abiertas de las post-mortems.
¿Cómo reducir el ruido específico de Python?
Ajustar las alertas de tiempo de espera de Gunicorn, los SLO de la cola de Celery y separar las tasas de quema de infraestructura de las de aplicaciones.
¿Es la guardia opcional para los seniors?
No, propiedad compartida. Los seniors mentorizan a los juniors durante los turnos de sombra.
Relacionado
- Playbooks de respuesta a incidentes - qué hacer cuando se recibe una notificación
- Convertir incidentes en barreras de protección - reducir las notificaciones repetidas
- Depuración de producción - kit de herramientas de primera respuesta
- Métricas - instrumentación de SLO
- Incorporación de equipo - incorporar a nuevos propietarios
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.