PgBouncer monitoring with Okmeter
Okmeter собирает данные обо всех соединениях и SQL запросах проходящих через PgBouncer. Это комплексное решение, с которым вы всегда будете в курсе текущей производительности работы вашего проекта. Детализация Okmeter позволит вам быстро выяснять причины любых проблем работы приложений со стеком PgBouncer/Postgresql.
Okmeter поможет вам всегда знать, что происходит с PgBouncer.
Окметр автоматически снимает детальную статистику про следующие операционные аспекты PgBouncer
Авто-обнаружение PgBouncer
Агент okmeter умеет автоматически обнаруживать и мониторить PgBouncer. По работающим на сервере процессам агент находит все запущенные экземпляры PgBouncer и сразу начинает снимать с каждого подробные метрики.
Так как в кластере и даже на одном сервере может работать несколько экземпляров PgBouncer, для идентификации экземпляра у всех метрики помимо метки source_hostname, по которой можно определить с какого сервера собраны показатели, есть ещё и метка instance, которая определяет конкретный инстанс PgBouncer на сервере.
Если PgBouncer запущен просто как сервис, вне контейнера, то в эту метку instance проставляется IP:PORT соответствующего listen сокета инстанса. А если PgBouncer запущен в docker, то метка instance будет содержать имя этого контейнера.
Мониторинг SQL запросов и транзакций
Основная задача PgBouncer — проксирование клиентских соединений для исполнения SQL запросов приложений в Postgres.
Проблемы с базой дынных правильно диагностировать по следующим симптомам:
- время выполнения запросов существенно и неожиданно увеличилось или уменьшилось;
- количество запросов / транзакций резко и неожиданно изменилось
Мониторинговый агент okmeter собирает метрики PgBouncer периодически исполняя команду SHOW STATS;
По каждому инстансу PgBouncer у вас будет дашборд с графиками по следующим метрикам:
- pgbouncer.total_requests {database: "D", instance: “Y”, source_hostname: “Z”}
-
Суммарное количество SQL запросов запроксированных в конкретную базу данных D.
По этой метрике удобно оценивать, есть ли аномалии в обычном профиле нагрузки: - pgbouncer.total_query_time {database: "D", instance: “Y”, source_hostname: “Z”}
-
Суммарное время активного выполнения PgBouncer'ом запросов в Postgres.
Эта метрика позволяет оценить среднее время выполнения запросов, как total_query_time / total_requests, что позволяет наглядно видеть изменения в том, на сколько быстро Postgres обрабатывает эти запросы: - pgbouncer.total_xact {database: "D", instance: “Y”, source_hostname: “Z”}
-
Суммарное количество транзакций запроксированных в конкретную базу данных D.
Можно построить график того, сколько в среднем на одну транзакцию приходится SQL запросов: поделив количество запросов, на количество транзакций —total_requests / total_xact
. По такому графику легко видеть аномалии в профиле запросов в транзакциях: - pgbouncer.total_xact_time {database: "D", instance: “Y”, source_hostname: “Z”}
-
Суммарное время, которое PgBouncer провёл подключённым к базе D в Postgresql, или выполняя запросы, или ничего не делая и находясь в состоянии idle in transaction.
Эта метрика, совместно с total_query_time, позволяют оценить, какой процент времени соединения от PgBouncer'а находятся в Postgres'е в состоянии "ничегонеделанья". Это можно получить как1 - total_query_time / total_xact_time
: - pgbouncer.total_wait_time {database: "D", instance: “Y”, source_hostname: “Z”}
-
Суммарное время, которое клиенты ожидали подключения к базе D в Postgresql.
По этой метрике легко понять, что причина провала в производительности базы с точки зрения клиентов в том, что пула соединений от PgBouncer'а к Postgres базе перестало хватать: - pgbouncer.total_received {database: "D", instance: “Y”, source_hostname: “Z”}
- pgbouncer.total_sent {database: "D", instance: “Y”, source_hostname: “Z”}
- Суммарное количество байт, которое PgBouncer получил и отправил соответственно проксируя клиентские запросы.
Мониторинг серверных соединений PgBouncer
Агент okmeter собирает server connections метрики периодически исполняя команду SHOW POOLS;
По каждому инстансу PgBouncer у вас будет дашборд с графиками по следующим метрикам:
- pgbouncer.server_connections.count {database: "D", user: "U", state: "S", instance: “Y”, source_hostname: “Z”}
-
Текущее количество открытых серверных соединений (т.е. от PgBouncer к Postgresql) в разных состояниях в соответствии с полями
SHOW POOLS
— sv_active, sv_idle, sv_used, sv_tested и sv_login.- active — серверное соединение выделено и сцеплено (linked) с клиентским соединением. И в этом соединении (в зависимости от pool_mode) или выполняется транзакция, или запрос, или возможно ничего не выполняется (если pool_mode = session).
- idle — соединение в данный момент не используется никаким клиентом и готово к немедленному использованию.
- login — соединение находится в процессе установки и авторизации.
- used — не означает, что соединение используется, а только лишь, что соединение было в состоянии idle больше чем server_check_delay (по умолчанию 30 секунд), и требуется проверка его "живости" с помощью server_check_query.
- tested — соединение находится в процессе вызова server_reset_query после использования предыдущим клиентом или вызова server_check_query для проверки "живости" соединения из-за того, что оно не использовалось больше чем server_check_delay.
Мониторинг клиентских соединений PgBouncer
Агент okmeter собирает client connections метрики периодически выполняя команду SHOW CLIENTS;
По каждому инстансу PgBouncer у вас будет дашборд с графиками по следующим метрикам:
- pgbouncer.clients.count {database: "D", user: "U", client_address: "A", state: "S", instance: “Y”, source_hostname: “Z”}
-
Показывает количество всех текущих клиентских соединений с разных IP адресов во всех состояниях.
По этой метрике можно увидеть не только к каким базам, какие пользователи открыли много соединений, но и с каких IP адресов. Что позволяет диагностировать ненормативное поведение некоторых из них, как, например, тут: Например, мы можем увидеть по графику среднего времени запросов, что ухудшилась производительность базы: В данном случае было возросшее количество клиентских соединений. Окметр дает картину распределения таких соединений по состояниям:- active — клиентское соединение установлено.
- active-link — клиентское соединение слинковано с серверным, т.е. клиенту выделено серверное соединение в данный момент, и клиент, возможно, выполняет запросы в рамках него.
- waiting — клиентское соединение ожидает выделения / линковки с серверным соединением, т.к. клиент собирается или начать транзакцию или выполнить SQL запрос.
А по графикам тех же метрик, легко выявить к какой именно базе данных и какие именно клиенты вынуждены были ожидать соединений: А так как okmeter предупредит вас о такой ситуации благодаря встроенному автотриггеру, вы быстрее поймете где конкретно образовалась проблема и сможете скорее её исправить.
И это не всё!
Это лишь небольшая часть того, с чем okmeter поможет разбираться.
Okmeter мониторинг не только покажет, как сейчас обрабатываются запросы в базу данных, но и оповестит, если с ними что-то идет не так.
Кроме того, okmeter знает и поможет вам понимать всё про все аспекты функционирования Postgres.
Вы будете всегда знать, что происходит с PgBouncer / Postgresql в каждый момент.