Описание
Ссылка на публичный репозиторий: https://git.angara.cloud/gbgreenplum/greenplum.metric.hook
greenplum.metric.hook - динамическая библиотека расширений для Greenplum, устанавливаемая на все хосты кластера (мастер и сегменты).
Расширения позволяют собирать статистики и метрики выполняемых запросов.
Собираемые данные передаются агенту (greenplum.metric.agent).
- Подробнее о собираемых данных см. в разделе Метрики.
- Подробнее об агенте см. на странице greenplum.metric.agent.
Перед началом работы с библиотекой greenplum.metric.hook необходимо выполнить установку и настройку. Подробнее на соответствующих страницах:
Метрики
Данные, собираемые для анализа запросов в Greenplum, передаются агенту (greenplum.metric.agent) посредством протокола gRPC.
Полное описание формата взаимодействия и структуры передаваемых данных представлено в файлах описания протокола, расположенных в каталоге protos проекта.
- Ссылка на каталог
protos: https://git.angara.cloud/gbgp/greenplum.metric/greenplum.metric.hook/-/tree/master/protos?ref_type=heads
Схема выполнения запроса в базе данных Greenplum представлена ниже:

В ядре PostgreSQL предусмотрен набор глобальных переменных с указателями на список функций. Эти переменные проверяются в различные моменты работы СУБД, после чего производится запуск всей цепочки функций.
Библиотека использует следующий список хуков (функций):
- ExecutorStart_hook - вызывается в начале выполнения любого плана запроса
- ExecutorRun_hook - вызывается во время выполнения любого плана запроса после ExecutorStart_hook
- ExecutorFinish_hook - вызывается после последнего ExecutorRun_hook
- ExecutorEnd_hook - вызывается в конце выполнения любого плана запроса
- query_info_collect_hook - дополнительный хук, который добавлен только в ядро GreenPlum. Вызывается на следующих стадиях выполнения запроса и узлов графа запроса, когда приходит соответствующий status:
- METRICS_QUERY_SUBMIT - инициализация запроса
- METRICS_QUERY_START - старт запроса
- METRICS_PLAN_NODE_INITIALIZE - инициализация расчёта вершины графа плана запроса
- METRICS_PLAN_NODE_EXECUTING - расчёт вершины графа запроса
- METRICS_PLAN_NODE_FINISHED - запускается при окончании расчёта каждой вершины графа запроса
- METRICS_QUERY_DONE - завершение запроса
- METRICS_INNER_QUERY_DONE - завершение подзапроса (на данный момент не используется)
- METRICS_QUERY_ERROR - возникновение ошибки
- METRICS_QUERY_CANCELING - во время отмены запроса
- METRICS_QUERY_CANCELED - после отмены запроса
На каждом из этих вышеперечисленных этапов выполнения запроса осуществляется сбор статистических данных, которые впоследствии передаются на сервер для дальнейшей обработки и анализа.
Список метрик
В каждом пакете с метриками передается общая информация, идентифицирующая запрос:
QueryInfoHeader
| Атрибут | Тип | Описание |
|---|---|---|
| datetime | timestamp | Локальное время на сегменте выполняющим часть запроса |
| pid | int32 | Process ID - идентификатор процесса |
| gpIdentity | GpId | Данные о базе данных (см. ниже) |
| tmid | int32 | Идентификатор транзакции |
| ssid | int32 | Идентификатор сессии |
| ccnt | int32 | Номер команды в сессии |
GpId
| Атрибут | Тип | Описание |
|---|---|---|
| dbid | int32 | Идентификатор базы данных на сегменте |
| segindex | int32 | Идентификатор сегмента |
| gp_role | GpRoleValue | Роль greenplum, в которой была запущена база |
| gp_session_role | GpRoleValue | Роль greenplum в текущей сессии |
GpRoleValue
- gp_role_utility - роль, при которой происходит подключение в режиме утилиты как к базе данных PostgreSQL, а не кластеру
- gp_role_dispatch - роль диспетчера параллельных запросов
- gp_role_execute - роль исполнителя параллельных запросов
Информация о текущем запросе и сессии
SessionInfo
| Атрибут | Тип | Описание |
|---|---|---|
| sql | string | Текст выполняемого запроса |
| userName | string | Имя пользователя, запустившего запрос |
| databaseName | string | Имя базы данных, в которой запущен запрос |
| resourceGroup | string | Текущее имя ресурсной группы. Может изменятся в ходе выполнения запроса |
| applicationName | string | Название приложения вызвавшего запрос |
| params | repeated KeyValuePair | Список предопределенных параметров, значение которых отправляется в начале выполнения запроса. Список параметров задается настройкой metric.user_params |
Информация о процессе выполняющем запрос
Для каждого процесса, участвующего в выполнении запроса, собирается системная статистика использования ресурсов (процессор, оперативная память, дисковые операции).
Данные по использованию процесора
CpuStat
| Атрибут | Тип | Описание |
|---|---|---|
| runningTimeSeconds | double | Общее время с момента запуска процесса в секундах |
| userTimeSeconds | double | Время работы в пользовательском пространстве в секундах |
| kernelTimeSeconds | double | Время работы на уровне ядра в секундах |
Данные по использованию памяти
MemoryStat
| Атрибут | Тип | Описание |
|---|---|---|
| vsize | uint64 | Размер виртуальной памяти в байтах |
| rss | uint64 | Число страниц выделенных процессом в реальной памяти |
| VmSizeKb | uint64 | Размер виртуальной памяти в Кб (данные из /proc/[pid]/status) |
| VmPeakKb | uint64 | Максимальный размер виртуальной памяти в Кб (данные из /proc/[pid]/status) |
Ссылки на документацию Linux:
- https://man7.org/linux/man-pages/man5/proc_pid_stat.5.html
- https://man7.org/linux/man-pages/man5/proc_pid_status.5.html
Данные по работе с дисками
StorageStat
| Атрибут | Тип | Описание |
|---|---|---|
| rchar | uint64 | Число символов, запрошенных для чтения приложением |
| wchar | uint64 | Число символов, запрошенных для записи приложением |
| syscr | uint64 | Число операций чтения |
| syscw | uint64 | Число операций записи |
| read_bytes | uint64 | Примерное число байт, которое было реально прочитано с диска |
| write_bytes | uint64 | Примерное число байт, которое было реально записано на диск |
| cancelled_write_bytes | uint64 | Число байт, запись которых была отменена |
Ссылка на документацию Linux: https://man7.org/linux/man-pages/man5/proc_pid_io.5.html
План запроса
На этапе инициализации выполнения запроса система сбора метрик передает информацию о сформированном плане запроса и используемом генераторе плана (планировщик или оптимизатор). План запроса фиксируется и отправляется в двух форматах:
- Текстовое представление, аналогичное выводу команды EXPLAIN
- Структурированное представление в виде дерева узлов плана
В процессе выполнения запроса для каждого шага плана собирается и передается статистика об ожидаемой стоимости операции, оцененной оптимизатором.
MetricPlan
| Атрибут | Тип | Описание |
|---|---|---|
| type | GpdbNodeType | Тип шага. Список допустимых вариантов в GpdbNodeType.proto |
| plan_node_id | int32 | Уникальный идентификатор шага запроса |
| parent_plan_node_id | int32 | Идентификатор родителя. Для корня - 0 |
| startup_cost | double | Расчетное время затраченное до начала вывода данных |
| total_cost | double | Расчетное время выдачи всех данных, считая что выполнится до конца |
| plan_rows | double | Расчетное число строк, считая что выполнится до конца |
| plan_width | int32 | Расчетное средняя ширина строки в байтах |
| motionInfo | MetricMotionInfo | Дополнительная информация о motion node |
| relationInfo | MetricRelationInfo | Информация об участвующем в операции объеке |
| scanIndexName | string | Для скан нод имя индекса |
| scanDirection | ScanDirection | Для скан нод направление сканирование |
| sliceInfo | MetricSliceInfo | Информация о slice текущего шага |
| statement | string | В зависимости от типа шага информация о фильтрах ввиде JSON объекта сериализованного в строку |
MetricInstrumentation - реальная статистика выполнения запроса
| Атрибут | Тип | Описание |
|---|---|---|
| ntuples | uint64 | Общее число произведенных строк |
| nloops | uint64 | Число циклов при выполнении этого шага |
| tuplecount | uint64 | Число строк в текущем цикле |
| firsttuple | double | Время затраченое на получение первой строчки в этом цикле |
| startup | double | Время затраченное до начала вывода данных |
| total | double | Общее время выдачи данных |