sexta-feira, 8 de janeiro de 2016

PgRelatórios

A função do PgRelatórios é centralizar em um servidor, o trabalho automatizado de gerar relatórios utilizando o PgBadger para cada servidor e suas base de dados de forma incremental.
Possuímos vários servidores de produção, com versões diferentes do PostgreSQL, codificações diferentes, diretório dos logs diferentes, log_line_prefix diferentes, não porque somos relaxados e sim por questões de quem e quando foi disponibilizado o servidor e/ou questões politicas, então com o PgRelatórios vamos unificar tudo isso em um único lugar, que acessa inúmeros servidores que rodam o PostgreSQL.

Aqui você pode para baixar o pacote na versão 1.1.

Existe um script em shell que copia os arquivos de log dos servidores para o servidor do PgRelatórios, então processa estes arquivos com o PgBadger gerando os relatórios.
Estes scripts estão na pasta script.
Com os relatórios gerados há uma página em PHP para ler os diretórios gerados no PgBadger e apresentar os relatórios disponíveis. Estes os arquivos estão na pasta html.

OBS: O PgBadger é uma ótima ferramenta para gerar relatórios baseado nos logs do PostgreSQL, mas atenção, ele não faz um relatório de tudo o que acontece no servidor e sim do que foi logado pelo servidor. Se você pede para logar tudo, o servidor irá gerar um overhead e pode deixar de ser um banco de dados e sim um gerador de log, então cuidado com suas configurações!!




Script

O principio do script é:
  1. Acessar um servidor remoto;
  2. Buscar informações da configuração do  PostgreSQL a serem utilizadas pelo pgbadger;
  3. Copiar os arquivos de log do servidor remoto para o servidor do pgrelatorios, utilizando o rsync para diminuir o tráfego de dados na rede. (obs: o pgbadger pode processar os arquivos de forma remota, mas para cada base de dados nova ele busca novamente todos os logs, então o custo de rede é [quantidade de base de dados + 1] * [quantidade de arquivos de log]);
  4. Receber a lista das base de dados;
  5. Gerar os relatórios;
  6. Limpar arquivos de log antigos;
  7. Enviar por email o relatório. 


Dentro desta pasta temos os seguintes arquivos:
dblist.sql 
pgbadger 
pgrelatorios.conf 
pgrelatorios.sh 
pgrelatorios_core.sh 
serverslist.txt

dblist.sql
Arquivo que contem uma consulta sql para listar as base de dados, excluindo o postres, template0, template1 e bases que contenham velho ou old.

pgbadger
É o executável do pgbadger, na versão 7.1.

pgrelatorios.conf
Arquivo de configuração do pgrelatorios, concentrei nele todas as configurações possíveis, para evitar de ter de mexer nos arquivos .sh.
- SERVER_NAME: nome do servidor, para identificar nos emails.
- EMAIL: lista de e-mails de quem irá receber o relatório da execução da rotina.
- REMOTE_LOG_DIR: caminho padrão do diretório de logs dos servidores remotos, para quando não conseguir receber a informação do log_directory.
- LOG_LINE_PREFIX: configuração padrão do log_line_prefix, para quando não conseguir receber a informação do servidor remoto.
- PGBADGER_DIR: diretório onde se encontra o executável do pgbadger
- SERVER_LIST: caminho do arquivo serverslist.txt
- DB_LIST: caminho do arquivo dblist.sql
- LOGS_ENTRADA_DIR: diretório onde ira armazenar os arquivos de log dos servidores remotos.
- REL_DIR: diretório onde será disponibilizado os relatórios para o serviço web
- REL_WEEKS: quantidade de semanas par gerar os relatórios, lembrando que o pgbadger trabalha com semanas
- LOG_DIR: diretório onde ira guardar o log de todo o processo

pgrelatorios.sh
Executável do pgrelatorios, que deve ser chamado pelo cron.

pgrelatorios_core.sh
Executável do pgrelatorios que contem toda a logica da geração dos relatórios.

serverslist.txt
Arquivo que contem o dns ou ip dos servidores remotos, ondem devem ser buscado os logs.



Html

Dentro da pasta html temos os seguintes arquivos:
index.php 
pgrelatorios.css 
images


index.php
Pagina que irá ler todos os diretórios e apresentar na tela a listagem de servidores e bases de dados.
Logo no inicio exitem duas variáveis de configuração:
- filtro: define qual o padrão dos seus servidores para listar esses arquivos, se não iria apresentar todos os arquivos do diretório;
- dir: é o caminho onde se encontram os diretórios dos relatórios gerados pelo pgbadger.

pgrelatorios.css
Arquivo que contem os estilos para apresentar o html

<dir>images
Diretório com as imagens da página

Telas

Apresentação do conteúdo gerado:

Com todos os relatórios gerados, chegou o momento de fazer a apresentação deles.
Criei um arquivo em PHP, que faz a leitura dos diretórios que contém os relatórios, varrendo cada servidor e populando as base de dados do mesmo.
Imagem 1: Página de consulta do pgrelatorios

Para cada servidor, tem a opção de apresentar o relatório dele completo e abaixo tem as base de dados de cada um, ao entrar em algum dos links temos:
Imagem 2 - Tela de opção de escolha de qual relatório será apresentado.

Apresenta uma tela, já do PgBadger, com um calendário mostrando o número da semana e os dias do(s) mês(es). Os números que estão em azuis, são os que possuem relatório, podendo ser semanal ou diário.
Ao escolher algum deles temos:
Imagem 3 - Relatório do PgBadger

Já a tela de um relatório do PgBadger com suas diversas opções para ver o comportamento das base de dados no servidor. Em outro post vou mostrar o que considero importante de ser analisado no PgBadger e explico aos nossos desenvolvedores.


Configuração passo a passo


1) Dependências

É necessário ter alguns pacotes instalados:
- Webserver (ex: apache)
- PHP
- Postfix
- rsync

2) Baixar o pacote

Fazer o download do PgRelatórios.

3) Descompactar

Descompactar o arquivo no servidor de relatórios.

tar xzvf pgrelatorios_v1.1.tgz

Ele irá apresentar dois diretórios e um arquivo de README.
  html
  script
  README

4) Mover os aquivos

mv html/* 
mv script /srv
Obs: A pasta /var/www é a pasta padrão do apache.

5) Arrumar a configuração do script

Sugestão:
- pgrelatorios em /srv/pgrelatorios
- arquivos de logs baixados em /srv/pgrelatorios/logs
- pasta padrão do apache em /var/www/
- log do pgrelatorios em /var/log/postgresql/
- diretório padrão de salvar os logs /pg/log

Com base na sugestão temos no arquivo pgrelatorios.conf:

SERVER_NAME="PgRelatorios"
EMAIL="adminitrador@email.com"
REMOTE_LOG_DIR="/pg/log"
LOG_LINE_PREFIX="[%h %t] %u@%d "
PGBADGER_DIR="/srv/pgrelatorios"
SERVER_LIST="/srv/pgrelatorios/serverslist.txt"
DB_LIST="/srv/pgrelatorios/dblist.sql"
LOGS_ENTRADA_DIR="/srv/pgrelatorios/logs"
REL_DIR="/var/www/pg"
REL_WEEKS=2
LOG_DIR="/var/log/postgresql"

6) Criar chave segura

Acredito que esse seja o passo mais complicado, pois o servidor do PgRelatório tem que conseguir acessar o servidor do postgreSQL remoto com um usuário que tenha permissão para ler os logs e se conectar ao banco.
Por questão de exemplo, vou utilizar o usuário postgres,  porém não é o mais seguro.
Dica: Pode ser criado um usuário no sistema, pertencente ao grupo do postgres para poder ler os arquivos de log do postgres e o mesmo usuário no PG sem ser superuser, para poder consultar a lista de base de dados e parâmetros de configuração.
Para criar a chave segura recomendo este link, apenas no passo 4 é mais simples copiar a chave para o servidor destino usando ssh-copy-id -i /home/user/.ssh/id_rsa.pub servidor_destino .
Com ela funcionando, você consegue se conectar ao outro servidor, sem precisar mais digitar a senha. Ai que o bicho pega, se for um usuário com amplos poderes fecha muito bem o servidor dos relatórios ou usa um usuário especifico para isso.

7) Configurar os servidores

Com um servidor configurado já podemos adicionar esse servidor no serverslist.txt.

8) Executar teste

Pronto, agora esta tudo configurado e vamos testar se esta funcionando
./pgrelatorios.sh servidor SERVER
A execução irá fazer com que ele acesse o servidor remoto, copie os logs para o servidor local e gere o relatório apenas do servidor (parâmetro SERVER).

9) Analisar o log

Após o término da execução, aconselho dar uma olhada no arquivo de log /var/log/postgresql/pgrelatorios-*.log
Se ele apresentar no final "LOG: Ok, generating global index to access incremental reports..."
esta tudo certo e voce pode verifcar a página.

10) Verificar a pagina web

No browser: localhost (ou o ip do servidor do PgRelatórios)
Ira apresentar a imagem 1.

11) Verificar relatório

Clicar ao lado do nome do servidor em "Relatório do servidor"
Irá apresentar a imagem 2.

12) Escolher um dia

Irá apresentar a imagem 3.

13) Gerando o relatório para todos os databases

Funcionando tudo certo, já pode executar o pgrelatorios.sh sem nenhum parâmetro que ele irá popular os relatórios por database.

14) Automatizar - a hora do cron

Adicionar ao crontab a geração diária dos relatórios, no exemplo todo os dias as 07h00 ele irá executar o pgreltorios.sh utilizando o 'usuario'.
echo "00 07 * * * usuario /caminho/do/pgrelatorios.sh" >> /etc/crontab
Dependendo da distribuição do linux pode ser necessário um restart no serviço do cron.


Pronto, esta configurado o PgRelatórios e agora todos os dias você terá os relatórios atualizados de todos os seus servidores.


Nenhum comentário:

Postar um comentário