Nota diaria: Depurando un flujo de API en producción
La prueba de integración pasó, el entorno de staging está en verde, pero en producción falla para el 1% de los llamadores. El error estaba en un lugar que nunca habría adivinado.
Hoy fue uno de esos días.
La API devuelve 200 en staging, 500 para ~1% del tráfico en producción. CloudWatch muestra que la Lambda se está agotando en 29.9s. Todas las pruebas de integración pasaron. Todas las pruebas de carga pasaron.
Pasé dos horas culpando a la base de datos. No era la base de datos.
Resultó que: una de nuestras integraciones SaaS de upstream comenzó a devolver respuestas con un encabezado específico en el que nuestro cliente HTTP intentó reintentar silenciosamente. Tres reintentos × 10s de retroceso = 30s = tiempo de espera de la Lambda. El 1% era el subconjunto de clientes cuyos datos casualmente pasaban por un edge de un proveedor específico.
# antes
session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1)))
# después
session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=Retry(
total=3,
backoff_factor=1,
respect_retry_after_header=False, # el proveedor miente
allowed_methods=frozenset(["GET"]), # nunca reintentar POSTs
)))
Lección que sigo reaprendiendo: las políticas de reintento son un límite del sistema. Los valores predeterminados casi siempre son incorrectos para tu sistema.
Me voy a la cama con dolor de cabeza pero con un tablero verde.
Escrito por
Adrian Romo
Ingeniero Backend Senior que diseña APIs escalables en Python, arquitecturas sobre AWS Lambda, sistemas de voz e integraciones empresariales.
Relacionado
Sigue leyendo
Segundos de trabajo, horas de residencia
Mi informe matutino empezó a fallar. Ollama estaba activo y devolvía un HTTP 500, porque una renderización de imagen de 21 segundos seguía ocupando 6.6 GB de VRAM horas después.
¿Qué Merece Atención Hoy?
Mi homelab genera un veredicto cada mañana: algo te necesita, o nada lo hace. Conseguir que la segunda parte fuera honesta fue mucho más difícil que la primera.
La alerta que nombró algo y lo presentó como evidencia
Cinco alertas de alta severidad de mi propio monitoreo. Las cinco fueron por el mismo defecto: un registro que nombra algo se leía como una observación de una propiedad que nunca midió.
Continúa
¿A dónde sigues?
Explora más textos técnicos, revisa los casos de estudio o escríbeme directo.