SQL-запросы получения метрик для обзорной панели#

Kintsugi использует поды сервиса inform для выполнения SQL-запросов на получение метрик для обзорной панели. Для визуального представления метрик UI обращается к inform, указывая в запросе идентификатор объекта мониторинга.

Сервис inform предоставляет следующие метрики для обзорной панели объекта мониторинга.

Примечание

Подробное описание обзорной панели объекта мониторинга представлено в «Руководстве оператора», раздел «Вкладка «Метрики»» пункт «Метрики».

Список поддерживаемых метрик#

№ виджета

Имя виджета обзорной панели

Запрос метрики для PostgreSQL 11, 12, 13, 15 и Platform V Pangolin DB (PSQ) SE 5.1.0 и выше

Описание

1

Статус репликации

Для PostgreSQL 13 и выше и Platform V Pangolin DB (PSQ) 5 и выше: SQL query 4, SQL query 18
Для остальных версий: SQL query 3, SQL query 4
Дополнительный запрос только для Platform V Pangolin DB (PSQ) 5 и выше: SQL query 22

Содержит информацию о физической и/или логической репликации объекта мониторинга, являющегося частью кластера: какой объект подключен, активность и основные параметры

2

Подключения

SQL query 5
SQL query 6
SQL query 25

Показывает общую статистику подключений, разделенных по типам

3

Производительность СУБД

Для PostgreSQL 13 и Platform V Pangolin DB (PSQ) 5: SQL query 7; SQL query 8, SQL query 17.
Для остальных версий: SQL query 7, SQL query 8, SQL query 9

Среднее время – среднее время выполнения запроса. Вычисляется по формуле sum(total_time)/sum(calls).
TPS - TPS – количество транзакций в секунду на момент получения данных. Вычисляется как разница суммы коммитов и откатов за секунду.
QPS - QPS – количество запросов в секунду на момент получения данных. Вычисляется как разница суммы вызовов запросов за секунду

4

Транзакции

SQL query 11

Cоотношение commits и rollbacks – вычисляется по формуле (xact_commit\*100)/(xact_commit+xact_rollback). Значения результата варьируются от 1 до 100. Чем значение выше, тем меньше в наблюдаемой базе данных ошибок, приводящих к rollback

5

Длительные транзакции

SQL query 14
SQL query 15

Транзакции со статусом «active» в наблюдаемой базе данных дольше 1 минуты
Транзакции со статусом «idle in transaction» в наблюдаемой базе данных дольше 1 минуты

6

Процент попадания в кеш

SQL query 11

Оценка объема данных, берущихся из кеш shared buffers против объема прочитанного с диска

7

Список баз данных

SQL query 16
SQL query 26

Информация о базах данных в наблюдаемой СУБД

8

Журнал предзаписи (WAL)

Для PostgreSQL ниже 14: SQL query 19
Для PostgreSQL 14 и выше: SQL query 20
Для всех версий Platform V Pangolin DB (PSQ) SE и PostgreSQL: SQL query 22

Отображает объем записи данных в журнал за 1 секунду и текущую позицию добавления в журнал предзаписи (current_lsn)

9

Горизонт заморозки кластера

SQL query 12

Максимальное число незамороженных транзакций, вычисляемых по формуле max(age(datfrozenxid))

10

Временные файлы

SQL query 13

Показывает кумулятивную статистику за все время накопления объема данных, временно записанных на диск для выполнения запросов

11

Последняя автоочистка таблиц

SQL query 21

Последний раз, когда очистка запускалась демоном автоочистки

12

Очищено контрольными точками

SQL query 10

Отображает в процентах количество буферов, очищенных с помощью процесса контрольной точки. Вычисляется по формуле round(100.0*buffers_checkpoint)/(buffers_checkpoint + buffers_clean + buffers_backend)

13

Конфигурация PostgreSQL

SQL query 24
SQL query 27

Содержит список параметров конфигурации PostgreSQL

14

Версии СУБД и время работы


SQL query 1
SQL query 2

Отображает версии СУБД (PostgreSQL и/или Platform V Pangolin DB (PSQ)) (SQL query 1)
Выводит время старта СУБД и время с последнего запуска БД (SQL query 2)

SQL query 1#

 SELECT version() AS version, (SELECT 'Platform V Pangolin' AS edition WHERE EXISTS (SELECT * FROM pg_catalog.pg_proc WHERE proname='sber_version'));

Пример выходных данных для Platform V Pangolin DB (PSQ) 5.1.0 и выше:

| version                                                                                                 | edition             |
|---------------------------------------------------------------------------------------------------------+---------------------|
| PostgreSQL 13.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit | Platform V Pangolin |

Пример выходных данных для PostgreSQL 11, 12, 13, 15:

| version                                                                                                                       | edition |
|-------------------------------------------------------------------------------------------------------------------------------+---------|
| PostgreSQL 11.22 (Debian 11.22-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit |         |

SQL query 2#

SELECT now() - pg_postmaster_start_time() AS uptime,pg_postmaster_start_time() AS boot_time, now() - pg_conf_load_time() AS conf_reload_time, pg_is_in_recovery() AS is_in_recovery;

Пример выходных данных:

| uptime                  | boot_time                     | conf_reload_time        | is_in_recovery |
|-------------------------+-------------------------------+-------------------------+----------------|
| 49 days 02:35:27.154125 | 2024-01-19 07:26:44.149556+00 | 49 days 02:35:27.25775  | f              |

SQL query 3#

SELECT setting, name FROM pg_settings WHERE name IN ('wal_keep_segments', 'synchronous_commit', 'synchronous_standby_names');

Пример выходных данных:

| setting              | name                      |
|----------------------+---------------------------|
| on                   | synchronous_commit        |
|                      | synchronous_standby_names |
| 0                    | wal_keep_segments         |

SQL query 4#

SELECT client_addr, state, pg_size_pretty(pg_current_wal_lsn() - replay_lsn) AS total_lag_bytes, slot_type, active FROM pg_stat_replication stat LEFT JOIN pg_replication_slots slot ON stat.pid=slot.active_pid;

Пример выходных данных:

| client_addr  | state     | total_lag_bytes | slot_type  | active |
|--------------+-----------+-----------------+------------+--------|
| 10.xx.xx.xx  | streaming | 15 MB           | physical   |  t     |

Если сервер не является кластером, то выходные значения будут пустыми.

SQL query 5#

SELECT current_setting('max_connections') AS max_connections, (current_setting('max_connections')::integer - count(*)::integer) AS available_connections, (current_setting('max_connections')::integer) - (current_setting('max_connections')::integer - count(*)::integer) AS used_connections, current_setting('superuser_reserved_connections') AS superuser_reserved_connections FROM pg_stat_activity;

Пример выходных данных:

| max_connections | available_connections | used_connections | superuser_reserved_connections |
|-----------------+-----------------------+------------------+--------------------------------|
| 400             | 373                   | 27               | 10                             |

SQL query 6#

SELECT CASE WHEN (state IS NULL) THEN 'system_process' ELSE state END, count(*) FROM pg_stat_activity GROUP BY state;

Пример выходных данных:

| state                | count |
|----------------------+-------|
| system_process       | 5     |
| active               | 1     |

SQL query 7#

WITH
a AS (SELECT sum(calls) s FROM pg_stat_statements),
b AS (SELECT sum(calls) s FROM pg_stat_statements , pg_sleep(1))
SELECT b.s-a.s AS QPS FROM a,b;

Пример выходных данных:

| qps |
|-----|
| 45  |

SQL query 8#

WITH
     a AS (SELECT sum(xact_commit+xact_rollback) s FROM pg_stat_database),
     b AS (SELECT sum(xact_commit+xact_rollback) s FROM pg_stat_database,
                                                        pg_stat_clear_snapshot(),
                                                        pg_sleep(1))
SELECT b.s-a.s AS TPS FROM a,b;

Пример выходных данных:

| tps |
|-----|
| 0   |

SQL query 9#

SELECT (sum(total_time) / sum(calls))::integer AS avg_time
FROM pg_stat_statements;

Пример выходных данных:

| avg_time |
|----------|
| 29       |

SQL query 10#

SELECT round(100.0*buffers_checkpoint/NULLIF((buffers_checkpoint + buffers_clean + buffers_backend),0),1) AS clean_by_chkp FROM pg_stat_bgwrite

Пример выходных данных:

| clean_by_chkp  |
|----------------|
| 64.4           |

SQL query 11#

SELECT round((100*sum(blks_hit)/(sum(blks_hit) + sum(blks_read)))::numeric , 1) AS cache_hit_ratio,  round((100 * sum(xact_commit) / (sum(xact_commit) + sum(xact_rollback)))::numeric, 1) AS commit_ratio,sum(xact_commit)::integer AS commit_sum,sum(xact_rollback)::integer AS rollback_sumFROM pg_stat_database

Пример выходных данных:

| cache_hit_ratio | commit_ratio | xact_commit_sum | xact_rollback_sum |
|-----------------|--------------|-----------------|-------------------|
| 100.0           | 71.2         | 554335          | 223848            |

SQL query 12#

SELECT max(age(datfrozenxid)) frozen_age
FROM pg_database;

Пример выходных данных:

| frozen_age  |
|-------------|
| 0           |

SQL query 13#

SELECT pg_size_pretty(sum(temp_bytes)) AS temp_file_size FROM pg_stat_database;

Пример выходных данных:

| temp_file_size |
|----------------|
| 12 MB          |

SQL query 14#

SELECT
  EXTRACT(
    epoch
    FROM
      (
        CASE
          WHEN STATE = 'active' THEN age(NOW(), query_start)
        END
      )
  )::integer AS active,
  datname,
  usename,
  client_addr,
  application_name,
  pid,
  client_port,
  query,
  STATE
FROM
  pg_stat_activity
WHERE
  backend_type = 'client backend'
  AND STATE = 'active'
  AND (NOW() - xact_start) > TIME '00:01:00'
ORDER BY
  active DESC
LIMIT
  10;

Пример выходных данных:

| idle           | datname  | usename  | client_addr | application_name | pid   | client_port | query                  | state  |
|----------------|----------|----------|-------------|------------------|-------|-------------|------------------------|--------|
| 78             | postgres | postgres | 10.xx.xx.xx  | psql             | 30603 | 55276       | SELECT PG_SLEEP(1000); | active |

SQL query 15#

SELECT
  EXTRACT(
    epoch
    FROM
      (
        CASE
          WHEN STATE = 'idle in transaction' THEN age(NOW(), query_start)
        END
      )
  )::integer AS idle,
  datname,
  usename,
  client_addr,
  application_name,
  pid,
  client_port,
  query,
  STATE
FROM
  pg_stat_activity
WHERE
  backend_type = 'client backend'
  AND STATE = 'idle in transaction'
  AND (NOW() - xact_start) > TIME '00:00:01'
ORDER BY
  idle DESC
LIMIT
  10;

Пример выходных данных:

| idle   | datname  | usename  | client_addr | application_name | pid   | client_port | query  | state               |
|--------|----------|----------|-------------|------------------|-------|-------------|--------|---------------------|
| 22     | postgres | postgres | 10.xx.xx.xx | psql             | 31990 | 55300       | BEGIN; | idle in transaction |

SQL query 16#

SELECT datname, pg_catalog.pg_get_userbyid(datdba) AS owner,pg_size_pretty(pg_catalog.pg_database_size(datname)) AS size FROM pg_catalog.pg_database ORDER BY datname

Пример выходных данных:

| datname  | owner    | size     |
|----------|----------|----------|
| First_db | db_admin | 15 MB    |
| postgres | postgres | 10049 kB | 

SQL query 17#

SELECT (sum(total_exec_time) / sum(calls))::integer AS avg_time
FROM pg_stat_statements;

Пример выходных данных:

| avg_time |
|----------|
| 29       |

SQL query 18#

SELECT setting, name FROM pg_settings WHERE name IN ('wal_keep_size', 'synchronous_commit', 'synchronous_standby_names');

Пример выходных данных:

| setting              | name                      |
|----------------------+---------------------------|
| on                   | synchronous_commit        |
|                      | synchronous_standby_names |
| 0                    | wal_keep_size             |

SQL Query 19#

Примечание

Необходимо взять дельту данного запроса с разницей в 1 секунду.

SELECT PG_CURRENT_WAL_LSN() - '0/0' AS wal_amount;

Пример выходных данных:

| wal_amount    |
|---------------|
| 1391096576968 |

SQL Query 20#

Примечание

Необходимо взять дельту данного запроса с разницей в 1 секунду.

SELECT wal_bytes FROM pg_stat_wal;

Пример выходных данных:

| wal_bytes |
|-----------|
| 13117649  |

SQL Query 21#

SELECT MAX(last_autovacuum) last_autovacuum FROM pg_stat_all_tables;

Пример выходных данных:

| last_autovacuum                  |
|----------------------------------|
| 2024-06-05 12:24:06.813647+00:00 |

SQL Query 22#

Примечание

Данный SQL-запрос используется для БД Platform V Pangolin DB (PSQ).

SHOW installer.cluster_type;

Пример выходных данных:

| installer.cluster_type     |
|----------------------------|
| standalone-postgresql-only | 

SQL Query 23#

SELECT CAST(pg_current_wal_insert_lsn() AS VARCHAR) AS current_lsn

Пример выходных данных:

| current_lsn                      |
|----------------------------------|
| 0/B5E3E2B8 |

SQL Query 24#

SELECT name, setting FROM pg_settings 
WHERE name IN ('shared_buffers', 'work_mem', 'maintenance_work_mem', 'autovacuum_max_workers', 'wal_level')
ORDER BY name

Пример выходных данных:

| name                   | setting |
|------------------------|---------|
| autovacuum_max_workers | 3       |
| maintenance_work_mem   | 65536   |
| shared_buffers         | 16384   |
| wal_level              | replica |
| work_mem               | 4096    |

SQL Query 25#

SELECT datname, client_addr, usename, 
CASE WHEN (state IS NULL) THEN 'system_process' ELSE state END, count(*) AS COUNT
FROM pg_stat_activity GROUP BY datname, client_addr, usename, state
ORDER BY datname, client_addr;

Пример выходных данных:

| datname   | client_addr | usename   | state                | count |
|-----------|-------------|-----------|----------------------|-------|
| postgres  | 10.0.0.27   | postgres  | idle in transaction  | 10    |

SQL Query 26#

SELECT datname, pg_catalog.pg_get_userbyid (datdba) AS owner,
pg_catalog.pg_encoding_to_char (encoding) AS encoding,
datcollate, datctype, datallowconn, datconnlimit,
pg_size_pretty(pg_catalog.pg_database_size (datname)) AS size,
t.spcname AS tablespace,
CASE WHEN pg_catalog.pg_tablespace_location (t.oid) = '' THEN 'default'
ELSE pg_catalog.pg_tablespace_location (t.oid) END AS location,
pg_catalog.shobj_description (d.oid, 'pg_database') AS description
FROM pg_catalog.pg_database d
JOIN pg_catalog.pg_tablespace t ON d.dattablespace = t.oid
ORDER BY datname

Пример выходных данных:

| datname  | owner    | encoding  | datcollate  | datctype    | datallowconn  | datconnlimit  | size     | Tablespace  | Location                            | Description                                |
|----------|----------|-----------|-------------|-------------|---------------|---------------|----------|-------------|-------------------------------------|--------------------------------------------|
| First_db | db_admin | UTF8      | en_US.UTF-8 | en_US.UTF-8 | t             | -1            | 15 MB    | Tbl_t       | default                             |                                            |
| postgres | postgres | UTF8      | en_US.utf-8 | en_US.utf-8 | t             | -1            | 10049 kB | pg_default  | /var/lib/postgresql/data/pg_default | default administrative connection database |

SQL Query 27#

SELECT name, unit, setting, context, vartype, source, boot_val, reset_val
FROM pg_settings ORDER BY name;

Пример выходных данных:

| name                 | unit  | setting | context | vartype | source   | boot_val | reset_val |
|----------------------|-------|---------|---------|---------|----------|----------|-----------|
| auth_activity_period | s     | 60      | sighup  | integer | default  | 60       | 60        |
| array_nulls          | None  | on      | user    | bool    | default  | on       | on        |