Aller au contenu
use-cases / on-call-shift-cron / hero
CRON · EXPIRES_AT · NOTIFICATIONS

Une escalade d'astreinte qui expire avec votre garde

Postez une entrée cron le lundi avec expires_at fixé au vendredi 09:00. Le job sonne sur votre téléphone toutes les 30 minutes pendant quatre jours, puis se supprime au moment exact où la garde se termine. La personne d'astreinte suivante poste la sienne. Pas de planning PagerDuty, pas de config de planificateur partagée, pas de rappel de calendrier pour la désactiver.

Lire la doc cron
use-cases / on-call-shift-cron / handoff

Comment la garde se passe le relais sans réunion

Trois moments dans la semaine. L'existence de l'entrée cron suit la garde exactement — pas de chevauchement, pas d'écart, pas de ligne crontab résiduelle.

Lundi 09:00 → Vendredi 09:01expires_at porte la garde
LUNDI 09:00

Poster l'entrée

Un curl avec un planning */30, une commande pointant vers hoody-notifications/push/me, et expires_at = vendredi 09:00:00Z. Le serveur retourne l'id e7d3.

LUN–VEN

Les pings vont sur votre téléphone

Toutes les 30 minutes pendant quatre jours, l'entrée s'exécute et ping hoody-notifications. Uniquement votre appareil. Le canal d'équipe reste silencieux.

VENDREDI 09:01

L'entrée se retire elle-même

À 09:00:00Z, le service cron supprime e7d3. Le tick de 09:30 n'a rien à déclencher. La personne d'astreinte suivante a déjà posté la sienne.

Chaque personne d'astreinte écrit un POST quand sa garde commence. Le champ expires_at est l'intégralité du protocole de relais — le service cron fait le ménage, à la seconde près.

use-cases / on-call-shift-cron / mechanism

Deux curls — un par garde

Tout le protocole de rotation tient en deux appels HTTP par semaine. La personne d'astreinte poste lundi, liste vendredi, voit que l'entrée est déjà partie. Il n'y a aucun fichier de planning partagé à fusionner.

monday.sh · m.dossantos
POST · entry
# monday 09:00 — i'm on call until friday 09:00
curl -X POST \
  https://oncall.containers.hoody.com/users/me/entries \
  -H "Content-Type: application/json" \
  -d '["schedule":"*/30 * * * *","command":"curl -fsS hoody-notifications/push/m.dossantos","comment":"on-call wk19","expires_at":"2026-05-08T09:00:00Z"]'

# response
HTTP/1.1 201 Created
{ "id":"e7d3", "expires_at":"2026-05-08T09:00:00Z", "enabled":true }
friday.sh · m.dossantos
GET · audit
# friday 09:01 — the next on-call took over
curl GET https://oncall.containers.hoody.com/users/me/entries

HTTP/1.1 200 OK
[
  // my entry e7d3 is gone — it expired
  // at 09:00 sharp. j.okafor's new
  // entry took over at 09:00:30.
]
# no slack thread, no calendar reminder

Aucun service de planificateur partagé n'est impliqué. L'entrée cron est détenue par l'ingénieur ; rien dans la configuration de la personne d'astreinte suivante ne dépend du nettoyage par la précédente.

use-cases / on-call-shift-cron / powers

Trois choses que cette forme retire de votre semaine

Une entrée d'astreinte qui possède sa propre durée de vie supprime trois classes d'erreurs que les configs PagerDuty et les rappels de calendrier ne peuvent pas.

ROUTAGE

Les pings vont sur un seul appareil — le vôtre

Comme la commande de l'entrée pointe vers votre endpoint de notification personnel, les escalades sont routées vers votre téléphone pour la durée de votre garde, et uniquement cela. Pas de spam accidentel sur le canal d'équipe à 3h du matin.

PROPRIÉTÉ

Pas de config partagée à éditer, pas de PR à merger

Il n'y a pas de escalation_policy.yaml que tout le monde touche. Chaque ingénieur possède son entrée. Deux personnes d'astreinte dans des fuseaux horaires différents ne peuvent pas entrer en conflit en éditant le même fichier.

NETTOYAGE

Le relais est dans la donnée, pas dans le chat

Quand vendredi 09:00 arrive, vous ne demandez pas "attendez, je reçois encore ces alertes ?". L'entrée est déjà partie. Vérifier le relais c'est un GET qui retourne une ligne en moins.

use-cases / on-call-shift-cron / capacity

Ce que le service cron garantit

Les chiffres viennent de l'API Hoody Cron. Vraies limites, pas inventées.

  1. PRÉCISION D'EXPIRATION1 sec

    L'auto-expiration s'exécute contre l'horloge système. Un expires_at à 09:00:00Z se supprime dans la même minute que le tick cron — pas de latence de 5 minutes du concierge.

  2. CHAMPS PAR PLANNING5

    Expressions cron standard à 5 champs plus les macros @hourly / @daily / @weekly. */30 * * * * c'est ce qui se déclenche toutes les 30 minutes pendant votre garde.

  3. ISOLATION1 / utilisateur

    Chaque utilisateur système a son propre crontab. L'entrée de la personne d'astreinte suivante vit sous son propre /users/[name]/entries — sans jamais toucher la vôtre.

Limites selon l'API Hoody Cron : les entrées gérées sont des CRUD JSON avec UUID et expires_at ; accès brut au crontab disponible par utilisateur ; isolation du crontab par utilisateur intégrée.

use-cases / on-call-shift-cron / punchline

Quand la garde se termine, l'entrée cron aussi — automatiquement.

avant · le fichier de rotationaprès · deux curls par semaine
À QUOI RESSEMBLAIT L'ANCIEN RELAISéditer oncall.yaml → PR → merge → biper quelqu'un pour désactiverquatre humains · un fichier partagé · pingé quand même à 11h vendredi
À QUOI ÇA RESSEMBLE MAINTENANTPOST /entries [ expires_at: '2026-05-08T09:00:00Z' ]un ingénieur · un curl · le service cron fait le ménage
Lire la doc cron
use-cases / on-call-shift-cron / replaces

Ce que cela remplace

Les outils standards qu'on attrape pour les rotations d'astreinte. Chacun vous facture un service, un dépôt de config et un rituel de relais. Une entrée cron avec expires_at vous facture un POST.

  • politiques d'escalade PagerDutyTarification par siège pour ce qui est un curl vers votre téléphone
  • rotations de planning OpsgenieTout un produit pour déterminer qui est pingé cette semaine
  • dépôts de config d'astreinte customUn YAML partagé que tout le monde PR et que personne ne possède
  • se rappeler de désactiver cron au moment du relaisUn rappel de calendrier que vous fixez, ignorez, et reprogrammez le vendredi
  • nettoyage manuel d'escaladeFil Slack à 11h vendredi — "hé est-ce que quelqu'un peut me désabonner"
  • rotations VictorOpsUn autre service de planificateur pour ce qu'un seul champ expires_at fait
use-cases / on-call-shift-cron / cta

Arrêtez de désactiver des lignes crontab le vendredi matin. Fixez expires_at le lundi et oubliez-le.

Lire la doc cron
use-cases / on-call-shift-cron / related

Découvrez les autres