Бизнес метрики сервиса inform#

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

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

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

Имя метрики

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

Описание

Версия PostgreSQL и версия Pangolin

Query 1

Время старта СУБД и время работы СУБД + роль в кластере + дата обновления конфигурации

Query 2

Репликация и конфигурация репликации

Query 3
Query 4

Статус подключения

Query 5
Query 6

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

Для PostgreSQL 13 и Pangolin 5: Query 7; Query 8, Query 17.
Для остальных версий: Query 7, Query 8, Query 9

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

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

Query 10

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

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

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

Зацикливание

Query 12

Оценка в процентах количества доступных номеров счетчиков транзакций. Вычисляется по формуле max(round(100\*(age(datfrozenxid)/2147483647)))

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

Query 13

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

Транзакции > 1 мин

Query 14
Query 15

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

Список БД

Query 16

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

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'));

Пример выходных данных для Pangolin 4, 5:

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

| 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.40.0.166  | 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 round((sum(total_time) / sum(calls))::numeric , 3) AS avg_time
FROM pg_stat_statements;

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

| avg_time |
|----------|
| 29.802   |

SQL Query 10#

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

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

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

SQL Query 11#

SELECT round((100*sum(blks_hit)/(sum(blks_hit) + sum(blks_read)))::numeric , 3) as cache_hit_ratio,  round((100 * sum(xact_commit) /(sum(xact_commit) + sum(xact_rollback)))::numeric, 3) as commit_ratio FROM pg_stat_database;

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

| cache_hit_ratio  | commit_ratio |
|------------------+--------------|
| 99.999           | 99.956       |

SQL Query 12#

SELECT max(round(100*(age(datfrozenxid)/2147483647))) AS percent_towards_wraparond FROM pg_database;

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

| percent_towards_wraparound   |
|------------------------------|
| 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)) AS idle,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' LIMIT 10;

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

| idle                  | datname  | usename  | client_addr | application_name | pid   | client_port | query                  | state  |
|-----------------------+----------+----------+-------------+------------------+-------+-------------+------------------------+--------|
| 78.749085             | postgres | postgres | 10.40.20.3  | 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)) 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:01:00' LIMIT 10;

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

| idle          | datname  | usename  | client_addr | application_name | pid   | client_port | query  | state               |
|---------------+----------+----------+-------------+------------------+-------+-------------+--------+---------------------|
| 22.921783     | postgres | postgres | 10.40.20.3  | 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"
                    ,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 | 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 administrative connection database  |

SQL Query 17#

SELECT round((sum(total_exec_time) / sum(calls))::numeric , 3) AS avg_time
FROM pg_stat_statements;

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

| avg_time |
|----------|
| 29.664   |

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             |