Monitoramento e Visualização de Bancos de Dados PostgreSQL com Prometheus e Grafana

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.

  1. 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;

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

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

  1. Visualização no Grafana

Com os dados sendo coletados corretamente, o próximo passo é configurar a interface visual.

  1. Acesse o painel do Grafana e navegue até Dashboards > New > Import.
  2. Utilize o ID do dashboard 9628 (PostgreSQL Database) disponível na galeria oficial do Grafana, ou faça o upload do arquivo JSON correspondente.
  3. Selecione o datasource do Prometheus configurado previamente.
  4. Nos filtros do dashboard, selecione a instância correspondente ao host_alias ou 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.

Tags: Prometheus Grafana postgresql postgres_exporter alertmanager

Publicado em 6-8 16:19 por Thomas