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

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

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

Примечание

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

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

№ виджета

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

SQL-запрос

Описание

1

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

SQL group 1

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

2

Подключения

SQL group 2

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

3

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

SQL group 3

Отображает данные о производительности СУБД

4

Транзакции

SQL group 5

Содержит статистическую информацию о транзакциях в конкретной СУБД

5

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

SQL group 6

Содержит информацию о транзакциях со статусом active и idle in transaction в конкретной СУБД

6

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

SQL group 5

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

7

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

SQL group 4

Содержит информацию о БД в конкретной СУБД

8

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

SQL group 3
SQL group 7

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

9

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

SQL group 8

Максимальное число незамороженных транзакций

10

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

SQL group 10

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

11

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

SQL group 11

Отображает данные, когда очистка запускалась демоном автоочистки

12

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

SQL group 12

Отображает количество буферов (в процентах), очищенных с помощью процесса контрольной точки

13

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

SQL group 9

Параметры конфигурации конкретной СУБД

14

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

SQL group 13

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

SQL group 1#

Запрос для PostgreSQL версии 13 и выше:

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

Запрос для остальных версий:

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         |

Запрос:

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     |

Дополнительный запрос для СУБД Pangolin:

SHOW installer.cluster_type

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

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

SQL group 2#

Запрос:

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                             |

Запрос:

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     |

Запрос для полного экрана:

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.xx.xx.xx   | postgres  | idle in transaction  | 10    |

SQL group 3#

Запрос выполняется повторно через одну секунду и вычисляется разница значений.

Запрос для PostgreSQL версии 14 и выше:

SELECT
  (SELECT wal_bytes AS wal_amount FROM pg_stat_wal) AS wal_count,
  (SELECT sum(xact_commit + xact_rollback) FROM pg_stat_database) AS transaction_count,
  (SELECT sum(calls) s FROM pg_stat_statements) AS query_count;

Запрос для остальных версий PostgreSQL:

SELECT
  (SELECT PG_CURRENT_WAL_LSN() - '0/0' AS wal_amount) AS wal_count,
  (SELECT sum(xact_commit + xact_rollback) FROM pg_stat_database) AS transaction_count,
  (SELECT sum(calls) s FROM pg_stat_statements) AS query_count;

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

| wal_count   | transaction_count | query_count |
|-------------|-------------------|-------------|
| 25385592    | 12847295          | 10823943    |

Запрос для PostgreSQL версии 13 и выше:

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

Запрос для остальных версий PostgreSQL:

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

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

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

SQL group 4#

Запрос:

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 |

Запрос для полного экрана:

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      |          |                                            |
| postgres    | postgres  | UTF8     | en_US.utf-8 | en_US.utf-8 | t            | -1           | 10049 kB  | pg_default | default  | default administrative connection database |

SQL group 5#

Запрос:

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)::bigint AS commit_sum,
  sum(xact_rollback)::bigint AS rollback_sum
FROM
  pg_stat_database;

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

| cache_hit_ratio | commit_ratio | commit_sum      | rollback_sum |
|-----------------|--------------|-----------------|--------------|
| 100.0           | 90.0         | 12109282        | 1344763      |

SQL group 6#

Запрос:

SELECT
  EXTRACT(
    epoch
    FROM
      (
        CASE
          WHEN STATE = 'active' THEN age (NOW(), query_start)
        END
      )
  )::integer AS active
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
  1;

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

| active |
|--------|
| 62     |

Запрос:

SELECT
  EXTRACT(
    epoch
    FROM
      (
        CASE
          WHEN STATE = 'idle in transaction' THEN age (NOW(), query_start)
        END
      )
  )::integer AS idle
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
  1;

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

| idle |
|------|
| 133  |

Запрос для полного экрана:

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;

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

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

Запрос:

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

Запрос:

SELECT CAST(pg_current_wal_insert_lsn() AS VARCHAR) AS current_lsn;

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

| current_lsn |
|-------------|
| 0/1839930   |

SQL group 8#

Запрос:

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

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

| frozen_age |
|------------|
| 21         |

SQL group 9#

Запрос:

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                   |

Запрос для полного экрана:

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  | 
|--------|------|----------|---------|---------|--------------------|----------|------------|
| 22     | None | ISO, MDY | user    | string  | configuration file | ISO, MDY  | ISO, MDY  |

SQL group 10#

Запрос:

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

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

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

SQL group 11#

Запрос:

SELECT max(last_autovacuum) last_autovacuum FROM pg_stat_all_tables;

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

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

SQL group 12#

Запрос для PostgreSQL версии ниже 17:

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

Запрос для PostgreSQL 17:

WITH
  chkp AS (
    SELECT
      buffers_written::numeric AS buffers_checkpoint
    FROM
      pg_stat_checkpointer
  ),
  bgw AS (
    SELECT
      buffers_clean::numeric
    FROM
      pg_stat_bgwriter
  ),
  io AS (
    SELECT
      SUM(writes * op_bytes)::numeric AS buffers_backend
    FROM
      pg_stat_io
    WHERE
      backend_type = 'client backend'
      AND context IN ('normal', 'vacuum')
  )
SELECT
  ROUND(
    100.0 * chkp.buffers_checkpoint / NULLIF(
      (
        chkp.buffers_checkpoint + bgw.buffers_clean + io.buffers_backend
      ),
      0
    ),
    1
  ) AS clean_by_chkp
FROM
  chkp,
  bgw,
  io;

Запрос для PostgreSQL версии выше 18:

WITH
  chkp AS (
    SELECT
      buffers_written::numeric AS buffers_checkpoint
    FROM
      pg_stat_checkpointer
  ),
  bgw AS (
    SELECT
      buffers_clean::numeric
    FROM
      pg_stat_bgwriter
  ),
  io AS (
    SELECT
      SUM(write_bytes)::numeric AS buffers_backend
    FROM
      pg_stat_io
    WHERE
      backend_type = 'client backend'
      AND context IN ('normal', 'vacuum')
  )
SELECT
  ROUND(
    100.0 * chkp.buffers_checkpoint / NULLIF(
      (
        chkp.buffers_checkpoint + bgw.buffers_clean + io.buffers_backend
      ),
      0
    ),
    1
  ) AS clean_by_chkp
FROM
  chkp,
  bgw,
  io;

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

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

SQL group 13#

Запрос:

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

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

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

Запрос:

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              |