Перейти к основному содержимому

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Конфигурация PostgreSQLSQL 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 |