PG-Bash Exporter — это конфигурируемый экспортер для Prometheus, написанный на Go, который позволяет собирать кастомные метрики, выполняя любые shell-команды.
- Введение
- Ключевые особенности
- Установка
- Быстрый старт
- Конфигурация
- Использование
- Документация для пользователей
Часто стандартных метрик (нагрузка на процессор, использование памяти) бывает недостаточно. Возникает необходимость следить за чем-то уникальным: например, количеством активных пользователей в приложении, числом файлов в определённой папке или результатом работы специфической программы. Писать для каждой такой мелочи отдельный экспортер — долго и неудобно. Этот инструмент решает эту проблему, позволяя описать все нужные метрики и команды для их получения в одном простом конфигурационном файле.
-
Гибкость: Позволяет собирать метрики на основе вывода любых shell-команд и скриптов.
-
Конфигурация в YAML: Все метрики настраиваются в одном YAML-файле. Поддерживается парсинг вывода одной команды на несколько метрик и создание динамических меток (labels).
-
Кэширование: Встроенный механизм кэширования для вывода команд позволяет снизить нагрузку на сервер за счет уменьшения частоты выполнения ресурсоемких скриптов.
-
Безопасность: Настраиваемый черный список команд для предотвращения выполнения потенциально опасных операций.
-
Перезагрузка конфигурации: Поддерживается перезагрузка конфигурации без перезапуска экспортера, что обеспечивает непрерывность мониторинга.
- Перейдите на страницу "релизы" в репозитории проекта.
- Найдите самый свежий релиз.
- Скачайте архив, подходящий для вашей системы (например,
pg-bash-exporter-linux-amd64.tar.gz). - Если у вас windows то нужно скачать
pg-bash-exporter-linux-amd64.exeи пропустить дальнейшие шаги 5,6,7 и перейти в Быстрый старт для запуска. - Распакуйте архив:
tar -xvf pg-bash-exporter-linux-amd64.tar.gz
- Сделайте файл исполняемым:
chmod +x pg-bash-exporter
- (Опционально) Переместите файл в директорию, которая есть в вашем
PATH, чтобы запускать его из любого места:sudo mv pg-bash-exporter /usr/local/bin/
Этот универсальный способ, который подойдет для любой операционной системы. Вам понадобится установленный Go (версии 1.21 или новее) и Git.
-
Клонируйте репозиторий:
git clone https://github.com/kvisidisi/pg-bash-exporter.git
-
Перейдите в папку проекта:
cd pg-bash-exporter -
Соберите проект: Эта команда скомпилирует экспортер в один исполняемый файл с именем
pg-bash-exporter.go build -v -o pg-bash-exporter ./cmd/exporter
После выполнения этих шагов в папке проекта появится готовый к запуску файл pg-bash-exporter.
-
Создайте файл конфигурации
Создайте файл
config.yamlсо следующим содержимым. Эта конфигурация собирает одну метрику — время работы системы.logging: level: "info" metrics: - name: "system_uptime_seconds" help: "Время работы системы в секундах." type: "counter" command: "cat /proc/uptime | awk '{print $1}'"
-
Запустите экспортер
./pg-bash-exporter --config config.yaml
-
Проверьте метрики
curl http://localhost:5252/metrics
Для Windows используется powershell в качестве оболочки по умолчанию. Команды в конфигурации должны быть написаны на PowerShell. Рекомендуется использовать пример конфигурации, созданный специально для Windows.
-
Создайте файл конфигурации
Скопируйте содержимое файла
configs/config.windows.example.yamlв новый файлconfig.yamlв той же папке где иpg-bash-exporter-windows-amd64.exe. -
Запустите экспортер
.\pg-bash-exporter-windows-amd64.exe --config .\config.yaml
-
Проверьте метрики
Invoke-RestMethod -Uri http://localhost:5252/metrics
Вся настройка экспортера происходит в одном или нескольких YAML-файлах, а также с помощью переменных окружения.
- Основной файл
config.yaml: Содержит описание метрик, глобальные настройки (таймауты, кеширование) и параметры логирования. - Переменные окружения (или файл
.env): Используются для настроек, специфичных для окружения. Переменные из.envимеют приоритет над системными.LISTEN_ADDRESS: Адрес и порт для сервера (по умолчанию:5252).METRICS_PATH: Путь для метрик (по умолчанию/metrics).BLACKLIST_FILE_PATH: Путь к YAML-файлу с дополнительным списком запрещенных команд.
global: Глобальные настройки, применяемые ко всем метрикам (например,shell,timeout,cache_ttl).logging: Настройки логирования.metrics: Основная секция, содержащая список всех кастомных метрик.
Полный пример конфигурационного файла со всеми доступными опциями и пояснениями можно найти здесь: configs/config.example.yaml.
По умолчанию все команды выполняются с помощью bash. Это поведение можно изменить как глобально, так и для каждой отдельной метрики.
- Глобальная настройка: В секции
globalфайлаconfig.yamlможно указать полеshell.global: shell: "powershell"
- Настройка для метрики: Поле
shellможно указать непосредственно в настройках метрики, что переопределит глобальное значение.metrics: - name: "windows_processes" help: "Количество процессов в Windows." type: "gauge" shell: "powershell" command: "(Get-Process).Count"
Одной из самых мощных возможностей экспортера является способность обрабатывать команды, которые возвращают несколько строк, и превращать каждую строку в уникальную метрику. Это делается с помощью комбинации постфиксных метрик (postfix_metrics) и динамических меток (dynamic_labels).
Команды, возвращающие многострочный вывод, могут приводить к попытке создания нескольких метрик с одинаковым именем и набором меток, что вызывает ошибку в Prometheus. Например, следующая команда вернет несколько строк:
$ ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c
1 ESTAB
10 LISTENЕсли вы попытаетесь собрать эти данные с помощью простой конфигурации, вы столкнетесь с проблемой. Экспортер попытается создать две метрики с одинаковым именем network_connections_by_state, что вызовет ошибку в Prometheus.
Для предотвращения дублирования метрик необходимо обеспечить их уникальность. Это достигается с помощью динамических меток, которые используют часть вывода команды в качестве значения для метки (label).
Например, для команды ss можно использовать название состояния (ESTAB, LISTEN) как значение для метки state.
Пример конфигурации:
metrics:
- name: "network_connections_by_state"
help: "Количество сетевых соединений по состояниям."
type: "gauge"
# Команда возвращает 2 колонки: [количество, состояние]
command: "ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c"
# Указываем, что значение метрики находится в первой колонке (индекс 0)
field: 0
dynamic_labels:
# Создаем метку с именем "state"
- name: "state"
# Указываем, что значение для этой метки нужно брать из второй колонки (индекс 1)
field: 1С такой конфигурацией экспортер вернет Prometheus две разные, уникальные метрики:
# HELP network_connections_by_state Количество сетевых соединений по состояниям.
# TYPE network_connections_by_state gauge
network_connections_by_state{state="ESTAB"} 1
network_connections_by_state{state="LISTEN"} 10
Теперь у вас есть отдельные временные ряды для каждого состояния, и вы можете строить по ним графики и настраивать алерты.
Ключевое правило: Если ваша команда возвращает больше одной строки, вы обязаны использовать dynamic_labels, чтобы обеспечить уникальность каждой метрики.
Экспортер собирает собственные метрики для мониторинга своей работы. Все они начинаются с префикса pg_bash_exporter_.
-
pg_bash_exporter_checks_total(counter) Счетчик общего количества запросов метрик от Prometheus. -
pg_bash_exporter_check_duration_seconds(histogram) Время, затраченное на сбор всех метрик из конфигурационного файла. -
pg_bash_exporter_command_errors_total{metric_name="..."}(counter) Счетчик ошибок выполнения команд для каждой метрики. Разделен по меткамmetric_name. -
pg_bash_exporter_cache_hits_total(counter) Количество раз, когда результат выполнения команды был взят из кеша. -
pg_bash_exporter_cache_misses_total(counter) Количество раз, когда результат выполнения команды не был найден в кеше. -
pg_bash_exporter_config_reloads_total(counter) Счетчик успешных перезагрузок конфигурации по сигналуSIGHUP. -
pg_bash_exporter_config_reload_errors_total(counter) Счетчик ошибок при перезагрузке конфигурации. -
pg_bash_exporter_command_duration_seconds{metric_name="..."}(histogram) Время выполнения каждой отдельной команды. Разделен по меткамmetric_name. -
pg_bash_exporter_concurrent_commands(gauge) Количество одновременно выполняющихся команд.
Для просмотра всех доступных флагов и переменных окружения выполните команду:
./pg-bash-exporter --help--config: Указывает путь к конфигурационному файлу. Также может быть задан через переменную окруженияCONFIG_PATH.--validate-config: Проверяет конфигурационный файл на синтаксические ошибки без запуска экспортера.
Экспортер поддерживает два способа перезагрузки конфигурации без перезапуска процесса:
-
Через HTTP-эндпоинт (рекомендуемый, кросс-платформенный): Отправьте GET-запрос на эндпоинт
/reload.curl http://localhost:5252/reload
Для Windows (PowerShell):
Invoke-RestMethod -Uri http://localhost:5252/reload
В ответ сервер вернет статус
200 OKв случае успеха или500 Internal Server Errorс описанием ошибки. -
Через системный сигнал (Linux/macOS): Отправьте процессу сигнал
SIGHUP.kill -HUP $(pgrep -f pg-bash-exporter)
Для сбора метрик добавьте следующую конфигурацию в prometheus.yml:
- job_name: 'bash_exporter'
static_configs:
- targets: ['localhost:5252'] # Укажите здесь адрес вашего экспортераДля тестирования и разработки предоставляется готовый стенд, включающий экспортер, Prometheus и Grafana.
Требования: Установленный и запущенный Docker.
Запуск:
-
Перейдите в директорию
demo:cd demo -
Выполните команду:
docker compose up --build -d
Сервисы:
- Prometheus:
http://localhost:9090 - Grafana:
http://localhost:3000(логин/пароль:admin/admin) - Экспортер:
http://localhost:5252
В Grafana будет предварительно настроен источник данных Prometheus и дашборд Bash Exporter Metrics.
Остановка:
Для остановки и удаления контейнеров выполните команду в директории demo:
docker compose down- Решение проблем (TROUBLESHOOTING.md) — Что делать, если что-то пошло не так.
- Ограничения и краевые случаи (LIMITATIONS_RU.md) — Чего экспортер не умеет делать и почему.
- Зоны ответственности пользователя (USER_RESPONSIBILITIES.md) — За что отвечаете вы при настройке и использовании.