Pular para o conteúdo
use-cases / on-call-shift-cron / hero
CRON · EXPIRES_AT · NOTIFICAÇÕES

Um escalonamento de plantão que expira junto com o seu turno

Poste uma entrada cron na segunda com expires_at apontando para sexta às 09:00. O job avisa seu telefone a cada 30 minutos por quatro dias e se apaga no momento em que o turno acaba. O próximo plantonista posta o dele. Sem agendamento PagerDuty, sem configuração de scheduler compartilhada, sem lembrete de calendário para desativar.

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

Como o turno passa adiante sem reunião

Três pontos na semana. A existência da entrada cron acompanha o turno com precisão — sem sobreposição, sem lacuna, sem linha de crontab esquecida.

Segunda 09:00 → Sexta 09:01expires_at carrega o turno
SEGUNDA 09:00

Posta a entrada

Um curl com schedule */30, comando apontando para hoody-notifications/push/me e expires_at = sexta 09:00:00Z. O servidor retorna o id e7d3.

SEG–SEX

Os pings vão para o seu telefone

A cada 30 minutos, por quatro dias, a entrada roda e pinga o hoody-notifications. Só o seu dispositivo. O canal do time fica em silêncio.

SEXTA 09:01

A entrada se remove

Às 09:00:00Z o serviço cron apaga e7d3. O tick das 09:30 não tem nada para disparar. O próximo plantonista já postou o dele.

Cada plantonista escreve um POST quando o turno começa. O campo expires_at é o protocolo de handoff inteiro — o serviço cron faz a limpeza, no segundo certo.

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

Dois curls — um por turno

O protocolo inteiro de rotação são duas chamadas HTTP por semana. O plantonista posta na segunda, lista na sexta, vê que a entrada já sumiu. Não há arquivo de agendamento compartilhado para fazer merge.

monday.sh · m.dossantos
POST · entrada
# 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 · auditoria
# 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

Nenhum serviço de scheduler compartilhado está envolvido. A entrada cron é da pessoa de engenharia; nada na configuração do próximo plantonista depende do anterior limpar a sua.

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

Três coisas que esse formato tira da sua semana

Uma entrada de plantão que controla o próprio tempo de vida elimina três classes de erros que configurações PagerDuty e lembretes de calendário não conseguem.

ROTEAMENTO

Os pings vão para um dispositivo — o seu

Como o comando da entrada aponta para o seu endpoint pessoal de notificação, os escalonamentos vão para o seu telefone durante o turno, e só durante ele. Sem spam acidental no canal do time às 3 da manhã.

PROPRIEDADE

Sem configuração compartilhada para editar, sem PR para fazer merge

Não existe escalation_policy.yaml que todo mundo mexe. Cada engenheiro é dono da sua entrada. Dois plantonistas em fusos diferentes não conseguem entrar em conflito editando o mesmo arquivo.

LIMPEZA

O handoff está nos dados, não no chat

Quando der sexta 09:00, você não pergunta 'espera, ainda estou recebendo isso?'. A entrada já se foi. Verificar o handoff é um GET que retorna uma linha a menos.

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

O que o serviço cron garante

Os números vêm da Hoody Cron API. Limites reais, não inventados.

  1. PRECISÃO DE EXPIRAÇÃO1 seg

    A expiração automática roda contra o relógio do sistema. Um expires_at em 09:00:00Z apaga dentro do mesmo minuto em que o tick cron dispara — sem atraso de 5 minutos por causa de zelador.

  2. CAMPOS POR AGENDAMENTO5

    Expressões cron padrão de 5 campos mais macros @hourly / @daily / @weekly. */30 * * * * é o que dispara a cada 30 minutos durante o seu turno.

  3. ISOLAMENTO1 / usuário

    Cada usuário do sistema tem o próprio crontab. A entrada do próximo plantonista vive no /users/[name]/entries dele — nunca encosta na sua.

Limites conforme a Hoody Cron API: entradas gerenciadas são CRUD JSON com UUIDs e expires_at; acesso ao crontab raw disponível por usuário; isolamento de crontab por usuário é nativo.

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

Quando o turno acaba, a entrada cron acaba também — automaticamente.

antes · o arquivo de rotaçãodepois · dois curls por semana
COMO ERA O HANDOFF ANTIGOedita oncall.yaml → PR → merge → paginar alguém para desabilitarquatro humanos · um arquivo compartilhado · ainda assim foi pingado às 11h da sexta
COMO É AGORAPOST /entries [ expires_at: '2026-05-08T09:00:00Z' ]uma engenheira · um curl · o serviço cron faz a limpeza
use-cases / on-call-shift-cron / replaces

O que isso substitui

As ferramentas padrão de prateleira quando você quer rotação de plantão. Cada uma cobra um serviço, um repositório de config e um ritual de handoff. Uma entrada cron com expires_at cobra um POST.

  • políticas de escalonamento PagerDutyPreço por usuário para o que é um curl no seu telefone
  • rotações OpsgenieUm produto inteiro para descobrir quem é pingado nesta semana
  • repositórios de configuração de plantãoYAML compartilhado que todo mundo abre PR e ninguém é dono
  • lembrar de desabilitar o cron no handoffUm lembrete de calendário que você cria, ignora e remarca na sexta
  • limpeza manual de escalonamentoThread no Slack às 11h de sexta — "alguém pode me desinscrever"
  • rotações VictorOpsMais um serviço de scheduler para o que um campo expires_at faz
use-cases / on-call-shift-cron / cta

Pare de desativar linhas de crontab na manhã de sexta. Defina expires_at na segunda e esqueça.

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

Leia os outros