Operar
Monitoramento e webhooks
Checagem a cada minuto, incidentes, avisos assinados ou no chat do time, e os logs no seu serviço de logs.
Monitoramento
Cada aplicação publicada recebe uma requisição a cada minuto: no seu domínio próprio, quando há um ativo há mais de meia hora (assim DNS e certificado errados também contam), senão no endereço da plataforma; com teste de saúde no projeto, no caminho dele. Resposta abaixo de 500 em até 10 segundos conta como no ar; site com senha de acesso é conferido com a senha. Três falhas seguidas abrem um incidente; duas respostas boas seguidas fecham. A página do projeto mostra o estado agora, a disponibilidade em 24 horas e o tempo de resposta. Worker, que não tem endereço, é conferido pelo estado do processo, com as mesmas regras.
Quem é Dono ou Administrador recebe e-mail ao abrir e ao fechar o incidente. Para o chat do time, use um webhook com os eventos incident.opened e incident.resolved.
Alertas de log
Em Logs → Alertas, no projeto, um alerta avisa quando um texto aparece demais: por exemplo, 10 linhas com ERROR em 5 minutos. A cada minuto a CLAUDO conta no histórico guardado as linhas com o texto (sem diferenciar maiúscula; %, _ e espaços valem como escritos), até onde a coleta já leu. O limite vai até 500 linhas por minuto da janela, o que a coleta guarda. Passou do limite, quem é Dono ou Administrador recebe e-mail com o link para os logs já filtrados, e os webhooks com o evento log.alert recebem o aviso com o nome, o texto, a contagem e as últimas 3 linhas (até 300 caracteres cada). Depois de avisar, o alerta espera a janela, e pelo menos 30 minutos, antes de avisar de novo. Até 10 por projeto.
O e-mail não traz as linhas, que podem ter dado que a aplicação imprimiu. Cada pessoa desliga o e-mail em Settings → Avisos por e-mail. Pelo terminal: claudo alerts add <projeto> ERROR --count 10 --minutes 5; pelo assistente: create_log_alert; pela API: POST /api/v1/projects/<projeto>/log-alerts.
Página de status pública
Em Configuração do projeto, Ligar página de status cria uma página pública em claudo.com.br/status/<organização>/<projeto> para mandar aos seus clientes: se o site está no ar agora, as barras dos últimos 30 dias, a disponibilidade e as quedas, com início e duração. Nenhum detalhe interno aparece (nem o endereço checado, nem o erro), e a página fica fora dos buscadores. Desligada, o endereço não existe. Atualiza a cada minuto.
- Selo para o README: a imagem
https://claudo.com.br/status/<organização>/<projeto>/badge, verde no ar, vermelho fora do ar, cinza pausado ou sem dados. O Markdown pronto para colar aparece na Configuração do projeto. - Em JSON, para um monitor ou um widget no seu site:
GET /api/status/<organização>/<projeto>, sem autenticação. - Pelo terminal:
claudo status-page <projeto> on; pelo assistente:set_status_page; pela API:PUT /api/v1/projects/<projeto>/status-pagecom{"enabled": true}.
Webhooks
Em Webhooks (Dono ou Administrador), Novo webhook: para onde (JSON assinado, Slack, Discord, Telegram ou WhatsApp), o endereço, o projeto (ou todos) e os eventos. Até 10 por organização; só https para endereço público. Enviar teste manda um ping.
| Grupo | Eventos |
|---|---|
| Deploy | deployment.ready, deployment.failed, preview.ready, preview.failed |
| Recursos | domain.verified, database.ready, incident.opened, incident.resolved, log.alert |
| Pay | payment.paid, payment.overdue, payment.refunded, payment.canceled, subscription.activated, subscription.canceled |
mail.delivered, mail.bounced, mail.complained, mail.received | |
| Filas e Auth | queue.failed, auth.user_created, auth.user_deleted |
Envio de logs
Em Webhooks → Envio de logs (Dono ou Administrador), os logs das aplicações vão para o seu serviço de logs: a cada minuto, as linhas novas saem num POST com uma lista JSON. Cada linha traz message, o instante em timestamp, dt e _time, o projeto em service e project, e organization. Vale para um projeto ou para todos; começa do que chegar depois do cadastro. Até 3 por organização; só https para endereço público. O endereço e o valor do cabeçalho de autenticação ficam cifrados (a lista mostra só o host). Enviar teste manda uma linha na hora.
| Serviço | Endereço | Cabeçalho |
|---|---|---|
| Better Stack | https:// + o ingesting host da fonte HTTP | Authorization: Bearer <token da fonte> |
| Axiom | https://api.axiom.co/v1/datasets/<dataset>/ingest | Authorization: Bearer <token> |
| Datadog | https://http-intake.logs.datadoghq.com/api/v2/logs (ou o da sua região) | DD-API-KEY: <chave da API> |
O envio usa o mesmo histórico da tela de Logs: com o histórico do plano desligado, nada sai. Se o serviço recusar ou não responder, o envio tenta de novo do ponto onde parou, esperando um pouco mais a cada falha (até uma hora), e mostra o erro; 10 falhas seguidas ao longo de 24 horas desligam. Ao religar, volta do que chegar a partir dali. A lista avisa quando o envio está atrasado e quando linhas passaram do tempo de histórico do plano antes de sair. Pelo terminal: claudo drains add <url> --project <projeto> --header Authorization (o valor é pedido sem aparecer na tela); pelo assistente: create_log_drain; pela API: POST /api/v1/log-drains.
Conferir a assinatura (JSON assinado)
Cada entrega é um POST com o corpo { id, type, created_at, organization, project, data } e os cabeçalhos X-Claudo-Event, X-Claudo-Delivery e X-Claudo-Signature: t=<unix>,v1=<hex>, onde v1 é o HMAC-SHA256 de <t>.<corpo cru> com o segredo inteiro (whsec_..., que aparece só ao cadastrar).
import { createHmac, timingSafeEqual } from "node:crypto";
export function assinaturaValida(corpo: string, cabecalho: string, segredo: string) {
const partes = Object.fromEntries(cabecalho.split(",").map((p) => p.split("=")));
const t = Number(partes.t);
if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;
const esperado = createHmac("sha256", segredo).update(`${t}.${corpo}`).digest("hex");
const recebido = String(partes.v1 ?? "");
return (
recebido.length === esperado.length &&
timingSafeEqual(Buffer.from(recebido), Buffer.from(esperado))
);
}- Responda com 2xx em até 10 segundos. Sem isso, há novas tentativas em 1 min, 5 min, 30 min, 2 h e 6 h.
- O
tmuda a cada tentativa: evite processar duas vezes usandoX-Claudo-Delivery. - Redirecionamento não é seguido. Dez entregas falhas seguidas desligam o webhook;
Religarvolta.