← Documentação

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-page com {"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.

GrupoEventos
Deploydeployment.ready, deployment.failed, preview.ready, preview.failed
Recursosdomain.verified, database.ready, incident.opened, incident.resolved, log.alert
Paypayment.paid, payment.overdue, payment.refunded, payment.canceled, subscription.activated, subscription.canceled
Mailmail.delivered, mail.bounced, mail.complained, mail.received
Filas e Authqueue.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çoEndereçoCabeçalho
Better Stackhttps:// + o ingesting host da fonte HTTPAuthorization: Bearer <token da fonte>
Axiomhttps://api.axiom.co/v1/datasets/<dataset>/ingestAuthorization: Bearer <token>
Datadoghttps://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).

Node
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 t muda a cada tentativa: evite processar duas vezes usando X-Claudo-Delivery.
  • Redirecionamento não é seguido. Dez entregas falhas seguidas desligam o webhook; Religar volta.