SQL-запросы получения метрик для обзорной панели#
Kintsugi использует поды сервиса inform для выполнения SQL-запросов на получение метрик для обзорной панели. Для визуального представления метрик UI обращается к inform, указывая в запросе идентификатор объекта мониторинга.
Сервис inform предоставляет следующие метрики для обзорной панели объекта мониторинга.
Примечание
Подробное описание обзорной панели объекта мониторинга представлено в «Руководстве оператора», раздел «Вкладка «Метрики»» пункт «Метрики».
Список поддерживаемых метрик#
№ виджета |
Имя виджета обзорной панели |
SQL-запрос |
Описание |
|---|---|---|---|
1 |
Статус репликации |
Содержит информацию о физической и/или логической репликации объекта мониторинга, являющегося частью кластера: какой объект подключен, активность и основные параметры |
|
2 |
Подключения |
Показывает общую статистику подключений, разделенных по типам |
|
3 |
Производительность СУБД |
Отображает данные о производительности СУБД |
|
4 |
Транзакции |
Содержит статистическую информацию о транзакциях в конкретной СУБД |
|
5 |
Длительные транзакции |
Содержит информацию о транзакциях со статусом active и idle in transaction в конкретной СУБД |
|
6 |
Процент попадания в кеш |
Оценка объема данных, берущихся из кеша shared buffers против объема прочитанного с диска |
|
7 |
Список баз данных |
Содержит информацию о БД в конкретной СУБД |
|
8 |
Журнал предзаписи (WAL) |
Объем записи данных в журнал и текущая позиция добавления в журнал предзаписи |
|
9 |
Горизонт заморозки кластера |
Максимальное число незамороженных транзакций |
|
10 |
Временные файлы |
Показывает последние значение объема данных, временно записанных на диск для выполнения запросов |
|
11 |
Последняя автоочистка |
Отображает данные, когда очистка запускалась демоном автоочистки |
|
12 |
Очищено контрольными точками |
Отображает количество буферов (в процентах), очищенных с помощью процесса контрольной точки |
|
13 |
Конфигурация PostgreSQL |
Параметры конфигурации конкретной СУБД |
|
14 |
Версии СУБД и время работы |
Отображает версии СУБД (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 |