Gerador de relatório executivo (HTML + PDF) a partir da API do Zabbix: disponibilidade por host, top incidentes e tendência no período — pronto para enviar toda semana para gestão, sem montar planilha na mão.
- Conexão com a API do Zabbix — autenticação via API token (Zabbix >= 5.4) ou usuário/senha (fallback para versões mais antigas).
- Disponibilidade por host e geral — calculada a partir dos eventos de
problema (
event.get), considerando início e resolução de cada incidente dentro do período do relatório. - Top incidentes — ranking dos incidentes de maior duração/severidade no período.
- Tendência de disponibilidade — gráfico diário (ou semanal) mostrando a evolução da disponibilidade geral ao longo do tempo.
- Saída em HTML e PDF — mesmo relatório, dois formatos: HTML para visualizar rápido/enviar por e-mail, PDF para arquivar ou anexar.
- Modo de demonstração (
--mock) — gera um relatório completo com dados simulados, sem precisar de um Zabbix real, para testar ou dar preview do layout. - Agendamento pronto — exemplos de
systemd timerecronpara gerar o relatório automaticamente toda semana.
zabbix-report-generator/
├── main.py # CLI (comando `generate`)
├── requirements.txt
├── config/
│ └── config.example.yaml # copie para config.yaml e preencha
├── templates/
│ └── report.html.j2 # template do relatório (Jinja2)
├── mock_data/
│ ├── groups.json
│ └── hosts.json # usados no modo --mock
├── src/zbx_report/
│ ├── zabbix_client.py # cliente JSON-RPC da API do Zabbix
│ ├── mock_client.py # cliente fake para o modo --mock
│ ├── data.py # disponibilidade, top incidentes, tendência
│ ├── charts.py # gráficos matplotlib embutidos (base64 PNG)
│ ├── render.py # monta o HTML final a partir do template
│ ├── pdf.py # HTML -> PDF via weasyprint
│ └── utils.py # config loader + helpers
├── deploy/
│ ├── systemd/ # zbx-report.service + .timer
│ └── cron/ # crontab.example
└── reports/ # gerado em runtime (gitignored)
git clone https://github.com/<seu-usuario>/zabbix-report-generator.git
cd zabbix-report-generator
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
weasyprint(geração de PDF) depende de bibliotecas de sistema (Pango, Cairo, GDK-PixBuf). Em Debian/Ubuntu:sudo apt install libpango-1.0-0 libpangocairo-1.0-0 libcairo2 libgdk-pixbuf2.0-0. Se só precisar do HTML, use--format htmle essas dependências não são necessárias.
python main.py generate --period 7d --mockGera reports/relatorio_<timestamp>.html e .pdf com dados simulados —
6 hosts de exemplo (servidores + rede), incidentes e disponibilidade
gerados de forma determinística para o período pedido. Útil para conferir
o layout antes de conectar num Zabbix de verdade.
Veja tambem examples/README.md para um roteiro curto de preview e ideias de artefatos seguros para demonstracao.
-
Copie o arquivo de exemplo:
cp config/config.example.yaml config/config.yaml
-
Gere um API token no Zabbix (Administration > API tokens, Zabbix >= 5.4) ou use usuário/senha de um usuário com permissão de leitura nos grupos de host desejados.
-
Preencha
config/config.yaml, usando variável de ambiente para o token:export ZBX_API_TOKEN='seu-token-aqui'
-
Ajuste
report.host_groups(grupos a incluir),report.min_severity(severidade mínima considerada incidente) ereport.company_name.
# Relatório dos últimos 7 dias, HTML + PDF (padrão)
python main.py generate --period 7d
# Só PDF, últimos 30 dias
python main.py generate --period 30d --format pdf
# Modo de demonstração
python main.py generate --period 7d --mock
# Outro arquivo de config, log em modo debug
python main.py --config config/outro.yaml -v generate --period 7dO parâmetro --period aceita horas (24h), dias (7d) ou semanas (4w).
systemd (recomendado em servidores Linux):
sudo cp deploy/systemd/zbx-report.service /etc/systemd/system/
sudo cp deploy/systemd/zbx-report.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now zbx-report.timercron (alternativa simples): veja deploy/cron/crontab.example.
Para cada host, soma-se o tempo em que houve pelo menos um problema aberto
dentro do período do relatório (event.get com value=1 para o início, e
o evento de resolução via r_eventid para o fim). A disponibilidade é:
disponibilidade (%) = 100 * (1 - tempo_indisponível / duração_do_período)
Incidentes ainda abertos no fim do período contam como indisponíveis até o fim do período (não até "agora").