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 use- bearer_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 ao- bearer_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; defina- falsepara 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: http- request.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 marca- DOWN; acima de 80% já marca- WARN.
- expect.contains: string obrigatória na resposta; se- expect.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;- 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).