Расширения 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

  1. Перейдите в раздел Расширения.
  2. Выберите и установите расширение PostgreSQL.
  3. Чтобы отслеживать новую базу данных PostgreSQL, либо подключите её через приложение Базы данных (рекомендуется для новых пользователей), либо создайте конфигурацию мониторинга в разделе Расширения.

Добавление экземпляра базы данных с помощью приложения «Базы данных»

Чтобы добавить экземпляр базы данных с помощью приложения Базы данных:

  1. Выберите Добавить экземпляр БД в приложении Базы данных. Откроется мастер Добавить экземпляр БД.
  2. Выберите раздел PostgreSQL в мастере.
  3. Выберите тип размещения из предложенных вариантов. Этот выбор определяет, какой скрипт создаст необходимые объекты базы данных на более позднем этапе процесса.
  4. Выберите тип хоста, соответствующий вашим требованиям.
  5. Выберите Далее.
  6. Выберите группу АктивныйШлюз.
  * Выберите группу АктивныйШлюз, чтобы определить, какие АктивныеШлюзы будут запускать расширение.
  1. Выберите Далее.
  2. Создайте подключение. Настройте подключение к вашему экземпляру базы данных. Укажите необходимые учётные данные непосредственно в мастере или используйте безопасные альтернативы:
  * Назовите подключение, чтобы вы могли идентифицировать его позже.
  * Добавьте данные в разделе Настроить подключение.
  * Выберите подключение. Используйте Выбрать из существующих хостов или Ввести вручную, чтобы добавить данные подключения.
  * Добавьте Имя базы данных.
  * Предоставьте учётные данные для аутентификации пользователя мониторинга astromkey, которого вы создали, напрямую или используйте безопасные альтернативы.
     * Базовые учётные данные: данные, передаваемые в Ключ-АСТРОМ при активации конфигурации мониторинга, маскируются, чтобы предотвратить их извлечение.
     * Хранилище учётных данных: используйте учётные данные из хранилища для безопасного хранения и извлечения учётных данных базы данных.
     * Рабочая нагрузка AWS (IAM): используйте аутентификацию AWS IAM для аутентификации с помощью роли IAM, привязанной к хосту АктивныйШлюз. Пароль базы данных не требуется. Доступно только для баз данных AWS RDS и Aurora.
  * При необходимости включите SSL для установления безопасного соединения для вашей конфигурации, включая настройку truststore.
  * Настройте автообнаружение баз данных, если требуется.
  1. Выберите Далее.
  2. Настройте экземпляр.
  3. Выберите Создать мониторинг экземпляра БД.

Создание конфигурации мониторинга с помощью раздела «Расширения»

Чтобы создать конфигурацию мониторинга с помощью раздела Расширения:

  1. Перейдите к расширению PostgreSQL и выберите Добавить конфигурацию.
  2. Выберите группу АктивныйШлюз.
  * Выберите группу АктивныйШлюз, чтобы определить, какие АктивныеШлюзы будут запускать расширение.
  1. Выберите Далее.
  2. Создайте конечную точку. Настройте конечную точку, указывающую на ваш экземпляр базы данных. Каждая конфигурация может иметь до 20 000 конечных точек.
  * Укажите имя хоста/IP-адрес базы данных, порт и имя базы данных в разделе Подключение к базе данных. Для каждого экземпляра настройте только одну базу данных (обычно основную базу данных postgres).
  * Предоставьте учётные данные для аутентификации пользователя мониторинга astromkey, которого вы создали выше:
     * Базовые учётные данные: данные, передаваемые в Ключ-АСТРОМ при активации конфигурации мониторинга, маскируются, чтобы предотвратить их извлечение.
     * Хранилище учётных данных: используйте учётные данные из хранилища для безопасного хранения и извлечения учётных данных базы данных.
     * Рабочая нагрузка AWS (IAM): используйте аутентификацию AWS IAM для аутентификации с помощью роли IAM, привязанной к хосту АктивныйШлюз. Пароль базы данных не требуется. Доступно только для баз данных AWS RDS и Aurora.
  * При необходимости включите SSL для установления безопасного соединения для вашей конфигурации, включая настройку truststore.
  * Опционально: используйте строку подключения для подключения к базе данных. При включении этой настройки значения, указанные в разделе Подключение к базе данных, игнорируются.
  * Настройте автообнаружение баз данных, если требуется.
  * Определите Дополнительные параметры конфигурации, если требуется.
  1. После создания всех конечных точек выберите Далее.
  2. Определите переменные конфигурации мониторинга.
  * Настройте частоту опроса и другие переменные для этой конфигурации мониторинга:
     * Метаданные конечной точки: позволяет добавить пользовательское поле метаданных ко всем сущностям, созданным этой конфигурацией.
     * Интервал запросов: по умолчанию 1 минута; управляет частотой опроса для большинства метрик, собираемых расширением.
     * Длинный интервал запросов: управляет частотой опроса мониторинга топовых запросов.
     * Интервал запросов к таблицам: управляет частотой опроса запросов мониторинга таблиц и индексов. Доступно с основной версии 3.
     * Интервал запросов к конфигурации: управляет частотой опроса параметров конфигурации базы данных и схемы.
  * Длинный интервал запросов по умолчанию — 5 минут, что соответствует интервалу выставления счетов мониторинга баз данных. Установка более короткого интервала может привести к дополнительному потреблению мониторинга баз данных.
  1. Выберите Далее.
  2. Определите метаданные.
  * Добавьте Описание к вашей конфигурации мониторинга.
  * Опционально: добавьте значения полей контекста безопасности, продукта и центра затрат, чтобы обогатить все собираемые данные.
  * Выберите нужные наборы функций.
  * Выберите Сохранить.

Настройка базы данных

Чтобы отслеживать ваш экземпляр базы данных, на базе данных 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 и логов запросов через удалённый мониторинг АктивныйШлюз для обнаружения аномалий, блокирующих запросов и проблем производительности.