Как стать автором
Обновить
256.39
Postgres Professional
Разработчик СУБД Postgres Pro

Знакомство с pgpro-otel-collector

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров2.4K

Всем привет, после публичного релиза pgpro-otel-collector, хочется продолжить рассказывать про инструмент и начать с серии постов про Коллектор. В этой серии постараюсь подробнее и на примерах познакомить читателя с коллектором и продемонстрировать сценарии использования. Рассказывать буду и про коллектор, и про разные вещи связанные с настройкой/мониторингом Postgres. Рассчитываю что посты будут полезны Linux администраторам, PostgreSQL DBA и тем кому интересен мониторинг Postgres.

Первый пост ознакомительный, в нем расскажу как установить, настроить и запустить коллектор. И конечно же, как посмотреть что-то что отдает коллектор и начнем мы с метрик Postgres.

Что нам понадобится?

  • Postgres. Понадобится виртуальная машина или docker-контейнер с Postgres внутри. Там мы поставим коллектор и настроим его на сбор метрик Postgres.

  • Prometheus, Grafana. Это также может быть виртуальная машина, хотя мне привычнее окружение в Docker Compose. Там мы сможем настроить сбор метрик с коллектора, а в Grafana попробуем что-нибудь посмотреть/нарисовать.

В этом месте я предполагаю что читатель умеет составлять промпты к ИИ, развертывать виртуалки или запускать контейнеры с нужными сервисами, поэтому развертывание и запуск окружения оставляю как самостоятельную работу. В моем же случае используется виртуальная машина запущенная корпоративной автоматизацией.

Установка коллектора

Коллектор можно установить по инструкции из документации. Установка выполняется из официального репозитория Postgres Pro. Сначала нужно скачать скрипт установки репозиториев, запустить его (скрипт пропишет репозитории пакетного менеджера в систему и обновит его метаданные). После чего установить коллектор можно будет уже с помощью пакетного менеджера. Например, для Debian-дистрибутивов это выглядит так:

wget https://repo.postgrespro.ru/otelcol/otelcol/keys/pgpro-repo-add.sh  
sudo sh ./pgpro-repo-add.sh  
sudo apt install pgpro-otel-collector

Создание пользователя СУБД

Шаг создания отдельного пользователя является дополнительным и в тестовой песочнице этим можно пренебречь, но в общем и целом, такой шаг является правилом хорошего тона. Сразу рекомендуется добавить пользователю роль pg_monitor, она обеспечит доступ ко всем системным представлениям со статистикой.

sudo -u postgres createuser --member-of=pg_monitor --pwprompt otelcol

Сразу после создания отдельного пользователя, следует убедиться что под этим пользователем можно подключиться к СУБД.

sudo -u postgres psql -U otelcol -d postgres -c 'select version()'
                                          version                                          
-------------------------------------------------------------------------------------------
 PostgreSQL 17.2 on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit

Если вдруг попытка проверки возвращает ошибку, то очень вероятно, что требуется настройка правил авторизации HBA и перезагрузка конфигурации СУБД. В официальной документации можно более подробно почитать про настройку pg_hba.conf.

Настройка коллектора

Все настройки коллектора расположены в /etc/pgpro-otel-collector/basic.yml, это конфигурационный файл в формате YAML. Следующими шагами является настройка подключения к СУБД и определение списка плагинов для сбора метрик.

Настройки подключения находятся в секции "receivers.postgrespro" и там нужно прописать реквизиты пользователя который был создан ранее.

receivers:  
  postgrespro:  
    transport: tcp  
    endpoint: localhost:5432  
    database: postgres  
    username: otelcol  
    password: secret_password

Набор плагинов также находится в секции "receivers.postgrespro.plugins". По умолчанию в коллекторе включен базовый набор плагинов который собирает метрики активности, блокировок, фоновой записи, записи WAL-журнала, использования общего кэша (shared buffers). Сбор других метрик включается через добавление отдельных плагинов в секцию. В примере ниже добавлены еще два плагина: "databases" - метрики использования баз данных (на основе представления pg_stat_database) и "io" - сбор метрик ввода-вывода (на основе представления pg_stat_io).

    plugins:  
      activity:  
        enabled: true  
      bgwriter:  
        enabled: true  
      databases:
        enabled: true
      io:
        enabled: true
      locks:  
        enabled: true  
      version:  
        enabled: true  
      wal:  
        enabled: true  
      cache:  
        enabled: true

Большинство плагинов по умолчанию выключено. Если включить вообще все плагины, то на выходе можно получить огромное количество метрик и здесь важно помнить, что сбор метрик с СУБД требует ресурсов, да и последующее хранение в системе мониторинга тоже. Поэтому стоит подходить очень аккуратно и вдумчиво к вопросу о том какие метрики следует собирать.

Полный список доступных плагинов можно найти в документации коллектора. Примеры конфигурации с включенными плагинами можно найти в файлах пакета pgpro-otel-collector, например для Debian-дистрибутивов они расположены в каталоге /usr/share/doc/pgpro-otel-collector/examples/.

Запуск коллектора

Теперь когда параметры подключения указаны и список плагинов определен, можно запускать службу коллектора. Запуск осуществляется через systemd:

sudo systemctl start pgpro-otel-collector.service

После запуска желательно проверить состояние службы:

● pgpro-otel-collector.service - PostgresPro OpenTelemetry Collector  
     Loaded: loaded (/lib/systemd/system/pgpro-otel-collector.service; disabled; preset: enabled)  
     Active: active (running) since Mon 2025-02-17 19:52:00 MSK; 10h ago  
   Main PID: 25501 (pgpro-otel-coll)  
      Tasks: 7 (limit: 3512)  
     Memory: 14.3M  
        CPU: 15.942s  
     CGroup: /system.slice/pgpro-otel-collector.service  
             └─25501 /usr/bin/pgpro-otel-collector --config /etc/pgpro-otel-collector/basic.yml

Нас интересует состояние "active (running)", что указывает на то что коллектор успешно запустился и работает. Дополнительно, в этом же выводе ниже можно проверить журналы и убедиться в отсутствие ошибок, особенно ошибок подключения к Postgres.

Следующим шагом проверим что метрики собираются. Для этого будем использовать интерфейс общепринятый в экосистеме Prometheus - отправим HTTP-запрос на ендпоинт /metrics. Коллектор отдает метрики в формате Prometheus на порту 8889. Поэтому воспользуемся утилитой curl, отправим запрос на 127.0.0.1:8889/metrics и для начала посмотрим сколько вообще метрик есть в выводе коллектора (достаточно посчитать количество справочных строк которые содержат подстроку HELP):

curl -s 127.0.0.1:8889/metrics |grep -c HELP  
49

Итого мы получили 49 уникальных метрик. Вместо grep можно вывести вообще все метрики (их будет что-то около 200) и посмотреть на их содержимое.

Настройка сбора в Prometheus

Здесь можно привести самый простой вариант настройки, просто указав адрес коллектора:

scrape_configs:
  - job_name: "pgpro-otel-collector"
    static_configs:
      - targets: ["localhost:8889"]

В случае если Prometheus и коллектор находятся на разных сетевых узлах, то в конфигурации Prometheus, вместо localhost следует указать правильный адрес узла на котором запущен коллектор. После внесения изменений следует перезагрузить конфигурацию службы Prometheus. После этого Prometheus начнет собирать метрики с коллектора и они будут доступны для просмотра во внутреннем веб-интерфейсе Prometheus. Либо если этот экземпляр Prometheus подключен к Grafana, то можно попробовать поискать метрики там, например через инструмент Explore.

Конкретные метрики можно найти в выводе команды curl которую мы использовали выше. Или несколько метрик для примера:

  • postgresql_activity_connections - установленные соединения, кто и куда подключен;

  • postgresql_activity_wait_events - текущие события ожидания, в каких местах происходят ожидания;

  • postgresql_locks_all - текущие блокировки;

  • postgresql_cache_hit_ratio - доля успешных обращений в общий кэш;

  • postgresql_io_read_bytes_total - ввод-вывод на чтение в байтах;

  • postgresql_io_write_bytes_total - ввод-вывод на запись в байтах;

  • postgresql_wal_bytes_total - запись в WAL журнал в байтах.

Примеры запросов и графиков

Общее количество установленных соединений сгруппированных по состоянию. Показывает общую картину по соединениям и в каких состояниях они находятся.

sum by (state) (postgresql_activity_connections)
Общее количество соединений
Общее количество соединений

График соединений позволяет отслеживать наличие соединений с проблемными статусами (например бездействующие транзакции) и в целом понимать утилизацию - например на этом графике довольно много idle-соединений, что не очень рационально с точки зрения использования ресурсов.

Следующий график, общее количество ожиданий сгруппированных по типу. Показывает на ожидании каких событий тратится время.

sum by (type) (postgresql_activity_wait_events{type!~"Activity|Client|Extension|Timeout"})
Типы событий ожиданий
Типы событий ожиданий

В этом запросе отфильтрованы некоторые типы ожиданий, которые в целом безвредны и будут только загромождать график по ожиданиям. По графику видно что ожидания возникают не так часто и основные причины это периодическое ожидание на тяжелых блокировках и вводе-выводе.

Следующий график, объем чтения и записи в байтах для отдельно взятого экземпляра СУБД. В этом запросе используется переменная $instance, ее можно заменить на желаемое значение интересующего экземпляра.

sum(rate(postgresql_io_read_bytes_total{instance="$instance"}))
sum(rate(postgresql_io_write_bytes_total{instance="$instance"}))
Чтение и запись экземпляра СУБД
Чтение и запись экземпляра СУБД

Для этого графика используется два запроса. В обоих запросах выполняется суммирование значений, хотя метрика позволяет получить данные по отдельным подсистемам СУБД (фоновые службы, рабочие процессы автовакуума, клиентские сеансы и пр.).

Общий объем записи в журнал WAL по всем экземплярам.

sum(rate(postgresql_wal_bytes_total))
Запись в журнал WAL
Запись в журнал WAL

В этом запросе просуммирован объем записи по всем экземплярам и значение получилось относительно небольшим (если сравнивать с производственными окружениями).

Вот так, с помощью коллектора можно преобразовать статистику Postgres в метрики, используя возможности PromQL/MetricsQL строить графики и наблюдать за поведением СУБД во времени (а дальше алертинг, отчеты и все такое).

На сегодня все. В этой статье мы познакомились с коллектором, убедились что запустить и настроить его достаточно просто и посмотрели на примеры метрик. Впрочем, метрики это не единственная функциональность коллектора, в следующих постах постараюсь раскрыть другие возможности коллектора. Спасибо за внимание и до скорых встреч!

Теги:
Хабы:
Всего голосов 16: ↑16 и ↓0+20
Комментарии14

Публикации

Информация

Сайт
www.postgrespro.ru
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Иван Панченко