
Sesenta contenedores en un servidor
Un servidor bare-metal ejecuta decenas a cientos de contenedores Hoody. KSM y dedup BTRFS hacen que el costo marginal sea casi cero.
La exportación de métricas horaria lleva tres días fallando. Esta noche estás de guardia. PATCH a la entrada de cron gestionada con enabled:false — el horario, el comando y el comentario se quedan. El job está en un estado definido: presente y silenciado, esperando a que alguien lo arregle.
{ "enabled": false, "comment": "reindex flaking — see thread" }
el toggle es solo un PATCH · la entrada nunca sale de la lista
Las entradas gestionadas de Hoody Cron son un recurso JSON: cada fila tiene un id, un horario, un comando, un comentario y un flag enabled. Cambiar enabled a false es un PATCH. La entrada se queda en el crontab para que la siguiente persona pueda leerla y decidir qué hacer.
# mute the flaky entry — entry stays in the crontab curl -X PATCH \ https://cron.containers.hoody.com/users/me/entries/e7d3 \ -H "Content-Type: application/json" \ -d '["enabled": false, "comment": "flaking on monday with prod-db — see #pager"]' # response HTTP/1.1 200 OK { "id":"e7d3", "enabled":false, "schedule":"0 * * * *", "command":"/srv/cron/metrics-export.sh", ... }
# the entry is still on the list — just not running curl GET https://cron.containers.hoody.com/users/me/entries HTTP/1.1 200 OK [ { "id":"a1f2", "enabled":true, ... }, { "id":"e7d3", "enabled":false, "comment":"flaking — see #pager" }, { "id":"9b21", "enabled":true, ... } ] # present and muted — the on-call hand-off has somewhere to point
El PATCH no borra, no reescribe ni mueve la entrada — solo cambia un booleano. El traspaso es una línea: 'la entrada metrics-export e7d3 está silenciada, mira hoody-cron, échale un ojo, por favor.'
Una entrada en un crontab de Hoody siempre está en exactamente uno de tres estados. Cada estado tiene consecuencias distintas para quién sabrá qué mañana por la mañana.
La entrada está en el crontab y el daemon de cron del kernel la coge cada hora. Los fallos despiertan a quien está de guardia. Es el estado por defecto para jobs sanos.
enabled:false. La entrada sigue en el crontab para que el equipo pueda leer su horario, su comando y su comentario. El daemon de cron la salta. Sin avisos a las 2 de la madrugada, y nadie olvida que existe.
Una vez que haces DELETE, el horario, el comando, el comentario, la razón — todo se va del crontab. La siguiente persona de guardia no tiene nada que buscar. Silenciar es la opción que mantiene la memoria.
Silenciar es el estado intermedio al que la mayoría de schedulers no le pone nombre. Hoody Cron sí, porque enabled es un campo de primera clase en la entrada gestionada.
Cuando no puedes arreglar un job esta noche, la pregunta es qué forma toma su ausencia mañana. Silenciar hace esa forma legible.
En vez de pegar un hilo de Slack o una PR con líneas borradas, el mensaje es el id de la entrada. La guardia de mañana abre la URL de cron, lee el comentario y sabe por dónde empezar.
GET /entries devuelve enabled:false junto con el comentario. Construye un panel de auditoría filtrando. Quién la silenció, por qué y hace cuánto está en el JSON, no en los DMs de alguien.
Cuando se arregle el problema de fondo, un PATCH más con enabled:true vuelve a poner la entrada en horario. Sin reescribir la expresión cron, sin riesgo de erratas, sin ciclo de commit-and-deploy.
Los números vienen de la superficie de entradas gestionadas de Hoody Cron, no de benchmarks inventados.
PATCH /users/[user]/entries/[id] acepta un body parcial. Manda ["enabled":false] solo — horario, comando y comentario quedan intactos.
El horario de cinco campos, command, comment, expires_at e id persisten al silenciar. El crontab del kernel sigue reflejando la entrada — solo comentada por el servicio cron.
Sin editar archivo, sin PR, sin deploy. El round-trip de silenciar es una llamada HTTP desde cualquier terminal, incluida la del móvil.
Según la API de Managed Entries de Hoody Cron: cada entrada lleva un booleano enabled junto a schedule, command, comment y un expires_at opcional. PATCH acepta bodies parciales.
Disabled no es deleted — la entrada espera a que alguien la arregle.
Las formas habituales en que los equipos 'aparcan temporalmente' una línea de cron inestable. Cada una es destructiva, pierde contexto, o está a dos PRs de producción.
Deja de borrar jobs inestables a las 2 de la madrugada. Siléncialos, deja una nota, y deja que la guardia de mañana lea el JSON.