Arquitetura de Monitoramento
A implementação de um sistema de monitoramento robusto para bancos de dados PostgreSQL envolve a integração de três componentes principais: o postgres_exporter para coleta de métricas, o Prometheus para armazenamento e consulta de séries temporais, e o Grafana para visualização gráfica. Adicionalmente, o Alertmanager pode ser configurado para gerenciar notificações de incidentes críticos.
- Preparação do Banco de Dados PostgreSQL
Para garantir a segurança, é recomendável criar um usuário dedicado com permissões restritas apenas à leitura das views de estatísticas do sistema, evitando o uso do superusuário postgres.
-- Criação do usuário de monitoramento
CREATE USER pg_metrics_user WITH PASSWORD 'Str0ng!Pass#2023';
-- Concessão de acesso ao banco de dados e schema
GRANT CONNECT ON DATABASE postgres TO pg_metrics_user;
GRANT USAGE ON SCHEMA public TO pg_metrics_user;
-- Concessão de permissões de leitura nas views de estatísticas
GRANT SELECT ON
pg_stat_activity,
pg_stat_database,
pg_stat_user_tables,
pg_stat_user_indexes,
pg_statio_user_tables,
pg_statio_user_indexes,
pg_stat_bgwriter,
pg_stat_wal_receiver
TO pg_metrics_user;
- Instalação e Configuração do postgres_exporter
O postgres_exporter atua como uma ponte, traduzindo as métricas internas do PostgreSQL para o formato cmopreendido pelo Prometheus.
Download e Instalação
# Definir variáveis de ambiente para a instalação
EXPORTER_VERSION="0.15.0"
INSTALL_DIR="/opt/exporters/postgres"
# Download e extração do binário
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v${EXPORTER_VERSION}/postgres_exporter-${EXPORTER_VERSION}.linux-amd64.tar.gz
tar -xvf postgres_exporter-${EXPORTER_VERSION}.linux-amd64.tar.gz
# Configuração de diretórios e permissões
mkdir -p ${INSTALL_DIR}
mv postgres_exporter-${EXPORTER_VERSION}.linux-amd64/postgres_exporter ${INSTALL_DIR}/
# Criação de usuário de sistema sem shell interativo
useradd -r -s /sbin/nologin prometheus_exporter
chown -R prometheus_exporter:prometheus_exporter ${INSTALL_DIR}
Configuração do Serviço Systemd
Crie o arquivo de unidade em /etc/systemd/system/pg-exporter.service. A string de conexão deve ser definida através da variável de ambiente DATA_SOURCE_NAME.
[Unit]
Description=Prometheus PostgreSQL Exporter
After=network.target
[Service]
User=prometheus_exporter
Group=prometheus_exporter
Environment="DATA_SOURCE_NAME=postgresql://pg_metrics_user:Str0ng!Pass#2023@192.168.1.50:5432/postgres?sslmode=disable"
ExecStart=/opt/exporters/postgres/postgres_exporter --web.listen-address=:9187
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Após criar o arquivo, recarregue o daemon e inicie o serviço:
systemctl daemon-reload
systemctl enable --now pg-exporter.service
- Configuração do Prometheus e Regras de Alerta
No servidor onde o Prometheus está instalado, é necessário registrar o novo alvo (target) e definir as regras de alerta para condições anômalas.
Definição de Targets
Para manter o arquivo principal limpo, utilize a descoberta de serviços baseada em arquivos. Adicione a seguinte configuração ao prometheus.yml:
scrape_configs:
- job_name: 'postgres_metrics'
scrape_interval: 15s
file_sd_configs:
- files:
- '/etc/prometheus/targets/pg_nodes.json'
Crie o arquivo /etc/prometheus/targets/pg_nodes.json com os detalhes da instância:
[
{
"targets": ["192.168.1.50:9187"],
"labels": {
"env": "production",
"db_role": "primary",
"host_alias": "pg-node-01"
}
}
]
Regras de Alerta (Alertmanager)
Crie o arquivo pg_alerts.yml no diretório de regras do Prometheus para monitorar indisponibilidade, saturação de conexões, atraso de replicação, deadlocks e transações longas.
groups:
- name: postgresql_critical_alerts
rules:
- alert: PostgresInstanceDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Instância PostgreSQL indisponível"
description: "O banco de dados {{ $labels.host_alias }} não está respondendo às métricas."
- alert: PostgresHighConnectionUsage
expr: (sum(pg_stat_activity_count) by (instance) / sum(pg_settings_max_connections) by (instance)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Uso elevado de conexões no PostgreSQL"
description: "A instância {{ $labels.host_alias }} está utilizando {{ $value | printf \"%.1f\" }}% do limite máximo de conexões."
- alert: PostgresReplicationLagHigh
expr: pg_replication_lag_seconds > 60
for: 2m
labels:
severity: critical
annotations:
summary: "Atraso de replicação crítico"
description: "O atraso de replicação na instância {{ $labels.host_alias }} ultrapassou 60 segundos (atual: {{ $value }}s)."
- alert: PostgresDeadlocksDetected
expr: increase(pg_stat_database_deadlocks[5m]) > 0
for: 1m
labels:
severity: warning
annotations:
summary: "Deadlocks detectados no PostgreSQL"
description: "Foram registrados deadlocks no banco de dados {{ $labels.host_alias }} nos últimos 5 minutos."
- alert: PostgresLongRunningQuery
expr: pg_stat_activity_max_tx_duration > 3600
for: 5m
labels:
severity: warning
annotations:
summary: "Transação de longa duração detectada"
description: "Existe uma transação ativa há mais de 1 hora na instância {{ $labels.host_alias }}."
Validação e Recarga
Verifique a sintaxe dos arquivos de configuração antes de aplicar as alterações:
promtool check config /etc/prometheus/prometheus.yml
promtool check rules /etc/prometheus/rules/pg_alerts.yml
Se não houver erros, recarregue o Prometheus via API HTTP (certifique-se de que o parâmetro --web.enable-lifecycle esteja ativo no serviço):
curl -X POST http://localhost:9090/-/reload
- Visualização no Grafana
Com os dados sendo coletados corretamente, o próximo passo é configurar a interface visual.
- Acesse o painel do Grafana e navegue até Dashboards > New > Import.
- Utilize o ID do dashboard 9628 (PostgreSQL Database) disponível na galeria oficial do Grafana, ou faça o upload do arquivo JSON correspondente.
- Selecione o datasource do Prometheus configurado previamente.
- Nos filtros do dashboard, selecione a instância correspondente ao
host_aliasou IP configurado nos labels do Prometheus para visualizar as métricas de desempenho, uso de cache, operações de I/O e estatísticas de replicação.