Monitor leve e extensível para checar serviços HTTP e filas do RabbitMQ em intervalos definidos (cron) e enviar alertas via WhatsApp (Evolution API). Projetado para rodar em contêiner, com persistência simples de estado para evitar alertas repetidos.
- Checagens:
http(status/latência/conteúdo) erabbitmq_queue(ready/unacked/consumidores). - Agendamento: cron por checagem (ex.:
*/1 * * * *). - Notificações: WhatsApp via Evolution API (com
apikeye/ouBearer). - Persistência: arquivo JSON com últimos estados em
data/monitor_state.json. - TZ: América/São Paulo, com supressão opcional de alertas em horário de silêncio.
- Docker e Docker Compose (recomendado), ou
- Python 3.11+ e
pip(execução local).
- Copie o exemplo de variáveis e ajuste:
cp .env-example .envEdite .env e preencha:
EVOLUTION_BASE,EVOLUTION_INSTANCE,EVOLUTION_NUMBER,EVOLUTION_API_KEY(ou usebearer_token, ver seção Notificações).RABBIT_*conforme seu RabbitMQ (URL do management, usuário/senha, vhost).- Adicione também no
.enva URL de health da sua API principal:MAIN_APP_API_URL=https://sua-api/health.
-
Ajuste
config.yamlse necessário (ver exemplos abaixo). -
Crie a pasta de dados local (persistência do estado):
mkdir -p data- Suba os serviços:
docker compose up -d- O serviço
monitormonta./config.yamlem/app/config.yamle persiste estado em./data. - O Compose inclui, opcionalmente, um Postgres e um container
evolution_apipara testes locais. Se você já possui Evolution API externo, pode removê-los/comentá-los.
- Logs do monitor:
docker compose logs -f monitor- Python 3.11+ e venv:
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\Activate.ps1
pip install -r requirements.txt-
Variáveis de ambiente: crie um
.env(padrão é lido automaticamente) a partir do exemplo e ajuste conforme necessário. Alternativamente, exporte no shell. -
Execute:
python app.py- Estado: por padrão salva em
STATE_FILE=/app/data/monitor_state.json. Localmente, você pode definir, por exemplo:
export STATE_FILE=./data/monitor_state.json
mkdir -p ./dataAs variáveis são interpoladas dentro do config.yaml usando a sintaxe ${VAR} ou ${VAR:-default}. Se uma variável faltar, o programa encerra com erro informando <MISSING:VAR>.
Principais variáveis (ver .env-example):
EVOLUTION_BASE: base da Evolution API, ex.:http://localhost:8080.EVOLUTION_INSTANCE: chave/instance key usada na rota do Evolution.EVOLUTION_NUMBER: número WhatsApp de destino no formato internacional (ex.:5531999999999).EVOLUTION_API_KEY:apikeypara Evolution API (alternativa/adição aobearer_token).RABBIT_MGMT_URL,RABBIT_USER,RABBIT_PASS,RABBIT_VHOST: acesso ao Management API do RabbitMQ.MAIN_APP_API_URL: URL de health da sua aplicação (usada no exemplo de check HTTP).STATE_FILE(opcional): caminho do JSON de estado; padrão:/app/data/monitor_state.json.
Trecho real do projeto (com variáveis interpoladas do .env):
notifier:
evolution_api_base: "${EVOLUTION_BASE}"
instance_key: "${EVOLUTION_INSTANCE}"
to_number: "${EVOLUTION_NUMBER}"
api_key: "${EVOLUTION_API_KEY}"
# bearer_token: "${EVOLUTION_BEARER_TOKEN}" # opcional
# quiet_hours: { start: "22:00", end: "07:00" } # opcional
checks:
- name: fila-meli-sync
type: rabbitmq_queue
schedule: "*/1 * * * *"
rabbit:
mgmt_url: "${RABBIT_MGMT_URL}"
user: "${RABBIT_USER}"
pass: "${RABBIT_PASS}"
vhost: "${RABBIT_VHOST}"
queue: "meli-sync-publication-queue"
thresholds:
max_ready: 1000
max_unacked: 200
min_consumers: 1
severity: high
- name: fila-integrated-publication-picture-queue
type: rabbitmq_queue
schedule: "*/1 * * * *"
rabbit:
mgmt_url: "${RABBIT_MGMT_URL}"
user: "${RABBIT_USER}"
pass: "${RABBIT_PASS}"
vhost: "${RABBIT_VHOST}"
queue: "integrated-publication-picture-queue"
thresholds:
max_ready: 1000
max_unacked: 200
min_consumers: 1
severity: high
- name: health-api
type: http
schedule: "*/1 * * * *"
request:
url: "${MAIN_APP_API_URL}"
method: GET
timeout_ms: 2000
verify_tls: true
expect:
status: 200
max_latency_ms: 1000
contains: "OK"
severity: highDicas:
- Use
${VAR:-valor_padrao}para defaults (ex.:url: "${HEALTH_URL:-https://exemplo/health}"). bootstrap_silent: true(padrão) evita alerta na primeira leitura; definafalsepara alertar desde o primeiro ciclo.
- Cron: cada checagem define
scheduleno formato crontab; o timezone éAmerica/Sao_Paulo. - Estados: a transição de estado (
UP/WARN/DOWN) dispara notificação; estados iguais apenas logam. - Severidade: por padrão mapeia
UP=info,WARN=medium,DOWN=high. Pode sobrescrever por checagem viaseverity. - Quiet Hours: se definido em
notifier.quiet_hours, suprime mensagens não críticas fora do horário;DOWN(ouseverity: high) ainda notifica.
- Endpoint usado:
POST {evolution_api_base}/message/sendText/{instance_key}. - Autenticação suportada:
- Header
apikey: ${EVOLUTION_API_KEY}e/ou - Header
Authorization: Bearer ${EVOLUTION_BEARER_TOKEN}(chavebearer_tokenemnotifier).
- Header
- Payloads tentados:
{ number, text }e{ to, text }(compatibilidade entre versões da Evolution API). - Texto: título em negrito + detalhes (ex.:
"[DOWN] health-api"e métricas/erros). - Para usar o container
evolution_apilocal do Compose, consulte a documentação da imagem para criar/parear a instância e obterinstance_keye chave de acesso. AjusteEVOLUTION_BASEe credenciais conforme necessário.
-
type: httprequest.url: URL alvo;method(GET/POST/...),headers,timeout_ms,verify_tls.- Corpo: um dentre
json,dataoubody;filesé suportado. expect.status: código HTTP esperado.expect.max_latency_ms: tempo máximo (ms); acima disso marcaDOWN; acima de 80% já marcaWARN.expect.contains: string obrigatória na resposta; seexpect.regex: true, avalia como regex.
-
type: rabbitmq_queuerabbit.mgmt_url: URL do Management API (ex.:http(s)://host:15672).rabbit.user/rabbit.pass/rabbit.vhost/rabbit.queue.rabbit.verify_tls: opcional;truepor padrão.thresholds.max_ready/max_unacked/min_consumers.- Severidade
DOWNse consumidores abaixo do mínimo; senãoWARNquando thresholds excedidos.
- Logs em stdout com nível
INFOpor padrão (ajuste via orquestrador ou redirecionamento). - Estado persistido em JSON atômico em
STATE_FILE(padrão:/app/data/monitor_state.json). - Para resetar histórico (forçar novo bootstrap), apague o arquivo de estado com o serviço parado.
- Erro "Config contém variáveis ausentes": faltam variáveis usadas em
config.yaml(aparecem como<MISSING:VAR>). Revise seu.env. - Notificação não chega: verifique reachability do
EVOLUTION_BASE,apikey/bearer_token, e se oinstance_keyestá válido/pareado. - Erros de TLS: defina
verify_tls: falseno check (não recomendado em produção) ou ajuste certificados. - RabbitMQ 401/404: confirme
mgmt_url, permissões do usuário,vhoste nome da fila.
- Adicione uma função
check_*emapp.pyque retorne(status, detail). - Registre a função em
CHECK_HANDLERS(ex.:"meu_tipo": check_meu_tipo). - Crie um item em
checksnoconfig.yamlcomtype: meu_tipoe os campos necessários.
- Este projeto está licenciado sob Apache License 2.0 (veja
LICENSE).