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

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

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

Примечание

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

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

№ виджета

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

Запрос метрики для PostgreSQL 11, 12, 13, 15

Описание

2

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

Для PostgreSQL 13: SQL query 4, SQL query 18
Для остальных версий: SQL query 3, SQL query 4

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

3

Подключения

SQL query 5
SQL query 6

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

4

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

Для PostgreSQL 13: 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 – количество запросов в секунду на момент получения данных. Вычисляется как разница суммы вызовов запросов за секунду

5

Статистика БД

SQL query 11

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

6

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

SQL query 14
SQL query 15

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

7

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

SQL query 16

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

8

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

SQL query 12

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

9

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

SQL query 13

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

10

Объем записи в WAL

Для PostgreSQL ниже 14: SQL query 19
Для PostgreSQL 14 и выше: SQL query 20

Скорость записи данных в журнал

11

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

SQL query 21

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

12

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

SQL query 10

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

13

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


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 'backend' ELSE state END, count(*) FROM pg_stat_activity GROUP BY state;

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

| state                | count |
|----------------------+-------|
| backend              | 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 FROM pg_stat_database;

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

| cache_hit_ratio | commit_ratio |
|-----------------|--------------|
| 99.9            | 99.9         |

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_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
  1;

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

| 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 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