Skip to content

Описание

Ссылка на публичный репозиторий: 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 проекта.

Схема выполнения запроса в базе данных Greenplum представлена ниже:
scheme executing sql

В ядре 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:

Данные по работе с дисками

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 Общее время выдачи данных