Экспортеры
Управление конфигурацией экспортеров
Некоторые экспортеры (например, 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
).
Методы настройки конфигурации
После задания общих параметров необходимо выбрать один из методов применения изменений:
-
Вызов endpoint
Если экспортер поддерживает HTTP-ручку для перезагрузки, можно передать конфигурацию без перезапуска контейнера.- Endpoint — адрес, по которому экспортер получает конфигурацию или ожидает команду перезагрузки (например,
POST http://prometheus:9090/-/reload
).
- Endpoint — адрес, по которому экспортер получает конфигурацию или ожидает команду перезагрузки (например,
-
Выполнение команды
Подходит для экспортеров, у которых нет готового endpoint, но есть внутренняя утилита (например,goreman
) для перезагрузки процесса.- Команда — строка, которая выполняется внутри контейнера. Например:
goreman run restart sql_exporter
или другой способ, позволяющий применить новую конфигурацию без перезапуска всего контейнера.
- Команда — строка, которая выполняется внутри контейнера. Например:
-
Перезапуск контейнера
Контейнер полностью перезапускается после копирования нового файла конфигурации. Экспортер считывает и применяет её при старте. Это наиболее универсальный метод, который не требует поддержки hot-reload со стороны экспортеров.
Пример настройки postgres_exporter
через PAMIR docker-tool:
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 состоит из следующих основных секций:
- Глобальные настройки (
global
): Настройки, применяемые ко всем job'ам. - Настройки подключения к базе данных (
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
- Пример для PostgreSQL:
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"