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
apikey
e/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 .env
Edite .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
.env
a URL de health da sua API principal:MAIN_APP_API_URL=https://sua-api/health
.
-
Ajuste
config.yaml
se 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
monitor
monta./config.yaml
em/app/config.yaml
e persiste estado em./data
. - O Compose inclui, opcionalmente, um Postgres e um container
evolution_api
para 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 ./data
As 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
:apikey
para 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: high
Dicas:
- Use
${VAR:-valor_padrao}
para defaults (ex.:url: "${HEALTH_URL:-https://exemplo/health}"
). bootstrap_silent: true
(padrão) evita alerta na primeira leitura; definafalse
para alertar desde o primeiro ciclo.
- Cron: cada checagem define
schedule
no 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_token
emnotifier
).
- 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_api
local do Compose, consulte a documentação da imagem para criar/parear a instância e obterinstance_key
e chave de acesso. AjusteEVOLUTION_BASE
e credenciais conforme necessário.
-
type: http
request.url
: URL alvo;method
(GET/POST/...),headers
,timeout_ms
,verify_tls
.- Corpo: um dentre
json
,data
oubody
;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_queue
rabbit.mgmt_url
: URL do Management API (ex.:http(s)://host:15672
).rabbit.user
/rabbit.pass
/rabbit.vhost
/rabbit.queue
.rabbit.verify_tls
: opcional;true
por padrão.thresholds.max_ready
/max_unacked
/min_consumers
.- Severidade
DOWN
se consumidores abaixo do mínimo; senãoWARN
quando thresholds excedidos.
- Logs em stdout com nível
INFO
por 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_key
está válido/pareado. - Erros de TLS: defina
verify_tls: false
no check (não recomendado em produção) ou ajuste certificados. - RabbitMQ 401/404: confirme
mgmt_url
, permissões do usuário,vhost
e nome da fila.
- Adicione uma função
check_*
emapp.py
que retorne(status, detail)
. - Registre a função em
CHECK_HANDLERS
(ex.:"meu_tipo": check_meu_tipo
). - Crie um item em
checks
noconfig.yaml
comtype: meu_tipo
e os campos necessários.
- Este projeto está licenciado sob Apache License 2.0 (veja
LICENSE
).