Настройка мониторинга PostgreSQL: postgres_exporter и системные представления pg_stat
- Отсутствие прозрачности в утилизации пула соединений, транзакционной нагрузке и долгих блокировках.
- Сложности с локализацией ресурсоемких SQL-запросов и скрытого разрастания WAL-журналов.
- Необходимость интеграции метрик PostgreSQL в стек Prometheus / Grafana.
1. Включение сбора статистики в postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = top
pg_stat_statements.max = 10000
track_io_timing = on
track_activity_query_size = 2048Перезапустите PostgreSQL и создайте расширение:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;2. Создание пользователя для мониторинга с минимальными привилегиями
CREATE USER postgres_exporter WITH PASSWORD 'StrongSecurePass123!';
GRANT pg_monitor TO postgres_exporter;3. Установка и настройка postgres_exporter как systemd службы
Создайте файл /etc/systemd/system/postgres_exporter.service:
[Unit]
Description=Prometheus PostgreSQL Exporter
After=network.target
[Service]
User=postgres_exporter
Environment=DATA_SOURCE_NAME="postgresql://postgres_exporter:StrongSecurePass123!@127.0.0.1:5432/postgres?sslmode=disable"
ExecStart=/usr/local/bin/postgres_exporter --auto-discover-databases
Restart=always
[Install]
WantedBy=multi-user.target4. Запуск и проверка сбора метрик
systemctl daemon-reload && systemctl enable --now postgres_exporter
curl -s http://localhost:9187/metrics | grep pg_stat_database Частые вопросы (FAQ)
Зачем включать параметр track_io_timing = on?
Он позволяет PostgreSQL собирать точное время чтения и записи страниц на диск (read/write I/O time), что критично для выявления нехватки оперативной памяти и медленных накопителей в pg_stat_database и pg_stat_statements.
Какие представления pg_stat являются наиболее важными для мониторинга?
pg_stat_activity (текущие сессии и блокировки), pg_stat_database (транзакции, rollback, deadlocks), pg_stat_user_tables (live/dead tuples, vacuum) и pg_stat_statements (анализ тяжелых запросов).