Перейти к основному содержимому

Экспортеры

Управление конфигурацией экспортеров

Некоторые экспортеры (например, blackbox_exporter или snmp_exporter) требуют собственных конфигурационных файлов, чтобы:

  • Задавать параметры проверок (например, HTTP-запросы для blackbox_exporter).
  • Определять, какие OID собирать для SNMP.
  • Настраивать логику работы (например, фильтрацию или агрегацию данных перед экспортом).

Без конфигурации экспортеры могут либо не работать, либо собирать ненужные/избыточные данные.

Памир позволят управлять конфигурацией экспортеров через:

  • создание конфигурационного файла и подключение его в docker-compose.additional
  • Redis:
    Способ конфигурирования подходит для некоторых экспортеров, поставляемых в дистрибутиве Памир.
  • инъекцию файла конфигурации напрямую в контейнер.

Инъекция файла конфигурации

PAMIR docker-tool позволяет управлять конфигурацией экспортёров (например, blackbox_exporter, snmp_exporter, postgres_exporter) с помощью набора общих параметров и одного из трёх методов применения изменений. Выбор метода зависит от архитектуры и возможностей конкретного экспортёра.

Общие параметры конфигурации

Параметры указываются независимо от выбранного метода и являются обязательными:

  • URL к Docker серверу: Адрес для доступа к Docker API (например, unix:///tmp/docker.sock).
  • Контейнер: Имя или идентификатор контейнера, в который будет внедрён конфигурационный файл.
  • Конфигурация: YAML-файл с параметрами настройки экспортёра.
  • Путь хранения конфигурации: Путь внутри контейнера, куда будет скопирован YAML-файл (например, /etc/exporter/config.yml).

Методы настройки конфигурации

После задания общих параметров необходимо выбрать один из методов применения изменений:

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

    • Endpoint — адрес, по которому экспортер получает конфигурацию или ожидает команду перезагрузки (например, POST http://prometheus:9090/-/reload).
  2. Выполнение команды
    Подходит для экспортеров, у которых нет готового endpoint, но есть внутренняя утилита (например, goreman) для перезагрузки процесса.

    • Команда — строка, которая выполняется внутри контейнера. Например:
      goreman run restart sql_exporter

    или другой способ, позволяющий применить новую конфигурацию без перезапуска всего контейнера.

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

Пример настройки postgres_exporter через PAMIR docker-tool: "dockertool"


Blackbox exporter

Blackbox exporter, входящий в состав Памир конфигурируется через Redis. Экспортер ожидает конфигурацию в ключе - /exporter/blackbox

Конфигурация используется для настройки модулей Blackbox Exporter, которые определяют, как проводить проверки различных типов (HTTP, TCP, ICMP, DNS и т.д.). Ниже приведено описание всех основных параметров конфигурации.

Общая структура конфигурации

modules:
module_name: # Имя модуля (например, http_2xx, tcp_connect, icmp)
prober: <prober_type> # Тип проверки: http, tcp, icmp, dns
[timeout: <duration>] # Таймаут для проверки (по умолчанию 10s)
[http: <http_config>] # Конфигурация для HTTP/HTTPS
[tcp: <tcp_config>] # Конфигурация для TCP
[icmp: <icmp_config>] # Конфигурация для ICMP
[dns: <dns_config>] # Конфигурация для DNS

Параметры для всех типов проверок (prober)

  • prober (обязательный): Тип проверки. Возможные значения:

    • http — для HTTP/HTTPS проверок.
    • tcp — для TCP-проверок.
    • icmp — для ICMP (ping) проверок.
    • dns — для DNS-запросов.
  • timeout (опциональный): Таймаут для выполнения проверки. По умолчанию — 10s. Пример:

    timeout: 5s

Параметры для HTTP/HTTPS (http)

http:
# Основные параметры
[preferred_ip_protocol: <string>] # Предпочитаемый протокол: "ip4" или "ip6"
[ip_protocol_fallback: <boolean>] # Разрешить fallback на другой протокол (по умолчанию true)
[valid_status_codes: [<int>, ...]] # Список допустимых HTTP-статусов (по умолчанию 2xx)
[method: <string>] # HTTP-метод (по умолчанию GET)
[headers: # Заголовки HTTP-запроса
<header_name>: <header_value>
...]
[body: <string>] # Тело HTTP-запроса
[no_follow_redirects: <boolean>] # Не следовать редиректам (по умолчанию false)
[fail_if_ssl: <boolean>] # Считать проверку неудачной, если используется SSL
[fail_if_not_ssl: <boolean>] # Считать проверку неудачной, если SSL не используется
[tls_config: <tls_config>] # Настройки TLS
[basic_auth: <basic_auth>] # Настройки базовой аутентификации
[bearer_token: <string>] # Токен для аутентификации
[proxy_url: <string>] # URL прокси-сервера
[fail_if_body_matches_regexp: [<regex>, ...]] # Считать проверку неудачной, если тело ответа совпадает с regexp
[fail_if_body_not_matches_regexp: [<regex>, ...]] # Считать проверку неудачной, если тело ответа не совпадает с regexp
[fail_if_header_matches: # Считать проверку неудачной, если заголовок совпадает с regexp
[<header_name>: <regex>, ...]]
[fail_if_header_not_matches: # Считать проверку неудачной, если заголовок не совпадает с regexp
[<header_name>: <regex>, ...]]

Пример HTTP-модуля:

modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
valid_status_codes: [200, 301]
headers:
User-Agent: "Blackbox Exporter"
fail_if_body_matches_regexp:
- "error"

Параметры для TCP (tcp)

tcp:
[preferred_ip_protocol: <string>] # Предпочитаемый протокол: "ip4" или "ip6"
[ip_protocol_fallback: <boolean>] # Разрешить fallback на другой протокол (по умолчанию true)
[query_response: # Проверка ответа от сервера
- [<send>, <expect>] # Отправить данные и ожидать ответ
...]
[tls_config: <tls_config>] # Настройки TLS

Пример TCP-модуля:

modules:
tcp_connect:
prober: tcp
tcp:
query_response:
- ["hello", "world"]

Параметры для ICMP (icmp)

icmp:
[preferred_ip_protocol: <string>] # Предпочитаемый протокол: "ip4" или "ip6"
[ip_protocol_fallback: <boolean>] # Разрешить fallback на другой протокол (по умолчанию true)

Пример ICMP-модуля:

modules:
ping:
prober: icmp
icmp:
preferred_ip_protocol: "ip4"

Параметры для DNS (dns)

dns:
[preferred_ip_protocol: <string>] # Предпочитаемый протокол: "ip4" или "ip6"
[ip_protocol_fallback: <boolean>] # Разрешить fallback на другой протокол (по умолчанию true)
[query_name: <string>] # DNS-имя для запроса (по умолчанию "example.com")
[query_type: <string>] # Тип DNS-запроса (например, "A", "AAAA", "MX")
[valid_rcodes: [<string>, ...]] # Допустимые коды ответа (например, "NOERROR")
[validate_answer_rrs: # Валидация ответа
[fail_if_matches_regexp: [<regex>, ...]]
[fail_if_not_matches_regexp: [<regex>, ...]]]
[validate_authority_rrs: # Валидация authority-секции
[fail_if_matches_regexp: [<regex>, ...]]
[fail_if_not_matches_regexp: [<regex>, ...]]]
[validate_additional_rrs: # Валидация additional-секции
[fail_if_matches_regexp: [<regex>, ...]]
[fail_if_not_matches_regexp: [<regex>, ...]]]

Пример DNS-модуля:

modules:
dns_check:
prober: dns
dns:
query_name: "example.com"
query_type: "A"
valid_rcodes: ["NOERROR"]

Настройки TLS (tls_config)

Используется для HTTP и TCP проверок с SSL/TLS.

tls_config:
[insecure_skip_verify: <boolean>] # Пропустить проверку сертификата (по умолчанию false)
[ca_file: <string>] # Путь к CA-сертификату
[cert_file: <string>] # Путь к клиентскому сертификату
[key_file: <string>] # Путь к приватному ключу
[server_name: <string>] # Имя сервера для SNI

Базовая аутентификация (basic_auth)

Используется для HTTP проверок.

basic_auth:
[username: <string>] # Имя пользователя
[password: <string>] # Пароль

Пример полного конфигурационного файла

modules:
http_2xx:
prober: http
timeout: 5s
http:
preferred_ip_protocol: "ip4"
valid_status_codes: [200]
headers:
User-Agent: "Blackbox Exporter"
fail_if_body_matches_regexp:
- "error"

tcp_connect:
prober: tcp
tcp:
query_response:
- ["hello", "world"]

ping:
prober: icmp
icmp:
preferred_ip_protocol: "ip4"

dns_check:
prober: dns
dns:
query_name: "example.com"
query_type: "A"
valid_rcodes: ["NOERROR"]

SNMP exporter

SNMP exporter, входящий в состав Памир конфигурируется через Redis. Экспортер ожидает конфигурацию в ключе - /exporter/snmp

Особенности - настройки аутентификации могут быть указаны в качестве URL параметров. Snmp exporter функционирующий в рамках Памир не должен принимать внешние вызовы с параметрами аутентификации, указанными в URL, это не безопасно. Параметры аутентификации, доступные через URL:

  • version
  • community
  • security_level
  • username
  • password
  • auth_protocol
  • priv_protocol
  • priv_password
  • context_mame

JSON

PostgreSQL

PostgreSQL Exporter — инструмент для сбора системных и пользовательских метрик из PostgreSQL. Он предоставляет данные по активным подключениям, транзакциям, блокировкам, использованию кеша, автоматическому вакуумированию и другим критическим показателям работы СУБД. Эти метрики необходимы для построения эффективной системы мониторинга и обеспечения стабильности, производительности и отказоустойчивости PostgreSQL.

PostgreSQL Exporter, входящий в состав системы Pamir, конфигурируется через docker-tool, контейнер pamir-postgres-exporter-1.

Пример настройки auth module

auth_modules:
pamir:
type: userpass
userpass:
username: log
password: pass
options:
sslmode: disable

Настраиваем модуль аутентификации pamir

Пример использования auth module в Шаблоне Мониторинга

- labels:
ci_id: '[[fields.ci_id]]'
ci_name: '[[fields.ci_name]]'
metric_name: '[[fields.metric_name]]'
template_name: '[[fields.template_name]]'
instance: '[[attributes.instance]]'
database: '[[attributes.database]]'
auth_module: 'pamir'
targets:
- '[[attributes.instance]]/[[attributes.database]]'

Используем модуль аутентификации pamir в ШМ

Коллекторы PostgreSQL Exporter:

PostgreSQL Exporter использует ряд коллекторов для извлечения метрик из СУБД PostgreSQL:

  • collector.database
    Собиратель метрик на уровне базы данных (например, состояние и статистика запросов).
    По умолчанию: включен.

  • collector.database_wraparound
    Отслеживает метрики, связанные с wraparound транзакционными идентификаторами, чтобы предотвратить сбои при отсутствии регулярного вакуума.
    По умолчанию: отключен.

  • collector.locks
    Собирает метрики блокировок, фиксируя общее число активных блокировок в СУБД.
    По умолчанию: включен.

  • collector.long_running_transactions
    Отслеживает транзакции, выполнение которых превышает установленное время, позволяя выявлять зависшие или медленные операции.
    По умолчанию: отключен.

  • collector.postmaster
    Собиратель метрик, связанных с основным процессом PostgreSQL (postmaster).
    По умолчанию: отключен.

  • collector.process_idle
    Фиксирует метрики простаивающих (idle) процессов.
    По умолчанию: отключен.

  • collector.replication
    Собирает метрики, относящиеся к репликационным процессам, включая задержки и статус.
    По умолчанию: включен.

  • collector.replication_slot
    Отслеживает использование и состояние replication slot для репликации.
    По умолчанию: включен.

  • collector.stat_activity_autovacuum
    Получает статистику автоваакуумных процессов из активности сессий.
    По умолчанию: отключен.

  • collector.stat_bgwriter
    Собирает статистику фонового процесса записи (background writer), влияющего на контрольные точки.
    По умолчанию: включен.

  • collector.stat_database
    Фиксирует статистику на уровне базы данных (например, количество транзакций, активных подключений).
    По умолчанию: включен.

  • collector.stat_progress_vacuum
    Отслеживает данные о ходе выполнения операций VACUUM для отдельных таблиц.
    По умолчанию: включен.

  • collector.stat_statements
    Собирает метрики по выполнению SQL-запросов с использованием расширения pg_stat_statements.
    По умолчанию: отключен.

  • collector.stat_user_tables
    Отслеживает статистику по пользовательским таблицам (например, количество строк, операции вставки, обновления и удаления).
    По умолчанию: включен.

  • collector.stat_wal_receiver
    Собирает метрики, связанные с процессом wal receiver в рамках репликации.
    По умолчанию: отключен.

  • collector.statio_user_indexes
    Фиксирует метрики ввода-вывода (I/O) для пользовательских индексов, помогая оценить их эффективность.
    По умолчанию: отключен.

  • collector.statio_user_tables
    Отслеживает метрики I/O для пользовательских таблиц (например, число операций чтения и записи с диска).
    По умолчанию: включен.

  • collector.wal
    Собирает метрики, связанные с Write-Ahead Log (WAL), такие как объём и активность записи в журнал предзаписи.
    По умолчанию: включен.

  • collector.xlog_location
    Отслеживает положение xlog (для обратной совместимости с более старыми версиями PostgreSQL).
    По умолчанию: отключен.

Включение/отключение коллекторов

Коллекторы настраиваются через использование флагов запуска PostgreSQL Exporter. Эти флаги задаются в секции сервиса postgres-exporter в файле docker-compose.additional.yml.

Пример настройки:

services:
postgres-exporter:
command:
- "--no-collector.database"
- "--collector.stat_statements"

В этом примере:

  • Флаг --no-collector.database отключает коллектор database (который включён по умолчанию).

  • Флаг --collector.stat_statements включает коллектор stat_statements (по умолчанию отключён).

SQL

SQL Exporter — это инструмент для сбора метрик из баз данных с помощью SQL-запросов. Он позволяет выполнять произвольные SQL-запросы к базам данных и преобразовывать результаты в метрики Prometheus. Ниже приведено описание всех параметров конфигурации SQL Exporter.

SQL exporter, входящий в состав Памир конфигурируется через Redis. Экспортер ожидает конфигурацию в ключе - /exporter/sql

Поддерживаются следующие базы данных:

  • Postgres
  • ClickHouse
  • AWS Athena
  • MS-SQL
  • MySQL
  • Snowflake
  • Vertica
  • Materialize

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

Общая структура конфигурации

Конфигурационный файл SQL Exporter состоит из следующих основных секций:

  1. Глобальные настройки (global): Настройки, применяемые ко всем job'ам.
  2. Настройки подключения к базе данных (jobs): Определение job'ов, каждый из которых содержит SQL-запросы и параметры подключения к базе данных.

Пример структуры:

global:
# Глобальные настройки

jobs:
- name: <job_name> # Имя job'а
dsn: <dsn_string> # Строка подключения к базе данных
[interval: <duration>] # Интервал выполнения запросов
[timeout: <duration>] # Таймаут выполнения запросов
[queries: # Список SQL-запросов
- <query_config>
...]

Глобальные настройки (global)

  • log_level (опционально): Уровень логирования. Возможные значения: debug, info, warn, error. По умолчанию — info.
  • config (опционально): Путь к конфигурационному файлу. Используется, если конфигурация загружается из другого файла.

Пример:

global:
log_level: info

Настройки job'ов (jobs)

Каждый job определяет подключение к базе данных и набор SQL-запросов для выполнения.

Основные параметры job'а:

  • name (обязательный): Уникальное имя job'а.
  • dsn (обязательный): Строка подключения к базе данных (Data Source Name). Формат зависит от типа базы данных.
    • Пример для PostgreSQL: postgresql://user:password@host:port/dbname
    • Пример для MySQL: user:password@tcp(host:port)/dbname
  • interval (опционально): Интервал выполнения запросов. По умолчанию — 1m.
  • timeout (опционально): Таймаут выполнения запросов. По умолчанию — 10s.
  • queries (обязательный): Список SQL-запросов для выполнения.

Параметры SQL-запросов (queries):

Каждый SQL-запрос настраивается с помощью следующих параметров:

  • name (обязательный): Уникальное имя запроса (используется как метка Prometheus).
  • query (обязательный): SQL-запрос для выполнения.
  • metrics (обязательный): Определение метрик, которые будут созданы на основе результата запроса.
    • metric_name: Имя метрики в Prometheus.
    • value_column: Столбец, содержащий значение метрики.
    • labels: Метки, которые будут добавлены к метрике. Ключи — имена меток, значения — столбцы из результата запроса.
  • cache_ttl (опционально): Время жизни кэша для результатов запроса.
  • timeout (опционально): Таймаут для выполнения конкретного запроса.

Пример job'а с SQL-запросами:

jobs:
- name: postgres_stats
dsn: postgresql://user:password@localhost:5432/mydb
interval: 30s
queries:
- name: user_count
query: "SELECT COUNT(*) as count FROM users"
metrics:
- metric_name: "user_count_total"
value_column: "count"
labels:
database: "mydb"
- name: active_users
query: "SELECT COUNT(*) as count FROM users WHERE active = true"
metrics:
- metric_name: "active_users_total"
value_column: "count"
labels:
database: "mydb"

Дополнительные параметры

Поддержка нескольких баз данных

Вы можете определить несколько job'ов для разных баз данных или разных запросов к одной базе данных.

Пример:

jobs:
- name: postgres_stats
dsn: postgresql://user:password@localhost:5432/mydb
queries:
- name: user_count
query: "SELECT COUNT(*) as count FROM users"
metrics:
- metric_name: "user_count_total"
value_column: "count"
labels:
database: "mydb"

- name: mysql_stats
dsn: user:password@tcp(localhost:3306)/mydb
queries:
- name: order_count
query: "SELECT COUNT(*) as count FROM orders"
metrics:
- metric_name: "order_count_total"
value_column: "count"
labels:
database: "mydb"

Использование переменных в запросах

Вы можете использовать переменные в SQL-запросах, чтобы динамически изменять параметры запроса. Например:

jobs:
- name: postgres_stats
dsn: postgresql://user:password@localhost:5432/mydb
queries:
- name: user_count_by_status
query: "SELECT status, COUNT(*) as count FROM users WHERE status = $1 GROUP BY status"
metrics:
- metric_name: "user_count_by_status"
value_column: "count"
labels:
status: "status"
params: ["active"] # Переменная $1 будет заменена на "active"

Пример полного конфигурационного файла

global:
log_level: info

jobs:
- name: postgres_stats
dsn: postgresql://user:password@localhost:5432/mydb
interval: 30s
queries:
- name: user_count
query: "SELECT COUNT(*) as count FROM users"
metrics:
- metric_name: "user_count_total"
value_column: "count"
labels:
database: "mydb"

- name: active_users
query: "SELECT COUNT(*) as count FROM users WHERE active = true"
metrics:
- metric_name: "active_users_total"
value_column: "count"
labels:
database: "mydb"

- name: mysql_stats
dsn: user:password@tcp(localhost:3306)/mydb
queries:
- name: order_count
query: "SELECT COUNT(*) as count FROM orders"
metrics:
- metric_name: "order_count_total"
value_column: "count"
labels:
database: "mydb"