Exemplos de integração
Receitas prontas para enviar alertas a uma Fonte de Dados: shell, Python, n8n e um media type de Zabbix. Todas usam o mesmo contrato da Referência do payload; troque whk_SEU_TOKEN pelo token da sua fonte.
Antes de começar
- Crie (ou copie) a fonte em Ajustes → Fontes de Dados e guarde o Token de autenticação em variável de ambiente.
- Decida a
keyde cada problema antes de escrever código. Ela precisa ser a mesma no problema e na resolução. Veja Ciclo de vida do alerta e a key. - Escolha a severidade na escala 0–5 (5 = Desastre, 4 = Alta, 3 = Média, 2 = Atenção, 1 = Informação, 0 = Não classificado).
Teste rápido de conexão
Um POST mínimo confirma token e rede. A resposta esperada é 202:
export SENTRYA_TOKEN="whk_SEU_TOKEN"
curl -sS -o /dev/null -w "%{http_code}\n" \
-X POST https://app.flowbix.com/api/v1/alerts \
-H "Authorization: Bearer $SENTRYA_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key":"teste-conexao","host":"meu-pc","title":"Teste de conexão","severity":1,"status":"problem"}'
Um incidente "Teste de conexão" aparece na aba Incidentes. Feche-o com o mesmo comando trocando o corpo por {"key":"teste-conexao","host":"meu-pc","status":"resolved"}. Se receber 401, o token está errado ou a fonte foi removida.
Bash + curl com resolução
Um script de verificação que abre o problema quando o check falha e fecha quando volta. Como a key é estável, rodar em cron a cada minuto não cria duplicatas: enquanto o problema durar, os envios só atualizam o incidente.
#!/usr/bin/env bash
set -u
URL="https://app.flowbix.com/api/v1/alerts"
TOKEN="${SENTRYA_TOKEN:?defina SENTRYA_TOKEN}"
HOST="$(hostname)"
KEY="disco-raiz:$HOST"
LIMITE=90
USO=$(df -P / | awk 'NR==2 {gsub("%","",$5); print $5}')
enviar() {
curl -sS --retry 3 --retry-delay 5 --retry-connrefused \
-X POST "$URL" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "$1"
}
if [ "$USO" -ge "$LIMITE" ]; then
enviar "{\"key\":\"$KEY\",\"host\":\"$HOST\",\"title\":\"Disco / acima de ${LIMITE}%\",\"severity\":4,\"message\":\"Uso atual: ${USO}%\",\"status\":\"problem\"}"
else
enviar "{\"key\":\"$KEY\",\"host\":\"$HOST\",\"status\":\"resolved\"}"
fi
Enviar resolved a cada execução saudável é seguro: se não há incidente ativo para a key, o servidor não muda nada. O --retry do curl cobre 503 e falhas de rede.
Python (requests)
import os
import requests
URL = "https://app.flowbix.com/api/v1/alerts"
HEADERS = {
"Authorization": f"Bearer {os.environ['SENTRYA_TOKEN']}",
"Content-Type": "application/json",
}
def abrir(key, host, title, severity=3, message=""):
body = {"key": key, "host": host, "title": title,
"severity": severity, "message": message, "status": "problem"}
r = requests.post(URL, json=body, headers=HEADERS, timeout=10)
r.raise_for_status() # 4xx/5xx viram exceção
return r.json() # {"success": true, "status": "new", ...}
def resolver(key, host):
body = {"key": key, "host": host, "status": "resolved"}
r = requests.post(URL, json=body, headers=HEADERS, timeout=10)
r.raise_for_status()
return r.json()
resp = abrir("fila-travada:worker-02", "worker-02",
"Fila de e-mails parada", severity=4,
message="0 mensagens processadas nos últimos 10 min")
print(resp["status"], resp.get("recurrence_count"))
Trate 503 e erros de conexão com nova tentativa. Um 400 não deve ser repetido: o payload está errado e vai falhar de novo.
n8n
O pacote de nós da Flowbix traz o nó Sentrya. Para enviar alertas, use o recurso Webhook e a operação Enviar Alerta (ação "Enviar alerta para um webhook"). O nó monta o POST em /api/v1/alerts por você e autentica com o token da fonte, não com o token da credencial.
- Credencial Configure a credencial do Sentrya no n8n com um token de service account (veja Integração com n8n). Ela serve para o nó listar as fontes da empresa.
- Webhook de destino No campo Webhook Name or ID, escolha a fonte na lista; o token de ingestão é resolvido sozinho. Se preferir, use uma expressão e informe o token
whk_…diretamente. - Tipo do evento Problema ou Resolvido. Em Problema, preencha Título; em Resolvido, a Key é obrigatória.
- Key e campos adicionais Informe a Key (Identidade Do Problema) e, em Campos Adicionais, o que precisar: Host, Severidade (0–5), Mensagem e Comentário. Tudo aceita expressões dos nós anteriores.
- Saída O item de saída é a resposta da API (
success,status,key,recurrence_count), pronta para um nó IF.
O nó valida antes de chamar a API: resolução sem key e problema sem título param com mensagem clara no próprio n8n, em vez de um 400.
Zabbix como fonte (media type webhook)
O caminho recomendado para Zabbix é conectar o servidor em Servidores Zabbix: o Sentrya coleta os problemas pela API, sem configuração no Zabbix (veja Conectar um servidor Zabbix). Use um media type só quando a API do Zabbix não estiver acessível pela internet.
Crie um media type do tipo Webhook com os parâmetros abaixo. Os valores são macros nativas do Zabbix e o número de severidade do Zabbix (0–5) é o mesmo do Sentrya, sem conversão.
| Parâmetro | Valor | Campo do Sentrya |
|---|---|---|
url | https://app.flowbix.com/api/v1/alerts | — |
token | o token whk_… da fonte | cabeçalho Authorization |
key | {TRIGGER.ID} | key |
host | {HOST.NAME} | host |
title | {EVENT.NAME} | title |
severity | {EVENT.NSEVERITY} | severity |
value | {EVENT.VALUE} | decide status: 1 = problem, 0 = resolved |
message | Evento {EVENT.ID} | message |
Script do media type:
var p = JSON.parse(value);
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
req.addHeader('Authorization: Bearer ' + p.token);
var body = {
key: p.key,
host: p.host,
title: p.title,
severity: parseInt(p.severity, 10),
message: p.message,
status: p.value === '0' ? 'resolved' : 'problem'
};
var resp = req.post(p.url, JSON.stringify(body));
if (req.getStatus() !== 202) {
throw 'Sentrya respondeu ' + req.getStatus() + ': ' + resp;
}
return 'OK';
Na ação do Zabbix, inclua as operações de recuperação para que o evento com {EVENT.VALUE} igual a 0 também seja enviado; sem isso os incidentes nunca fecham no Sentrya. Se mais de um Zabbix envia para o Sentrya, crie uma fonte por servidor: o id da trigger só é único dentro de um Zabbix, e duas triggers de servidores diferentes com o mesmo id cairiam no mesmo incidente.
Outras ferramentas
CloudWatch, Grafana e similares normalmente permitem um webhook com corpo personalizado ou um script intermediário. O caminho mais confiável é um pequeno serviço (ou um fluxo no n8n) que recebe o evento da ferramenta e monta o JSON do Sentrya: key estável (por exemplo o nome do alarme mais o recurso), title, severity traduzida para 0–5 e status a partir do estado do alarme. Não envie o payload da ferramenta direto: campos desconhecidos são ignorados e, sem title, o Sentrya devolve 400.
severity menor que 5 passam a ser recusados com 422 e a mensagem explica o motivo. Mapeie o que é realmente crítico para 5 e deixe o resto abaixo. Veja Sirene: o alerta máximo.