Расширения PostgreSQL
Расширение PostgreSQL
Сбор метрик производительности базы данных PostgreSQL и логов запросов через удалённый мониторинг АктивныйШлюз для обнаружения аномалий, блокирующих запросов и проблем производительности.
Начало работы
Обзор
Решение для мониторинга PostgreSQL основано на подходе удалённого мониторинга, реализованном как расширение АктивныйШлюз в Ключ-АСТРОМ. Расширение запрашивает базы данных PostgreSQL для получения метрик производительности и здоровья. Ключ-АСТРОМ Intelligence анализирует эти метрики на предмет аномалий и проблем.
Варианты использования
- Мониторинг здоровья и производительности PostgreSQL.
- Обнаружение и оповещение об аномалиях.
- Предотвращение проблем производительности.
- Просмотр метрик производительности запросов, планов выполнения, блокирующих запросов, операционных оповещений, текущей конфигурации и недавних изменений.
Требования
- Установите АктивныйШлюз в вашей среде.
- Назначьте одну или несколько групп АктивныйШлюз для удалённого подключения к вашему серверу базы данных PostgreSQL и извлечения данных. Все АктивныеШлюзы в каждой группе должны иметь возможность достичь сервера.
- Для самостоятельно размещённого Postgres: должны быть установлены дополнительные поставляемые модули Postgres.
- Для облачных управляемых сервисов Postgres: убедитесь, что включены определённые расширения и настройки.
- Создайте выделенного пользователя базы данных в вашем экземпляре базы данных. Ключ-АСТРОМ использует этого пользователя для выполнения запросов мониторинга к вашей базе данных PostgreSQL. Выберите метод аутентификации в зависимости от вашей конфигурации.
Информация о совместимости
- Совместимо со всеми текущими поддерживаемыми версиями Postgres.
- Доступно в Ключ-АСТРОМ версии 1.255+.
Активация и настройка
Настройка пользователя с разрешениями
Стандартный пользователь:
CREATE USER astromkey WITH PASSWORD '<PASSWORD>' INHERIT;
IAM (AWS RDS): используйте этот метод для аутентификации с помощью AWS IAM вместо пароля базы данных. Требуется роль IAM, привязанная к хосту АктивныйШлюз.
- Включите аутентификацию базы данных IAM на вашем экземпляре RDS.
- Создайте пользователя мониторинга.
CREATE USER astromkey WITH LOGIN; GRANT rds_iam TO astromkey;
Установка расширения базы данных Postgres
- Перейдите в раздел Расширения.
- Выберите и установите расширение PostgreSQL.
- Чтобы отслеживать новую базу данных PostgreSQL, либо подключите её через приложение Базы данных (рекомендуется для новых пользователей), либо создайте конфигурацию мониторинга в разделе Расширения.
Добавление экземпляра базы данных с помощью приложения «Базы данных»
Чтобы добавить экземпляр базы данных с помощью приложения Базы данных:
- Выберите Добавить экземпляр БД в приложении Базы данных. Откроется мастер Добавить экземпляр БД.
- Выберите раздел PostgreSQL в мастере.
- Выберите тип размещения из предложенных вариантов. Этот выбор определяет, какой скрипт создаст необходимые объекты базы данных на более позднем этапе процесса.
- Выберите тип хоста, соответствующий вашим требованиям.
- Выберите Далее.
- Выберите группу АктивныйШлюз.
* Выберите группу АктивныйШлюз, чтобы определить, какие АктивныеШлюзы будут запускать расширение.
- Выберите Далее.
- Создайте подключение. Настройте подключение к вашему экземпляру базы данных. Укажите необходимые учётные данные непосредственно в мастере или используйте безопасные альтернативы:
* Назовите подключение, чтобы вы могли идентифицировать его позже.
* Добавьте данные в разделе Настроить подключение.
* Выберите подключение. Используйте Выбрать из существующих хостов или Ввести вручную, чтобы добавить данные подключения.
* Добавьте Имя базы данных.
* Предоставьте учётные данные для аутентификации пользователя мониторинга astromkey, которого вы создали, напрямую или используйте безопасные альтернативы.
* Базовые учётные данные: данные, передаваемые в Ключ-АСТРОМ при активации конфигурации мониторинга, маскируются, чтобы предотвратить их извлечение.
* Хранилище учётных данных: используйте учётные данные из хранилища для безопасного хранения и извлечения учётных данных базы данных.
* Рабочая нагрузка AWS (IAM): используйте аутентификацию AWS IAM для аутентификации с помощью роли IAM, привязанной к хосту АктивныйШлюз. Пароль базы данных не требуется. Доступно только для баз данных AWS RDS и Aurora.
* При необходимости включите SSL для установления безопасного соединения для вашей конфигурации, включая настройку truststore.
* Настройте автообнаружение баз данных, если требуется.
- Выберите Далее.
- Настройте экземпляр.
- Выберите Создать мониторинг экземпляра БД.
Создание конфигурации мониторинга с помощью раздела «Расширения»
Чтобы создать конфигурацию мониторинга с помощью раздела Расширения:
- Перейдите к расширению PostgreSQL и выберите Добавить конфигурацию.
- Выберите группу АктивныйШлюз.
* Выберите группу АктивныйШлюз, чтобы определить, какие АктивныеШлюзы будут запускать расширение.
- Выберите Далее.
- Создайте конечную точку. Настройте конечную точку, указывающую на ваш экземпляр базы данных. Каждая конфигурация может иметь до 20 000 конечных точек.
* Укажите имя хоста/IP-адрес базы данных, порт и имя базы данных в разделе Подключение к базе данных. Для каждого экземпляра настройте только одну базу данных (обычно основную базу данныхpostgres). * Предоставьте учётные данные для аутентификации пользователя мониторингаastromkey, которого вы создали выше: * Базовые учётные данные: данные, передаваемые в Ключ-АСТРОМ при активации конфигурации мониторинга, маскируются, чтобы предотвратить их извлечение. * Хранилище учётных данных: используйте учётные данные из хранилища для безопасного хранения и извлечения учётных данных базы данных. * Рабочая нагрузка AWS (IAM): используйте аутентификацию AWS IAM для аутентификации с помощью роли IAM, привязанной к хосту АктивныйШлюз. Пароль базы данных не требуется. Доступно только для баз данных AWS RDS и Aurora. * При необходимости включите SSL для установления безопасного соединения для вашей конфигурации, включая настройку truststore. * Опционально: используйте строку подключения для подключения к базе данных. При включении этой настройки значения, указанные в разделе Подключение к базе данных, игнорируются. * Настройте автообнаружение баз данных, если требуется. * Определите Дополнительные параметры конфигурации, если требуется.
- После создания всех конечных точек выберите Далее.
- Определите переменные конфигурации мониторинга.
* Настройте частоту опроса и другие переменные для этой конфигурации мониторинга:
* Метаданные конечной точки: позволяет добавить пользовательское поле метаданных ко всем сущностям, созданным этой конфигурацией.
* Интервал запросов: по умолчанию 1 минута; управляет частотой опроса для большинства метрик, собираемых расширением.
* Длинный интервал запросов: управляет частотой опроса мониторинга топовых запросов.
* Интервал запросов к таблицам: управляет частотой опроса запросов мониторинга таблиц и индексов. Доступно с основной версии 3.
* Интервал запросов к конфигурации: управляет частотой опроса параметров конфигурации базы данных и схемы.
* Длинный интервал запросов по умолчанию — 5 минут, что соответствует интервалу выставления счетов мониторинга баз данных. Установка более короткого интервала может привести к дополнительному потреблению мониторинга баз данных.
- Выберите Далее.
- Определите метаданные.
* Добавьте Описание к вашей конфигурации мониторинга. * Опционально: добавьте значения полей контекста безопасности, продукта и центра затрат, чтобы обогатить все собираемые данные. * Выберите нужные наборы функций. * Выберите Сохранить.
Настройка базы данных
Чтобы отслеживать ваш экземпляр базы данных, на базе данных PostgreSQL должны быть настроены определённые параметры. Если вы подключаетесь через приложение Базы данных, предоставляются скрипты, создающие необходимые объекты базы данных. Скачайте скрипт на ваш хост и запустите его от имени администратора с достаточными разрешениями. В противном случае выполните следующие действия вручную.
Один раз на экземпляр Следующие действия требуются один раз на экземпляр:
- Добавьте
pg_stat_statementsвshared_preload_libraries, чтобы включить сбор статистики на уровне запросов. Это необходимо установить до создания расширения на шаге 4.
- В
postgresql.confдобавьте или обновите:
shared_preload_libraries = 'pg_stat_statements'
- Перезапустите сервер PostgreSQL, чтобы применить изменение.
- Предоставьте пользователю мониторинга членство в роли
pg_monitorдля доступа к мониторингу только для чтения.
GRANT pg_monitor TO astromkey;
Для каждой базы данных Следующие действия должны быть выполнены в каждой базе данных, которую вы хотите отслеживать.
- Создайте схему
astromkey.
CREATE SCHEMA IF NOT EXISTS astromkey;
- Предоставьте пользователю мониторинга доступ к схеме
astromkey.
GRANT USAGE ON SCHEMA astromkey TO astromkey;
- Создайте вспомогательную функцию, которая генерирует планы выполнения из SQL-команд для более глубокого анализа запросов.
CREATE OR REPLACE FUNCTION astromkey.astromkey_execution_plan(
query text,
OUT explain JSON
) RETURNS SETOF JSON
LANGUAGE plpgsql
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY DEFINER
ROWS 1
SET plan_cache_mode = force_generic_plan
SET statement_timeout = '10s'
SET lock_timeout = '200ms'
AS
$$DECLARE
sanitized text;
nparams integer;
explain_cmd text;
json_result json;
BEGIN
/* remove literals, comments and quoted identifiers */
sanitized := astromkey_execution_plan.query;
sanitized := pg_catalog.regexp_replace(sanitized, '\$([A-Za-z_]\w*)?\$.*?\$\1\$', '', 'gs');
sanitized := pg_catalog.regexp_replace(sanitized, '/\*.*?\*/', '', 'gs');
sanitized := pg_catalog.regexp_replace(sanitized, '--[^\n]*', '', 'g');
sanitized := pg_catalog.regexp_replace(sanitized, '''(''''|\\.|[^''\\])*''', '', 'g');
sanitized := pg_catalog.regexp_replace(sanitized, '"[^"]*"', '', 'g');
/* reject statements containing a semicolon in the middle */
IF pg_catalog.strpos(
pg_catalog.regexp_replace(sanitized, '[;[:space:]]+$', ''),
';'
) OPERATOR(pg_catalog.>) 0 THEN
RAISE EXCEPTION 'query string must not contain a semicolon';
END IF;
/* drop a statement left behind by an earlier failure */
IF EXISTS (
SELECT 1
FROM pg_catalog.pg_prepared_statements ps
WHERE ps.name OPERATOR(pg_catalog.=) '_dt_plan_stmt_'
) THEN
DEALLOCATE _dt_plan_stmt_;
END IF;
/* construct a prepared statement, letting the planner infer the parameter types */
EXECUTE
pg_catalog.concat(
'PREPARE _dt_plan_stmt_ AS ',
astromkey_execution_plan.query
);
BEGIN
/* get the parameter count */
SELECT COALESCE(pg_catalog.array_length(ps.parameter_types, 1), 0)
INTO nparams
FROM pg_catalog.pg_prepared_statements ps
WHERE ps.name OPERATOR(pg_catalog.=) '_dt_plan_stmt_';
/* construct an EXPLAIN statement */
explain_cmd :=
pg_catalog.concat(
'EXPLAIN (FORMAT JSON, ANALYZE FALSE) EXECUTE _dt_plan_stmt_',
CASE
WHEN nparams OPERATOR(pg_catalog.=) 0 THEN ''
ELSE pg_catalog.concat(
'(',
pg_catalog.rtrim(
pg_catalog.repeat('NULL,', nparams),
','
),
')'
)
END
);
/* get the plan */
EXECUTE explain_cmd INTO json_result;
EXCEPTION
WHEN OTHERS THEN
/* delete the prepared statement, then report the original error */
DEALLOCATE _dt_plan_stmt_;
RAISE;
END;
/* delete the prepared statement */
DEALLOCATE _dt_plan_stmt_;
/* return the plan */
RETURN QUERY SELECT json_result;
END;$$;
SECURITY DEFINER: выполняется с привилегиями пользователя, определившего функцию, а не вызывающего.
EXPLAIN: требует тех же разрешений, необходимых для выполнения запроса. Пользователю, запускающему эту функцию, нужны достаточные привилегии для запуска PREPARE и EXPLAIN для запросов, которые она объясняет.
В некоторых конфигурациях PostgreSQL вам также может потребоваться установить search_path для пользователя мониторинга:
ALTER USER astromkey SET search_path to astromkey, public;
- Создайте расширение
pg_stat_statementsдля сбора статистики на уровне запросов.
CREATE EXTENSION IF NOT EXISTS pg_stat_statements SCHEMA public;
- После запуска скрипта создания запустите скрипт проверки, чтобы убедиться, что все необходимые объекты созданы. Это гарантирует, что настройка мониторинга работает должным образом.
После выполнения этих шагов метрики для отслеживаемого экземпляра PostgreSQL становятся видны в приложении Базы данных в течение 2–3 минут. Выберите любой экземпляр для изучения детальных метрик и аналитики производительности.
Детали
Тип размещения для мониторинга Postgres
Ключ-АСТРОМ поддерживает как самостоятельно размещённый, так и облачный управляемый мониторинг баз данных Postgres.
- Выберите самостоятельно размещённый Postgres для полной наблюдаемости, анализа планов выполнения, автоматизированного подключения и расширенной диагностики.
- Выберите облачный управляемый Postgres для снижения операционных издержек с некоторыми ограничениями мониторинга и ручной настройкой.
Мониторинг самостоятельно размещённого Postgres
При самостоятельно размещённом Postgres вы управляете экземпляром базы данных и инфраструктурой. Расширение собирает данные непосредственно из базы данных с помощью пользователя только для чтения. Выполните следующую настройку, чтобы включить мониторинг:
- Настройте параметры базы данных.
* Настройте следующие параметры Postgres в файле postgresql.conf и перезапустите сервер, чтобы применить настройки.
- Предоставьте прокси Ключ-АСТРОМ доступ к базе данных.
- Выберите и настройте группу АктивныйШлюз.
Мониторинг облачных баз данных Postgres
Облачный управляемый PostgreSQL предоставляется как сервис облачными платформами. Такие сервисы, как AWS RDS, AWS Aurora и Google Cloud SQL, не позволяют напрямую настраивать базу данных. Включите следующие функции и настройки, чтобы обеспечить полную возможность мониторинга.
Шаги для настройки возможностей мониторинга
- Добавьте расширение
pg_stat_statements.
* Это расширение собирает статистику на уровне запросов.
- Настройте следующие параметры:
*track_activity_query_size = 4096— обязательно. Увеличивает размер текста SQL вpg_stat_activity, позволяя собирать более крупные запросы. Если оставить значение по умолчанию (1024), запросы длиннее 1024 символов не собираются. *pg_stat_statements.max = 10000— опционально. Увеличивает количество нормализованных запросов, отслеживаемых вpg_stat_statements. *pg_stat_statements.track_utility = off— опционально. Отключает отслеживание служебных команд, таких какPREPAREиEXPLAIN. *track_io_timing = on— опционально. Собирает информацию о времени для операций чтения и записи блоков в запросах.
Обнаружение баз данных
Начиная с версии Ключ-АСТРОМ 1.338 и основной версии 3 расширения, следующие функции требуют отдельного подключения к каждой базе данных:
- Сбор схемы базы данных
- Мониторинг планов выполнения
- Мониторинг таблиц и индексов
При создании конечной точки настройте обнаружение баз данных, чтобы автоматически отслеживать базы данных, работающие на экземпляре, без настройки отдельной конечной точки для каждой из них.
Доступны следующие режимы обнаружения:
- Ручной выбор: вручную предоставьте список баз данных, которые должны отслеживаться расширением.
- Автоматическое обнаружение: все базы данных, работающие на экземпляре, обнаруживаются и отслеживаются.
Когда обнаружение баз данных включено, следующие настройки управления подключениями контролируют, как открываются и поддерживаются подключения к каждой обнаруженной базе данных:
- По требованию (по умолчанию):
Подключения открываются только тогда, когда нужно выполнить запрос, и закрываются после. Глобальный лимит ограничивает общее количество одновременных открытых подключений по всем обнаруженным базам данных.
| Параметр | Описание | По умолчанию | Минимум | Максимум |
|---|---|---|---|---|
| limit | Максимальное количество одновременных подключений по всем обнаруженным базам данных | 200 | 15 | 500 |
- Пул:
Каждая обнаруженная база данных имеет выделенный пул подключений. Подключения устанавливаются заранее и поддерживаются активными, что минимизирует накладные расходы при выполнении запросов. Дополнительная настройка не требуется.
Используйте режим «по требованию», когда количество обнаруженных баз данных велико и поддержание постоянного пула для каждой базы данных исчерпает доступные подключения к базе данных. Используйте режим пула, когда низкая задержка запросов является приоритетом, а количество обнаруженных баз данных невелико.
Мониторинг топовых запросов
Если мониторинг логов Ключ-АСТРОМ включён и представление pg_stat_statements доступно, Ключ-АСТРОМ принимает топ-100 запросов (отсортированных по общему времени выполнения) каждые 5 минут и сохраняет их как логи. Эти логи доступны либо с экрана экземпляра базы данных, либо в приложении Базы данных в разделе Топовые запросы по общему времени выполнения.
Чтобы отфильтровать эти запросы на дашборде или в ноутбуке, отфильтруйте по dt.extension.name = com.astromkey.extension.postgres и event.group = top_queries. Пример запроса DQL:
fetch logs | filter dt.extension.name=="com.astromkey.extension.postgres" and event.group=="top_queries" | sort total_exec_time desc
Независимо от того, доступно ли pg_stat_statements, Ключ-АСТРОМ собирает запросы из pg_stat_activity в рамках набора функций Queries. Они принимаются как логи с event.group = longest_queries.
Получение деталей плана выполнения
Если вы настроили мониторинг топовых запросов (см. раздел «Мониторинг топовых запросов»), вы можете получить планы выполнения для этих запросов в приложении Базы данных, выбрав Производительность операторов > Запрос для плана выполнения конкретного запроса.
Для этого запроса расширение пытается выполнить следующее:
SELECT * from astromkey.astromkey_execution_plan({query})
а затем принять в Ключ-АСТРОМ первую строку столбца с именем explain. Эти планы выполнения принимаются как логи с event.group = execution_plans.
Пулы подключений и балансировщики нагрузки
АктивныйШлюз должен установить прямое подключение к отслеживаемому хосту. Следует избегать подключения через балансировщик нагрузки, прокси или пулер подключений (например, pg-pool).
Если АктивныйШлюз переключается между разными хостами во время работы (например, во время отработки отказа), он может вычислять различия в статистике по экземплярам БД. Это может привести к неточным метрикам и вводящим в заблуждение данным.
Лицензирование и затраты
Использование расширения бесплатно. Вы платите только за данные, которые собирает расширение.
Расширение PostgreSQL собирает пользовательские метрики, которые потребляют Davis Data Units (DDU) (классическая лицензия Ключ-АСТРОМ) или метрики в соответствии с вашей моделью лицензирования.
Используйте следующую формулу для оценки количества точек данных метрик, принимаемых в минуту:
(68 * количество экземпляров) + (40 * количество баз данных) + (1 * количество табличных пространств)
Подписка на платформу Ключ-АСТРОМ
В подписке на платформу Ключ-АСТРОМ приём метрик потребляет метрики в соответствии с количеством принятых точек данных метрик.
Чтобы рассчитать приблизительное годовое потребление, примените следующую формулу: <количество точек данных метрик в минуту> * 60 минут * 24 часа * 365 дней.
Для логов применяется обычное потребление.
Классическая лицензия Ключ-АСТРОМ
В классической модели лицензирования приём метрик потребляет Davis Data Units (DDU) со скоростью 0,001 DDU на точку данных метрики. Умножьте приведённую выше формулу для годовых точек данных на 0,001, чтобы оценить годовое использование DDU.
Для логов применяется обычное потребление DDU.
Стоимость DDU, указанная выше, не включает возможные события логов или пользовательские события, запускаемые расширением.
Наборы функций
При активации расширения с помощью конфигурации мониторинга вы можете ограничить мониторинг одним из наборов функций. Для корректной работы расширение должно собрать хотя бы одну метрику после активации.
В сильно сегментированных сетях наборы функций могут отражать сегменты вашей среды. Затем при создании конфигурации мониторинга вы можете выбрать набор функций и соответствующую группу АктивныйШлюз, которая может подключиться к этому конкретному сегменту.
Все метрики, не отнесённые ни к одному набору функций, считаются стандартными и всегда сообщаются.
Метрика наследует набор функций подгруппы, которая, в свою очередь, наследует набор функций группы. Кроме того, набор функций, определённый на уровне метрики, переопределяет набор функций, определённый на уровне подгруппы, который, в свою очередь, переопределяет набор функций, определённый на уровне группы.
Databases
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Latest transaction XID age | postgres.xid_age |
Разница между текущим XID транзакции и datfrozenxid. Если это значение превышает 2^31, это может вызвать сбой базы данных из-за переполнения идентификатора транзакции. |
| Number of backends | postgres.numbackends |
Количество бэкендов, подключённых в данный момент к этой базе данных |
| Committed transactions | postgres.xact_commit.count |
Количество транзакций в этой базе данных, которые были зафиксированы |
| Rolled back transactions | postgres.xact_rollback.count |
Количество транзакций в этой базе данных, которые были откатаны |
| Block read from disk | postgres.blks_read.count |
Количество дисковых блоков, прочитанных в этой базе данных |
| Blocks found in buffer cache | postgres.blks_hit.count |
Количество раз, когда дисковые блоки уже находились в кэше буферов, так что чтение не требовалось |
| Live rows returned | postgres.tup_returned.count |
Количество живых строк, полученных последовательными сканированиями и записями индекса, возвращёнными сканированиями индекса в этой базе данных |
| Live rows fetched by index scans | postgres.tup_fetched.count |
Количество живых строк, полученных сканированиями индекса в этой базе данных |
| Rows inserted | postgres.tup_inserted.count |
Количество строк, вставленных запросами в этой базе данных |
| Rows updated | postgres.tup_updated.count |
Количество строк, обновлённых запросами в этой базе данных |
| Rows deleted | postgres.tup_deleted.count |
Количество строк, удалённых запросами в этой базе данных |
| Queries canceled due to conflict | postgres.conflicts.count |
Количество запросов, отменённых из-за конфликтов с восстановлением в этой базе данных |
| Temporary files created | postgres.temp_files.count |
Количество временных файлов, созданных запросами в этой базе данных |
| Data written to temporary files | postgres.temp_bytes.count |
Общий объём данных, записанных во временные файлы запросами в этой базе данных |
| Deadlocks | postgres.deadlocks.count |
Количество обнаруженных взаимоблокировок в этой базе данных |
| Data file blocks reading time | postgres.blk_read_time.count |
Время, затраченное бэкендами на чтение блоков файлов данных в этой базе данных |
| Data file blocks writing time | postgres.blk_write_time.count |
Время, затраченное бэкендами на запись блоков файлов данных в этой базе данных |
| Database Size | postgres.db_size |
Размер базы данных в байтах |
| Time spent by sessions | postgres.session_time.count |
Время, затраченное сессиями базы данных в этой базе данных |
| Time spent executing SQL statements | postgres.active_time.count |
Время, затраченное на выполнение SQL-операторов в этой базе данных |
| Time spent idling | postgres.idle_in_transaction_time.count |
Время, затраченное на простой в транзакции в этой базе данных |
| Data page checksum failures | postgres.checksum_failures.count |
Количество сбоев контрольной суммы страниц данных, обнаруженных в этой базе данных. Доступно только при включённых контрольных суммах данных. |
| Established sessions | postgres.sessions.count |
Общее количество установленных сессий |
| Abandoned sessions | postgres.sessions_abandoned.count |
Количество сессий базы данных, которые были завершены из-за потери подключения к клиенту |
| Fatal error terminated sessions | postgres.sessions_fatal.count |
Количество сессий базы данных, завершённых фатальными ошибками |
| Killed sessions | postgres.sessions_killed.count |
Количество сессий базы данных, завершённых вмешательством оператора |
User Functions
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| User function calls | postgres.user_functions.calls.count |
Количество раз, когда эта функция была вызвана, как сообщает pg_stat_user_functions.
|
| User functions total time | postgres.user_functions.total_time.count |
Общее время, затраченное в этой функции и всех других функциях, вызванных ею, как сообщает pg_stat_user_functions.
|
| User functions self time | postgres.user_functions.self_time.count |
Общее время, затраченное в самой этой функции, без учёта других функций, вызванных ею, как сообщает pg_stat_user_functions.
|
Replication
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Replication WAL restart delay | postgres.replication.restart_delay |
Разница между текущим WAL LSN и restart_lsn, как сообщает pg_replication_slots.
|
| Replication WAL confirmed flush lag | postgres.replication.confirmed_flush_lag |
Разница между текущим WAL LSN и confirmed_flush_lsn, как сообщает pg_replication_slots.
|
| Replication slot transaction age | postgres.replication.slot_xmin_age |
Возраст самой старой транзакции, которую этому слоту логической репликации нужно сохранить в базе данных, как сообщает pg_replication_slots.
|
| Database conflicts tablespace | postgres.database_conflicts.tablespace.count |
Количество запросов в этой базе данных, которые были отменены из-за удаления табличных пространств, как сообщает pg_stat_database_conflicts. Только для standby.
|
| Database conflicts lock | postgres.database_conflicts.lock.count |
Количество запросов в этой базе данных, которые были отменены из-за тайм-аутов блокировок, как сообщает pg_stat_database_conflicts. Только для standby.
|
| Database conflicts snapshot | postgres.database_conflicts.snapshot.count |
Количество запросов в этой базе данных, которые были отменены из-за старых снимков, как сообщает pg_stat_database_conflicts. Только для standby.
|
| Database conflicts buffer pin | postgres.database_conflicts.bufferpin.count |
Количество запросов в этой базе данных, которые были отменены из-за закреплённых буферов, как сообщает pg_stat_database_conflicts. Только для standby.
|
| Database conflicts deadlock | postgres.database_conflicts.deadlock.count |
Количество запросов в этой базе данных, которые были отменены из-за взаимоблокировок, как сообщает pg_stat_database_conflicts. Только для standby.
|
| Replication WAL write lag | postgres.replication.write_lag |
Время, прошедшее между локальным сбросом последнего WAL и получением уведомления о том, что этот резервный сервер его записал, как сообщает pg_stat_replication.
|
| Replication WAL flush lag | postgres.replication.flush_lag |
Время, прошедшее между локальным сбросом последнего WAL и получением уведомления о том, что этот резервный сервер его записал и сбросил, как сообщает pg_stat_replication.
|
| Replication WAL replay lag | postgres.replication.replay_lag |
Время, прошедшее между локальным сбросом последнего WAL и получением уведомления о том, что этот резервный сервер его записал, сбросил и применил, как сообщает pg_stat_replication.
|
| Replication backend transaction age | postgres.replication.backend_xmin_age |
Возраст горизонта xmin бэкенда, как сообщает pg_stat_replication.
|
| Replication replay delay | postgres.replication.replay_delay |
Разница в байтах между текущей позицией WAL и последней позицией WAL, воспроизведённой на резервном сервере, как сообщает pg_stat_replication.
|
| WAL receiver received timeline ID | postgres.wal_receiver.received_tli |
Номер временной шкалы последнего WAL, полученного и сброшенного на диск, как сообщает pg_stat_wal_receiver. Только для standby.
|
| WAL receiver last message send age | postgres.wal_receiver.last_msg_send_age |
Время, прошедшее с момента отправки последнего сообщения источнику WAL sender, как сообщает pg_stat_wal_receiver. Только для standby.
|
| WAL receiver last message receipt age | postgres.wal_receiver.last_msg_receipt_age |
Время, прошедшее с момента получения последнего сообщения от источника WAL sender, как сообщает pg_stat_wal_receiver. Только для standby.
|
| WAL receiver latest end age | postgres.wal_receiver.latest_end_age |
Время, прошедшее с момента последнего сообщения позиции журнала предзаписи источнику WAL sender, как сообщает pg_stat_wal_receiver. Только для standby.
|
default
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Instance uptime | postgres.uptime |
Время с момента запуска экземпляра |
Recovery
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Instance recovery mode | postgres.recovery.state |
Указывает, что экземпляр находится в режиме восстановления. 1, если в восстановлении, 0 в противном случае. |
Tables
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Index size | postgres.indexes.index_size |
Дисковое пространство, используемое индексом, как сообщает pg_relation_size().
|
| Index scans | postgres.indexes.scans.count |
Количество сканирований индекса, инициированных для этого индекса, как сообщает pg_stat_user_indexes (idx_scan).
|
| Index tuples read | postgres.indexes.tuples_read.count |
Количество записей индекса, возвращённых сканированиями для этого индекса, как сообщает pg_stat_user_indexes (idx_tup_read).
|
| Index tuples fetched | postgres.indexes.tuples_fetched.count |
Количество живых строк таблицы, полученных простыми сканированиями индекса с использованием этого индекса, как сообщает pg_stat_user_indexes (idx_tup_fetch).
|
| Index disk block reads | postgres.indexes.index_disk_reads.count |
Количество дисковых блоков, прочитанных из этого индекса, как сообщает pg_statio_user_indexes (idx_blks_read).
|
| Index buffer hits | postgres.indexes.index_buffer_hits.count |
Количество попаданий в буфер для этого индекса, как сообщает pg_statio_user_indexes (idx_blks_hit).
|
| Estimated row count | postgres.tables.rows |
Оценочное количество живых строк в таблице, как сообщает pg_stat_user_tables (n_live_tup).
|
| Dead rows | postgres.tables.dead_rows |
Оценочное количество мёртвых строк в таблице, как сообщает pg_stat_user_tables (n_dead_tup).
|
| Rows modified since analyze | postgres.tables.rows_modified_since_analyze |
Оценочное количество строк, изменённых с момента последнего анализа таблицы, как сообщает pg_stat_user_tables (n_mod_since_analyze).
|
| Rows inserted since vacuum | postgres.tables.rows_inserted_since_vacuum |
Оценочное количество строк, вставленных с момента последнего вакуумирования таблицы, как сообщает pg_stat_user_tables (n_ins_since_vacuum).
|
| Total table size | postgres.tables.total_size |
Общее дисковое пространство, используемое таблицей, включая индексы и данные TOAST, как возвращает pg_total_relation_size().
|
| Table size | postgres.tables.table_size |
Дисковое пространство, используемое основной вилкой таблицы, как возвращает pg_relation_size().
|
| TOAST size | postgres.tables.toast_size |
Дисковое пространство, используемое таблицей TOAST, связанной с этой таблицей, как возвращает pg_relation_size().
|
| Indexes size | postgres.tables.indexes_size |
Общее дисковое пространство, используемое всеми индексами таблицы, как возвращает pg_indexes_size().
|
| Sequential scans | postgres.tables.sequential_scans.count |
Количество последовательных сканирований, инициированных для этой таблицы, как сообщает pg_stat_user_tables (seq_scan).
|
| Index scans | postgres.tables.index_scans.count |
Количество сканирований индекса, инициированных для этой таблицы, как сообщает pg_stat_user_tables (idx_scan).
|
| Rows read by sequential scans | postgres.tables.rows_read_seq.count |
Количество живых строк, полученных последовательными сканированиями, как сообщает pg_stat_user_tables (seq_tup_read).
|
| Rows read by index scans | postgres.tables.rows_read_idx.count |
Количество живых строк, полученных сканированиями индекса, как сообщает pg_stat_user_tables (idx_tup_fetch).
|
| Rows inserted | postgres.tables.rows_inserted.count |
Количество строк, вставленных в эту таблицу, как сообщает pg_stat_user_tables (n_tup_ins).
|
| Rows updated | postgres.tables.rows_updated.count |
Количество строк, обновлённых в этой таблице, как сообщает pg_stat_user_tables (n_tup_upd).
|
| Rows deleted | postgres.tables.rows_deleted.count |
Количество строк, удалённых из этой таблицы, как сообщает pg_stat_user_tables (n_tup_del).
|
| HOT updates | postgres.tables.hot_updates.count |
Количество строк, HOT-обновлённых в этой таблице, где отдельное обновление индекса не требовалось, как сообщает pg_stat_user_tables (n_tup_hot_upd).
|
| Table disk block reads | postgres.tables.table_disk_reads.count |
Количество дисковых блоков, прочитанных из этой таблицы, как сообщает pg_statio_user_tables (heap_blks_read).
|
| Table buffer hits | postgres.tables.table_buffer_hits.count |
Количество попаданий в буфер для этой таблицы, как сообщает pg_statio_user_tables (heap_blks_hit).
|
| Index disk block reads | postgres.tables.index_disk_reads.count |
Количество дисковых блоков, прочитанных из всех индексов этой таблицы, как сообщает pg_statio_user_tables (idx_blks_read).
|
| Index buffer hits | postgres.tables.index_buffer_hits.count |
Количество попаданий в буфер для всех индексов этой таблицы, как сообщает pg_statio_user_tables (idx_blks_hit).
|
| TOAST disk block reads | postgres.tables.toast_disk_reads.count |
Количество дисковых блоков, прочитанных из таблицы TOAST этой таблицы, как сообщает pg_statio_user_tables (toast_blks_read).
|
| TOAST buffer hits | postgres.tables.toast_buffer_hits.count |
Количество попаданий в буфер для таблицы TOAST этой таблицы, как сообщает pg_statio_user_tables (toast_blks_hit).
|
| TOAST index disk block reads | postgres.tables.toast_index_disk_reads.count |
Количество дисковых блоков, прочитанных из индексов таблицы TOAST этой таблицы, как сообщает pg_statio_user_tables (tidx_blks_read).
|
| TOAST index buffer hits | postgres.tables.toast_index_buffer_hits.count |
Количество попаданий в буфер для индексов таблицы TOAST этой таблицы, как сообщает pg_statio_user_tables (tidx_blks_hit).
|
| Manual vacuums | postgres.tables.vacuum.count |
Количество раз, когда эта таблица была вакуумирована вручную (не считая VACUUM FULL), как сообщает pg_stat_user_tables (vacuum_count).
|
| Autovacuums | postgres.tables.autovacuum.count |
Количество раз, когда эта таблица была вакуумирована демоном autovacuum, как сообщает pg_stat_user_tables (autovacuum_count).
|
| Manual analyzes | postgres.tables.analyze.count |
Количество раз, когда эта таблица была проанализирована вручную, как сообщает pg_stat_user_tables (analyze_count).
|
| Autoanalyzes | postgres.tables.autoanalyze.count |
Количество раз, когда эта таблица была проанализирована демоном autovacuum, как сообщает pg_stat_user_tables (autoanalyze_count).
|
WAL
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| WAL files size | postgres.wal_files_size |
Общий размер всех WAL-файлов в каталоге WAL |
| WAL files count | postgres.wal_files |
Общее количество WAL-файлов в каталоге WAL |
| WAL files age | postgres.wal_files_age |
Время, прошедшее с момента изменения самого старого WAL-файла |
| WAL write | postgres.wal_write.count |
Количество раз, когда буферы WAL были записаны на диск через запрос XLogWrite |
| WAL sync | postgres.wal_sync.count |
Количество раз, когда WAL-файлы были синхронизированы с диском через запрос issue_xlog_fsync |
| WAL write time | postgres.wal_write_time.count |
Общее время, затраченное на запись буферов WAL на диск через запрос XLogWrite, в миллисекундах |
| WAL sync time | postgres.wal_sync_time.count |
Общее время, затраченное на синхронизацию WAL-файлов с диском через запрос issue_xlog_fsync, в миллисекундах |
| WAL diff size | postgres.wal_diff_size |
Размер разницы между текущим WAL и последним воспроизведением WAL |
| WAL records per minute | postgres.wal_records.count |
Количество WAL-записей, генерируемых в минуту |
| WAL fpi per minute | postgres.wal_fpi.count |
Количество полноразмерных образов страниц WAL, генерируемых в минуту |
| WAL bytes | postgres.wal_bytes.count |
Общий объём сгенерированного WAL в байтах |
| WAL buffers full | postgres.wal_buffers_full.count |
Количество раз, когда данные WAL были записаны на диск из-за заполнения буферов WAL |
I/O
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| I/O reads | postgres.io.reads.count |
Количество операций чтения, как сообщает pg_stat_io.
|
| I/O read time | postgres.io.read_time.count |
Время, затраченное на ожидание операций чтения, как сообщает pg_stat_io.
|
| I/O writes | postgres.io.writes.count |
Количество операций записи, как сообщает pg_stat_io.
|
| I/O write time | postgres.io.write_time.count |
Время, затраченное на ожидание операций записи, как сообщает pg_stat_io.
|
| I/O writebacks | postgres.io.writebacks.count |
Количество единиц размера BLCKSZ (обычно 8 кБ), которые процесс запросил у ядра записать на постоянное хранилище, как сообщает pg_stat_io.
|
| I/O writeback time | postgres.io.writeback_time.count |
Время, затраченное на ожидание операций обратной записи, как сообщает pg_stat_io.
|
| I/O extends | postgres.io.extends.count |
Количество операций расширения отношений, как сообщает pg_stat_io.
|
| I/O extend time | postgres.io.extend_time.count |
Время, затраченное на ожидание операций расширения, как сообщает pg_stat_io.
|
| I/O hits | postgres.io.hits.count |
Количество раз, когда нужный блок был найден в общем буфере, как сообщает pg_stat_io.
|
| I/O evictions | postgres.io.evictions.count |
Количество раз, когда блок был выписан из общего или локального буфера, чтобы сделать его доступным для другого использования, как сообщает pg_stat_io.
|
| I/O reuses | postgres.io.reuses.count |
Количество раз, когда существующий буфер в ограниченном по размеру кольцевом буфере вне общих буферов был повторно использован в рамках операции ввода-вывода, как сообщает pg_stat_io.
|
| I/O fsyncs | postgres.io.fsyncs.count |
Количество вызовов fsync, как сообщает pg_stat_io.
|
| I/O fsync time | postgres.io.fsync_time.count |
Время, затраченное на ожидание операций fsync, как сообщает pg_stat_io.
|
| I/O read bytes | postgres.io.read_bytes.count |
Общий размер операций чтения, как сообщает pg_stat_io.
|
| I/O write bytes | postgres.io.write_bytes.count |
Общий размер операций записи, как сообщает pg_stat_io.
|
| I/O extend bytes | postgres.io.extend_bytes.count |
Общий размер операций расширения отношений, как сообщает pg_stat_io.
|
Activity
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Active backend processes | postgres.activity.active |
Количество серверных процессов, выполняющих запрос |
| Active waiting backend processes | postgres.activity.active_waiting |
Количество серверных процессов, активно ожидающих |
| Idle backend processes | postgres.activity.idle |
Количество серверных процессов, ожидающих новой команды клиента |
| Idle in transaction backends processes | postgres.activity.idle_in_transaction |
Количество серверных процессов в транзакции, не выполняющих в данный момент запрос |
| Idle in transaction aborted backends processes | postgres.activity.idle_in_transaction_aborted |
Количество серверных процессов в транзакции, не выполняющих в данный момент запрос, где один из операторов вызвал ошибку |
| Fast-path function backend processes | postgres.activity.fastpath_function_call |
Количество серверных процессов, выполняющих вызов функции быстрого пути |
Tablespaces
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Tablespace size | postgres.tablespace.size |
Размер табличного пространства в байтах |
Background Writer
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Buffers written by background writer | postgres.buffers_clean.count |
Количество буферов, записанных фоновым писателем |
| Cleaning scan stops | postgres.maxwritten_clean.count |
Количество раз, когда фоновый писатель остановил очищающее сканирование, потому что записал слишком много буферов |
| Buffers allocated | postgres.buffers_alloc.count |
Количество выделенных буферов |
| Scheduled checkpoints performed | postgres.checkpoints_timed.count |
Количество запланированных контрольных точек, которые были выполнены |
| Requested checkpoints performed | postgres.checkpoints_req.count |
Количество запрошенных контрольных точек, которые были выполнены |
| Checkpoints write time | postgres.checkpoint_write_time.count |
Общее время, затраченное на часть обработки контрольной точки, где файлы записываются на диск |
| Checkpoint sync time | postgres.checkpoint_sync_time.count |
Общее время, затраченное на часть обработки контрольной точки, где файлы синхронизируются с диском |
| Buffers written during checkpoints | postgres.buffers_checkpoint.count |
Количество буферов, записанных во время контрольных точек |
| Buffers written by backend | postgres.buffers_backend.count |
Количество буферов, записанных напрямую бэкендом |
| Backend fsync executions | postgres.buffers_backend_fsync.count |
Количество раз, когда бэкенду пришлось выполнить собственный вызов fsync |
SLRU
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| SLRU blocks zeroed | postgres.slru.blks_zeroed.count |
Количество блоков, обнулённых во время инициализации, как сообщает pg_stat_slru.
|
| SLRU blocks hit | postgres.slru.blks_hit.count |
Количество раз, когда дисковые блоки уже находились в кэше SLRU, так что чтение не требовалось, как сообщает pg_stat_slru.
|
| SLRU blocks read | postgres.slru.blks_read.count |
Количество прочитанных дисковых блоков, как сообщает pg_stat_slru.
|
| SLRU blocks written | postgres.slru.blks_written.count |
Количество записанных дисковых блоков, как сообщает pg_stat_slru.
|
| SLRU blocks exists | postgres.slru.blks_exists.count |
Количество блоков, проверенных на существование, как сообщает pg_stat_slru.
|
| SLRU flushes | postgres.slru.flushes.count |
Количество сбросов SLRU грязных данных, как сообщает pg_stat_slru.
|
| SLRU truncates | postgres.slru.truncates.count |
Количество усечений SLRU, как сообщает pg_stat_slru.
|
Queries
| Название метрики | Ключ метрики | Описание |
|---|---|---|
Locks
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Number of locks | postgres.locks |
Количество блокировок, как сообщает pg_locks
|
Subscription
| Название метрики | Ключ метрики | Описание |
|---|---|---|
| Subscription stats - apply error | postgres.subscription_stats.apply_error.count |
Количество раз, когда произошла ошибка при применении изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats - sync error | postgres.subscription_stats.sync_error.count |
Количество раз, когда произошла ошибка во время начальной синхронизации таблицы, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - insert exists | postgres.subscription_stats.confl_insert_exists.count |
Количество раз, когда вставка строки нарушила NOT DEFERRABLE уникальное ограничение во время применения изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - update origin differs | postgres.subscription_stats.confl_update_origin_differs.count |
Количество раз, когда операция обновления была применена к строке, которая ранее была изменена другим источником во время применения изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - update exists | postgres.subscription_stats.confl_update_exists.count |
Количество раз, когда обновлённое значение строки нарушило NOT DEFERRABLE уникальное ограничение во время применения изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - update missing | postgres.subscription_stats.confl_update_missing.count |
Количество раз, когда кортеж для обновления не был найден во время применения изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - delete origin differs | postgres.subscription_stats.confl_delete_origin_differs.count |
Количество раз, когда операция удаления была применена к строке, которая ранее была изменена другим источником во время применения изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - missing delete | postgres.subscription_stats.confl_delete_missing.count |
Количество раз, когда кортеж для удаления не был найден во время применения изменений, как сообщает pg_stat_subscription_stats.
|
| Subscription stats conflict - multiple unique conflicts | postgres.subscription_stats.confl_multiple_unique_conflicts.count |
Количество раз, когда вставка строки или обновлённые значения строки нарушили несколько NOT DEFERRABLE уникальных ограничений во время применения изменений, как сообщает pg_stat_subscription_stats.
|
Ограничения
- Топовые запросы: по соображениям безопасности операторы
ALTERисключены из сбора топовых запросов. - Детали плана выполнения:
* Для запуска получения плана выполнения требуется разрешениеextensions:configuration.actions:write. * План выполнения можно получить только из базы данных, в которой создана функцияastromkey.astromkey_execution_plan.
Часто задаваемые вопросы
Как это расширение собирает данные из моих баз данных? Это расширение работает на ваших АктивныхШлюзах Ключ-АСТРОМ и подключается к настроенным базам данных. Расширение выполняет только запросы SELECT для сбора данных.
Как часто выполняются эти запросы мониторинга? Начиная с версии 2.3.0 переменные конфигурации query-interval и heavy-query-interval управляют частотой выполнения запросов. Большинство запросов выполняются каждые query-interval минут (по умолчанию 1 минута), а запросы в наборе функций Queries выполняются каждые heavy-query-interval минут (по умолчанию 5 минут).
Почему некоторые запросы расширения завершаются с ошибкой? Поддержка широкого диапазона версий Postgres требует выполнения нескольких версий одних и тех же запросов параллельно, так как Postgres со временем изменил имена столбцов для нескольких таблиц. Некоторые сбои запросов ожидаемы. Пока данные не отсутствуют, причин для беспокойства нет.
Расширения
Изучите в разделе Расширения.
Сбор метрик производительности базы данных PostgreSQL и логов запросов через удалённый мониторинг АктивныйШлюз для обнаружения аномалий, блокирующих запросов и проблем производительности.