Skip to content

About

Executive HTML/PDF reports from the Zabbix API

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

zabbix-report-generator

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.

Funcionalidades

  • 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 timer e cron para gerar o relatório automaticamente toda semana.

Estrutura do projeto

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)

Instalação

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 html e essas dependências não são necessárias.

Testando sem um Zabbix real

python main.py generate --period 7d --mock

Gera 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.

Configuração (Zabbix real)

  1. Copie o arquivo de exemplo:

    cp config/config.example.yaml config/config.yaml
  2. 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.

  3. Preencha config/config.yaml, usando variável de ambiente para o token:

    export ZBX_API_TOKEN='seu-token-aqui'
  4. Ajuste report.host_groups (grupos a incluir), report.min_severity (severidade mínima considerada incidente) e report.company_name.

Uso

# 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 7d

O parâmetro --period aceita horas (24h), dias (7d) ou semanas (4w).

Agendamento

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.timer

cron (alternativa simples): veja deploy/cron/crontab.example.

Como a disponibilidade é calculada

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").

About

Executive HTML/PDF reports from the Zabbix API

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages