Плагин PostgreSQL
Мониторинг серверов баз данных PostgreSQL с подробными метриками, отслеживающими соединения, транзакции, блокировки, производительность кэша, производительность запросов и лаг репликации.
Обзор
Плагин PostgreSQL собирает детальные метрики с серверов PostgreSQL, включая:
- Статистика соединений - Всего соединений, активные/простаивающие состояния, лимиты соединений
- Статистика транзакций - Коммиты, откаты, здоровье транзакций
- Производительность кэша - Коэффициент попаданий в буферный кэш
- Статистика блокировок - Всего блокировок, deadlock'и
- Производительность запросов - Число медленных запросов (запросы > 5 секунд)
- Репликация - Лаг репликации для standby-серверов
- Детали по базам данных - Статистика по каждой базе данных, включая размер, соединения и операции с кортежами
Требования
Версия PostgreSQL
- Минимум: PostgreSQL 10
- Рекомендуется: PostgreSQL 12 или новее
- Протестировано с: PostgreSQL 10, 11, 12, 13, 14, 15, 16
Зависимости Python
pip install psycopg2-binary>=2.9.0
Устанавливается автоматически при использовании PLUGINS=postgresql во время установки агента.
Сетевой доступ
Агент должен иметь возможность подключиться к PostgreSQL:
# Test connectivity
psql -h localhost -U monitor -d postgres -c "SELECT 1"
Конфигурация
Базовая конфигурация
plugins:
postgresql:
enabled: true
host: localhost
port: 5432
user: monitor
password: 'monitoring-password'
database: postgres
С SSL/TLS
plugins:
postgresql:
enabled: true
host: postgres.example.com
port: 5432
user: monitor
password: 'secure-password'
database: postgres
ssl_mode: require # Options: disable, require, verify-ca, verify-full
Удалённый сервер PostgreSQL
plugins:
postgresql:
enabled: true
host: postgres-server.example.com
port: 5432
user: monitor
password: 'secure-password'
database: postgres
Все параметры конфигурации
plugins:
postgresql:
enabled: true # Enable/disable plugin
host: localhost # PostgreSQL hostname or IP
port: 5432 # PostgreSQL port (default: 5432)
user: monitor # PostgreSQL username
password: '' # PostgreSQL password
database: postgres # Database to connect to
ssl_mode: disable # SSL mode: disable, allow, prefer, require, verify-ca, verify-full
connect_timeout: 10 # Connection timeout in seconds
application_name: statusradar-agent # Application name in pg_stat_activity
Переменные окружения
Конфигурацию можно переопределить переменными окружения:
export POSTGRESQL_HOST="localhost"
export POSTGRESQL_PORT="5432"
export POSTGRESQL_USER="monitor"
export POSTGRESQL_PASSWORD="secret"
export POSTGRESQL_DATABASE="postgres"
export POSTGRESQL_SSL_MODE="disable"
Настройка PostgreSQL
Создание пользователя мониторинга
Для PostgreSQL 10+:
CREATE USER monitor WITH PASSWORD 'your-secure-password';
GRANT pg_monitor TO monitor;
Выдача доступа к конкретной базе данных:
\c postgres
GRANT CONNECT ON DATABASE postgres TO monitor;
Необходимые привилегии
Рекомендуется: роль pg_monitor
Роль pg_monitor предоставляет доступ только для чтения ко всем представлениям мониторинга:
GRANT pg_monitor TO monitor;
Эта роль включает:
pg_read_all_stats- Чтение всех представлений pgstat*pg_read_all_settings- Чтение всех параметров конфигурацииpg_stat_scan_tables- Чтение статистики таблиц и индексов
Ручная выдача прав (если pg_monitor недоступна):
GRANT pg_read_all_stats TO monitor;
GRANT pg_read_all_settings TO monitor;
Настройка pg_hba.conf
Разрешите пользователю мониторинга подключаться:
Для локальных соединений:
# TYPE DATABASE USER ADDRESS METHOD
host postgres monitor 127.0.0.1/32 md5
host postgres monitor ::1/128 md5
Для удалённых соединений:
# TYPE DATABASE USER ADDRESS METHOD
host postgres monitor 10.0.0.0/8 md5
Перезагрузите PostgreSQL:
sudo systemctl reload postgresql
Проверка прав пользователя
-- Check user roles
\du monitor
-- Check database access
SELECT datname FROM pg_database WHERE has_database_privilege('monitor', datname, 'CONNECT');
-- Test stats access
SELECT * FROM pg_stat_database LIMIT 1;
Собираемые метрики
Статистика соединений
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
connections_total |
Всего активных соединений (все базы данных) | Количество | Gauge |
connections_active |
Соединения в состоянии active | Количество | Gauge |
connections_idle |
Соединения в состоянии idle | Количество | Gauge |
connections_idle_in_transaction |
Соединения idle in transaction | Количество | Gauge |
max_connections |
Лимит максимального числа соединений | Количество | Gauge |
Утилизация соединений:
utilization = connections_total / max_connections
Тревожные признаки:
connections_idle_in_transaction > 10- Утечка соединений или длинные транзакцииutilization > 0.8- Нужно увеличить max_connections
Статистика транзакций
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
transactions_commits |
Всего закоммиченных транзакций (все базы данных) | Количество | Counter |
transactions_rollbacks |
Всего откаченных транзакций (все базы данных) | Количество | Counter |
Здоровье транзакций:
commit_ratio = transactions_commits / (transactions_commits + transactions_rollbacks)
Здоровое значение: > 0.95 (95%)
Производительность кэша
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
cache_hit_rate |
Процент попаданий в буферный кэш | Проценты | Gauge |
Расчёт:
cache_hit_rate = 100.0 * buffer_hits / (disk_reads + buffer_hits)
Здоровое значение: > 99%
Статистика блокировок
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
locks_total |
Всего удерживаемых блокировок (все типы) | Количество | Gauge |
deadlocks_total |
Всего deadlock'ов (все базы данных) | Количество | Counter |
Мониторинг:
- Внезапный скачок блокировок = конкуренция за блокировки
deadlocks_total > 0= исследуйте паттерны запросов
Производительность запросов
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
slow_queries_count |
Активные запросы, выполняющиеся > 5 секунд | Количество | Gauge |
Тревожные признаки:
slow_queries_count > 10- Нужна оптимизация запросов- Внезапный скачок - проверьте долго выполняющиеся запросы
Статистика репликации (только standby)
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
replication_lag_seconds |
Отставание от primary в секундах | Секунды | Gauge |
Примечание: Доступно только на standby-серверах, работающих в режиме восстановления.
Порог предупреждения:
replication_lag_seconds > 60- Репликация отстаёт
Информация о сервере
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
version |
Строка версии PostgreSQL | Строка | Info |
Детали по базам данных (массив)
| Метрика | Описание | Единица | Тип |
|---|---|---|---|
databases |
Массив статистики по каждой базе данных | Массив | Info |
Каждый объект базы данных содержит:
datname- Имя базы данныхconnections- Активные соединенияcommits- Закоммиченные транзакцииrollbacks- Откаченные транзакцииdisk_reads- Блоки, прочитанные с дискаbuffer_hits- Блоки, прочитанные из кэшаtuples_returned- Строки, возвращённые запросамиtuples_fetched- Строки, извлечённые запросамиtuples_inserted- Вставленные строкиtuples_updated- Обновлённые строкиtuples_deleted- Удалённые строкиconflicts- Конфликты запросов (только standby)deadlocks- Количество deadlock'овdatabase_size_bytes- Размер базы данных в байтах
Примечание: Ограничено топ-10 базами данных по числу соединений, исключая шаблонные базы данных.
Метрики дашборда
Дашборд StatusRadar отображает:
Карточка обзора
- Status - Сервер PostgreSQL работает/не работает
- Version - Версия PostgreSQL
- Connections - Всего активных соединений
- Cache Hit Rate - Процент попаданий в буферный кэш
График соединений
- Всего соединений (
connections_total) - Активные соединения (
connections_active) - Простаивающие соединения (
connections_idle) - Idle in transaction (
connections_idle_in_transaction) - Лимит максимальных соединений (
max_connections)
График транзакций
- Всего коммитов (
transactions_commits) - Всего откатов (
transactions_rollbacks) - Процент commit ratio
Производительность кэша
- Процент попаданий в кэш (
cache_hit_rate)
Статистика блокировок
- Всего блокировок (
locks_total) - Всего deadlock'ов (
deadlocks_total)
Производительность запросов
- Число медленных запросов (
slow_queries_count)
Статус репликации (только standby)
- Лаг репликации в секундах (
replication_lag_seconds)
Детали по базам данных
- Статистика по каждой базе данных из массива
databases - Размеры баз данных
- Число транзакций по каждой базе данных
- Операции с кортежами по каждой базе данных
Установка
Быстрая установка
PLUGINS='postgresql' \
POSTGRESQL_USER='monitor' \
POSTGRESQL_PASSWORD='your-password' \
TOKEN='your-agent-token' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"
Установка на существующий агент
-
Создайте пользователя PostgreSQL:
CREATE USER monitor WITH PASSWORD 'secure-password'; GRANT pg_monitor TO monitor; -
Настройте pg_hba.conf:
sudo nano /etc/postgresql/15/main/pg_hba.confДобавьте:
host postgres monitor 127.0.0.1/32 md5Перезагрузите:
sudo systemctl reload postgresql -
Установите зависимость Python:
cd /opt/statusradar source venv/bin/activate # If using venv pip install psycopg2-binary -
Включите плагин в конфигурации:
sudo nano /opt/statusradar/config/agent.yamlДобавьте:
plugins: postgresql: enabled: true host: localhost port: 5432 user: monitor password: 'secure-password' database: postgres -
Перезапустите агент:
sudo systemctl restart statusradar-agent -
Проверьте:
sudo journalctl -u statusradar-agent -n 50 --no-pager | grep postgresqlОжидаемо:
INFO: Plugin postgresql: Metrics collected successfully
Тестирование
Ручной тест плагина
cd /opt/statusradar
python3 plugins/postgresql_plugin.py
Ожидаемый вывод:
Plugin: postgresql
Enabled: True
Available: True
Collecting metrics...
{
"connections_total": 15,
"transactions_commits": 45000,
"transactions_rollbacks": 100,
"deadlocks_total": 5,
"cache_hit_rate": 99.5,
"connections_active": 12,
"connections_idle": 3,
"connections_idle_in_transaction": 0,
"max_connections": 100,
"locks_total": 25,
"slow_queries_count": 2,
"version": "PostgreSQL 15.4 on x86_64-pc-linux-gnu...",
"databases": [
{
"datname": "postgres",
"connections": 10,
"commits": 30000,
"rollbacks": 50,
"disk_reads": 1000,
"buffer_hits": 300000,
"tuples_returned": 500000,
"tuples_fetched": 400000,
"tuples_inserted": 5000,
"tuples_updated": 3000,
"tuples_deleted": 100,
"conflicts": 0,
"deadlocks": 2,
"database_size_bytes": 104857600
}
]
}
Тест подключения к PostgreSQL
# Basic connection test
psql -h localhost -U monitor -d postgres -c "SELECT 1"
# Test with password from environment
PGPASSWORD='your-password' psql -h localhost -U monitor -d postgres -c "SELECT 1"
# Remote server
psql -h postgres.example.com -U monitor -d postgres -c "SELECT 1"
# Check permissions
psql -h localhost -U monitor -d postgres -c "SELECT * FROM pg_stat_database LIMIT 1"
Тест запросов статистики
# Test database stats
psql -U monitor -d postgres -c "SELECT * FROM pg_stat_database WHERE datname = 'postgres'"
# Test connection stats
psql -U monitor -d postgres -c "SELECT state, count(*) FROM pg_stat_activity GROUP BY state"
# Test lock stats
psql -U monitor -d postgres -c "SELECT mode, count(*) FROM pg_locks GROUP BY mode"
# Test replication stats (primary)
psql -U monitor -d postgres -c "SELECT * FROM pg_stat_replication"
Устранение неполадок
Плагин не собирает метрики
Проверка 1: Запущен ли PostgreSQL?
sudo systemctl status postgresql
Проверка 2: Может ли агент подключиться?
psql -h localhost -U monitor -d postgres -c "SELECT 1"
Проверка 3: Верны ли учётные данные?
# Check config
cat /opt/statusradar/config/agent.yaml | grep -A10 postgresql
Проверка 4: Установлен ли Python-пакет?
python3 -c "import psycopg2; print(psycopg2.__version__)"
Проверка 5: Проверьте логи агента
sudo journalctl -u statusradar-agent -n 100 --no-pager | grep postgresql
Распространённые ошибки
"Connection refused"
Ошибка:
ERROR: Plugin postgresql: could not connect to server: Connection refused
Причины:
- PostgreSQL не запущен
- Неверный host/port
- PostgreSQL не слушает на ожидаемом интерфейсе
Решение:
# Check if PostgreSQL is running
sudo systemctl status postgresql
# Check PostgreSQL port
sudo netstat -tlnp | grep 5432
# Check listen_addresses
sudo -u postgres psql -c "SHOW listen_addresses"
# If listen_addresses = 'localhost', can only connect from localhost
# To allow remote connections, edit postgresql.conf:
# listen_addresses = '*'
"Password authentication failed"
Ошибка:
ERROR: Plugin postgresql: password authentication failed for user "monitor"
Причины:
- Неверный пароль в конфигурации
- Пользователь не существует
- pg_hba.conf не разрешает соединение
Решение:
-- Check if user exists
\du monitor
-- Reset password
ALTER USER monitor WITH PASSWORD 'new-secure-password';
Обновите pg_hba.conf:
host postgres monitor 127.0.0.1/32 md5
Перезагрузите:
sudo systemctl reload postgresql
"Permission denied for table"
Ошибка:
ERROR: Plugin postgresql: permission denied for table pg_stat_database
Причина: У пользователя нет роли pg_monitor или pg_read_all_stats
Решение:
GRANT pg_monitor TO monitor;
-- or
GRANT pg_read_all_stats TO monitor;
"No module named 'psycopg2'"
Ошибка:
ERROR: No module named 'psycopg2'
Решение:
pip install psycopg2-binary
# Or if using venv:
cd /opt/statusradar && source venv/bin/activate && pip install psycopg2-binary
"SSL connection has been closed unexpectedly"
Ошибка:
ERROR: SSL connection has been closed unexpectedly
Причина: Несоответствие режима SSL
Решение:
Установите подходящий режим SSL:
plugins:
postgresql:
ssl_mode: disable # or require, verify-ca, verify-full
Влияние на производительность
На PostgreSQL
Незначительное влияние:
- Плагин опрашивает представления pgstat* (статистика в памяти)
- Без сканирования таблиц, без блокировок пользовательских таблиц
- Запросы выполняются за < 10 мс
- Операции только для чтения
Бенчмарк:
- TPS PostgreSQL с мониторингом: 5,000+ TPS
- TPS PostgreSQL без мониторинга: 5,000+ TPS
- Накладные расходы: < 0.01%
На агент
Использование ресурсов:
- Память: +15 MB
- CPU: +3% во время сбора (0.2-0.5 секунды)
- Сеть: +2 KB за сбор
Сценарии использования
1. Мониторинг транзакций
Отслеживайте:
- Всего коммитов (
transactions_commits) - Всего откатов (
transactions_rollbacks) - Commit ratio
Настройте оповещения на:
- Commit ratio < 95%
- Внезапный скачок откатов
Формула:
commit_ratio = transactions_commits / (transactions_commits + transactions_rollbacks)
2. Управление пулом соединений
Отслеживайте:
- Всего соединений (
connections_total) - Активные соединения (
connections_active) - Простаивающие соединения (
connections_idle) - Idle in transaction (
connections_idle_in_transaction) - Лимит максимальных соединений (
max_connections)
Настройте оповещения на:
connections_total > max_connections * 0.8- Приближение к лимитуconnections_idle_in_transaction > 10- Утечки соединенийconnections_total >= max_connections- Нет свободных слотов
3. Оптимизация коэффициента попаданий в кэш
Отслеживайте:
- Hit rate кэша (
cache_hit_rate)
Настройте оповещения на:
cache_hit_rate < 99%- Нужно увеличить shared_buffers
Здоровое значение: > 99%
4. Анализ конкуренции за блокировки
Отслеживайте:
- Всего блокировок (
locks_total) - Всего deadlock'ов (
deadlocks_total)
Настройте оповещения на:
- Рост
deadlocks_total- Проблемы с паттернами запросов - Внезапный скачок
locks_total- Конкуренция за блокировки
5. Мониторинг производительности запросов
Отслеживайте:
- Число медленных запросов (
slow_queries_count)
Настройте оповещения на:
slow_queries_count > 10- Много медленных запросов- Устойчиво высокое число медленных запросов - Нужна оптимизация
Примечание: Медленными считаются запросы, выполняющиеся > 5 секунд.
6. Мониторинг лага репликации (standby-серверы)
Отслеживайте:
- Лаг репликации (
replication_lag_seconds)
Настройте оповещения на:
replication_lag_seconds > 60- Отставание от primaryreplication_lag_seconds > 300- Критический лаг
Примечание: Доступно только на standby-серверах в режиме восстановления.
Лучшие практики
1. Используйте роль pg_monitor
Рекомендуется:
CREATE USER monitor WITH PASSWORD 'secure-password';
GRANT pg_monitor TO monitor;
Это предоставляет все необходимые права только для чтения для мониторинга.
2. Следите за ключевыми показателями производительности
Важнейшие метрики:
- Hit rate кэша (
cache_hit_rate) - Должен быть > 99% - Число соединений (
connections_total) - Должно быть < 80% отmax_connections - Idle in transaction (
connections_idle_in_transaction) - Должно быть близко к 0 - Медленные запросы (
slow_queries_count) - Должно быть низким - Лаг репликации (
replication_lag_seconds) - Должен быть < 60 секунд для standby
3. Настройте подходящие оповещения
Оповещения по соединениям:
connections_total > max_connections * 0.8
connections_idle_in_transaction > 10
connections_total >= max_connections
Оповещения по производительности:
cache_hit_rate < 99
deadlocks_total increasing
slow_queries_count > 10
replication_lag_seconds > 60 (standbys only)
4. Оптимизируйте Shared Buffers
Практическое правило:
- shared_buffers = 25% ОЗУ (для выделенного сервера БД)
- Следите за
cache_hit_rateдля проверки эффективности - Корректируйте в зависимости от нагрузки
- Цель:
cache_hit_rate> 99%
5. Защитите конфигурацию
# Protect agent config
chmod 600 /opt/statusradar/config/agent.yaml
# Use strong password
openssl rand -base64 32
Расширенная конфигурация
Подключение через Unix-сокет
plugins:
postgresql:
enabled: true
unix_socket: '/var/run/postgresql'
user: monitor
password: 'password'
database: postgres
Несколько баз данных
Сейчас мониторит одну базу данных на экземпляр агента. Чтобы мониторить несколько баз данных:
Вариант 1: Опрашивайте все базы данных через pg_stat_database
- Плагин автоматически собирает статистику по всем базам данных
- Дашборд показывает агрегированные метрики
Вариант 2: Несколько агентов
- Установите отдельный агент для каждой критичной базы данных
- Обеспечивает изолированный мониторинг
SSL с клиентскими сертификатами
plugins:
postgresql:
enabled: true
host: postgres.example.com
port: 5432
user: monitor
database: postgres
ssl_mode: verify-full
ssl_cert: '/path/to/client-cert.pem'
ssl_key: '/path/to/client-key.pem'
ssl_ca: '/path/to/ca-cert.pem'
Примеры конфигураций
Сервер разработки
plugins:
postgresql:
enabled: true
host: localhost
port: 5432
user: monitor
password: 'dev-password'
database: postgres
Продакшен-primary
plugins:
postgresql:
enabled: true
host: localhost
port: 5432
user: monitor
password: 'strong-production-password'
database: postgres
connect_timeout: 10
Продакшен-standby
plugins:
postgresql:
enabled: true
host: localhost
port: 5432
user: monitor
password: 'strong-production-password'
database: postgres
# Plugin automatically detects standby status
Удалённый PostgreSQL (SSL)
plugins:
postgresql:
enabled: true
host: postgres-prod.example.com
port: 5432
user: monitor
password: 'secure-password'
database: postgres
ssl_mode: require
connect_timeout: 15
Дальнейшие шаги
- Обзор
- Требования
- Версия PostgreSQL
- Зависимости Python
- Сетевой доступ
- Конфигурация
- Базовая конфигурация
- С SSL/TLS
- Удалённый сервер PostgreSQL
- Все параметры конфигурации
- Переменные окружения
- Настройка PostgreSQL
- Создание пользователя мониторинга
- Необходимые привилегии
- Настройка pg_hba.conf
- Проверка прав пользователя
- Собираемые метрики
- Статистика соединений
- Статистика транзакций
- Производительность кэша
- Статистика блокировок
- Производительность запросов
- Статистика репликации (только standby)
- Информация о сервере
- Детали по базам данных (массив)
- Метрики дашборда
- Карточка обзора
- График соединений
- График транзакций
- Производительность кэша
- Статистика блокировок
- Производительность запросов
- Статус репликации (только standby)
- Детали по базам данных
- Установка
- Быстрая установка
- Установка на существующий агент
- Тестирование
- Ручной тест плагина
- Тест подключения к PostgreSQL
- Тест запросов статистики
- Устранение неполадок
- Плагин не собирает метрики
- Распространённые ошибки
- Влияние на производительность
- На PostgreSQL
- На агент
- Сценарии использования
- 1. Мониторинг транзакций
- 2. Управление пулом соединений
- 3. Оптимизация коэффициента попаданий в кэш
- 4. Анализ конкуренции за блокировки
- 5. Мониторинг производительности запросов
- 6. Мониторинг лага репликации (standby-серверы)
- Лучшие практики
- 1. Используйте роль pg_monitor
- 2. Следите за ключевыми показателями производительности
- 3. Настройте подходящие оповещения
- 4. Оптимизируйте Shared Buffers
- 5. Защитите конфигурацию
- Расширенная конфигурация
- Подключение через Unix-сокет
- Несколько баз данных
- SSL с клиентскими сертификатами
- Примеры конфигураций
- Сервер разработки
- Продакшен-primary
- Продакшен-standby
- Удалённый PostgreSQL (SSL)
- Дальнейшие шаги