6.2. Работа с метриками #
В этом разделе описаны шаги, необходимые для работы с метриками.
6.2.1. Общая настройка #
6.2.1.1. Добавление и настройка ресивера postgrespro #
Для сбора метрик с экземпляра СУБД добавьте ресивер postgrespro в секцию receivers и настройте его.
Обязательная настройка:
Укажите параметры подключения к экземпляру базы данных.
Укажите список плагинов для сбора данных.
Дополнительная настройка:
Параметры сбора: параллелизм, задержка, интервал.
receivers:
postgrespro:
max_threads: 3
collection_interval: 60s
initial_delay: 1s
transport: tcp
endpoint: localhost:5432
database: postgres
username: postgres
password: ${env:POSTGRESQL_PASSWORD}
metrics: null
plugins:
activity:
enabled: true
bgwriter:
enabled: true
locks:
enabled: true
version:
enabled: true
wal:
enabled: true
cache:
enabled: trueНекоторые плагины имеют дополнительные параметры конфигурации. Например, плагины сбора метрик по объектам СУБД (табличные пространства, базы данных, таблицы, индексы) могут настраиваться так, чтобы сбор осуществлялся по ограниченному числу объектов, позволяя таким образом управлять сбором и регулировать нагрузку на экземпляр СУБД и объём данных, отправляемых по конвейеру в экспортёр. За подробным описанием параметров конфигурации по каждому плагину обратитесь к примерам конфигурации в каталоге /usr/share/doc/pgpro-otel-collector/examples.
Ресивер также поддерживает работу через Unix-сокеты, если конечная точка определена, как показано ниже.
receivers:
postgrespro:
...
transport: unix
endpoint: /tmp:5432 # Или 'tmp:5432'
...6.2.1.2. Добавление и настройка ресивера hostmetrics #
Ресивер hostmetrics является компонентом OpenTelemetry Collector с открытым исходным кодом и используется для сбора метрик операционной системы. За подробной информацией обратитесь к документации OpenTelemetry.
Для настройки ресивера hostmetrics достаточно перечислить список плагинов (scrapers) для сбора данных. Также доступны параметры сбора: задержка и интервал.
Некоторые плагины также имеют дополнительные параметры конфигурации.
receivers:
hostmetrics:
collection_interval: 60s
initial_delay: 1s
scrapers:
cpu:
metrics:
system.cpu.utilization:
enabled: true
disk: null
load: null
memory: null
network: null6.2.1.3. Добавление и настройка ресивера SQL-запросов #
Ресивер sqlquery — компонент OpenTelemetry Collector с открытым исходным кодом для сбора метрик и/или журналов из пользовательских SQL-запросов.
Предупреждение
В настоящее время ресивер sqlquery является экспериментальным и не рекомендован для использования в производственной среде.
Чтобы настроить ресивер sqlquery для сбора метрик, используйте приведённый ниже пример.
Создайте файл конфигурации
sqlquery.yml.В созданном файле конфигурации укажите параметры подключения к базе данных в разделе
receivers.sqlquery:receivers: sqlquery: driver: postgres host: localhost port: 5432 database: postgres username: postgres password: ${env:POSTGRESQL_PASSWORD} # Дополнительные параметры подключения для драйвера additional_params: application_name: pgpro-otel-collector sslmode: disable # Интервал между выполнениями запросов. По умолчанию: 10s collection_interval: 60s # Определяет настройку телеметрии самого компонента telemetry: logs: # Если true, каждый выполненный запрос журналируется на уровне debug query: false # Максимальное количество открытых соединений с сервером Postgres Pro. По умолчанию: 0 (не ограничено) max_open_conn: 5Параметр
passwordподдерживает подстановку переменных окружения, как показано в примере. Специальные символы в учётных данных автоматически кодируются в URL-формате для обеспечения корректного форматирования строки подключения.Также можно использовать параметр
datasourceдля указания полной строки подключения:datasource: "host=localhost port=5432 user=postgres password=postgres application_name=pgpro-otel-collector sslmode=disable"
Укажите запросы для сбора метрик. Каждый запрос состоит из SQL-оператора и раздела
metrics. Разделовmetricsможет быть несколько, но хотя бы один такой раздел обязателен. Каждая метрика в конфигурации создаёт одну метрику OpenTelemetry для каждой строки, возвращённой SQL-запросом.receivers: sqlquery: ... queries: - sql: >- SELECT p.id, p.name, p.price, sum(s.units) AS sold FROM products p LEFT JOIN sales s ON (p.id = product_id) GROUP BY p.id, p.name, p.price metrics: # Пример метрики типа gauge # Имя, присваиваемое метрике OpenTelemetry - metric_name: postgresql.products.price value_column: price data_type: gauge value_type: double description: Price of the product unit: rub static_attributes: database: postgres attribute_columns: ["name"] # Пример метрики типа sum - metric_name: postgresql.products.sold value_column: sold data_type: sum value_type: int description: Total count of sold products # Указывает, является ли кумулятивное значение суммы монотонно возрастающим (т.е. никогда не сбрасывается и не переполняется) # По умолчанию = false monotonic: true aggregation: cumulative static_attributes: database: postgres attribute_columns: ["name"]В этом примере предполагается следующая схема базы данных:
CREATE TABLE products (id INTEGER, name TEXT, price NUMERIC); INSERT INTO products VALUES (1, 'Cheese', 9.99), (2, 'Bread', 1.99), (3, 'Milk', 2.99); CREATE TABLE sales (id BIGINT, product_id BIGINT, units INT, sold_at TIMESTAMP DEFAULT now()); INSERT INTO sales VALUES (1, 1, 10), (2, 2, 20), (2, 2, 50), (3, 3, 30);
Запрос создаёт две метрики: измеритель (gauge) для текущих цен товаров и кумулятивную сумму (cumulative sum) для общего количества проданных единиц по каждому товару.
Используйте параметр
data_typeдля указания типа метрики. Установите его в значениеgaugeдля метрик, представляющих текущее значение, или вsumдля метрик, представляющих агрегированную сумму. При использованииsumустановите параметрaggregationв значениеcumulative(по умолчанию) илиdelta.Примечание
Избегайте запросов, возвращающих значения NULL. Если запрос вернёт NULL в столбце, на который ссылается конфигурация, ошибки будут добавлены в журнал, но ресивер продолжит работу.
Настройте экспортёры, процессоры и конвейер службы:
... exporters: prometheus: endpoint: :8889 send_timestamps: true otlphttp/sqlquery/metrics: compression: '' endpoint: https://metrics.example.org:8080 headers: X-Ppem-Source-Agent-Name: local X-Ppem-Source-Instance-Port: '5432' processors: batch/sqlquery: send_batch_size: 2048 timeout: 10s service: # Телеметрия для самого коллектора telemetry: logs: # Задаёт минимальный уровень журналирования # Значения: debug, info, warn, error # По умолчанию = info level: info pipelines: metrics/sqlquery: receivers: [ sqlquery ] processors: [ batch/sqlquery ] exporters: [ prometheus, otlphttp/sqlquery/metrics ]Запустите pgpro-otel-collector с созданным файлом конфигурации:
build/pgpro-otel-collector/pgpro-otel-collector --config configs/sqlquery.yml
За полным списком параметров конфигурации sqlquery обратитесь к документации OpenTelemetry.
6.2.1.4. Добавление и настройка процессора metricstransform #
Процессор metricstransform — это компонент OpenTelemetry Collector с открытым исходным кодом для переименования метрик и управления метками, включая операции масштабирования и агрегирования. За подробностями обратитесь к документации OpenTelemetry.
Пример настройки процессора metricstransform приведён в процедуре ниже.
Создайте файл конфигурации
metrics_transform.yml.Добавьте в файл конфигурации подходящие для ваших задач разделы из примеров ниже:
Переименуйте метрику — например
postgresql.databases.size_bytesвpostgresql.db.size_bytes:processors: metricstransform/rename: transforms: - include: postgresql.databases.size_bytes # По умолчанию = strict match_type: strict action: update new_name: postgresql.db.size_bytesПараметр
actionопределяет тип преобразования:updateизменяет существующие метрики,insertсоздаёт клонированные метрики, аcombineобъединяет несколько метрик в новую.Используйте регулярные выражения для одновременного переименования нескольких метрик:
metricstransform/rename_by_regexp: transforms: - include: ^postgresql\.databases\.(.*)$$ match_type: regexp action: update new_name: postgresql.db.$${1}Создайте дубликат метрики с новым именем:
metricstransform/create_new: transforms: - include: postgresql.databases.size_bytes match_type: strict action: insert new_name: postgresql.db.size_bytesДобавьте новую метку к метрике:
metricstransform/add_label: transforms: - include: postgresql.databases.size_bytes action: update operations: - action: add_label new_label: new_label new_value: "value 1"Переименуйте существующую метку:
metricstransform/rename_label: transforms: - include: postgresql.databases.size_bytes action: update operations: - action: update_label label: database new_label: dbПереименуйте несколько меток с помощью регулярного выражения:
metricstransform/rename_label_multiple: transforms: - include: ^postgresql\.databases\.(.*)$$ match_type: regexp action: update operations: - action: update_label label: database new_label: dbПереименуйте конкретное значение метки:
metricstransform/rename_label_value: transforms: - include: postgresql.databases.size_bytes action: update operations: - action: update_label label: database value_actions: - value: postgres new_value: defaultУдалите точки данных, имеющие определённое значение метки:
metricstransform/delete_by_label_value: transforms: - include: postgresql.databases.size_bytes action: update operations: - action: delete_label_value label: database # Определяет значение метки, точки данных с которым будут удалены label_value: db11Преобразуйте тип данных из
doubleвintи обратно:metricstransform/convert_data_type: transforms: - include: postgresql.databases.size_bytes action: update operations: - action: toggle_scalar_data_typeАгрегируйте точки данных, исключив метки, указанные в
label_set:metricstransform/aggregate_labels: transforms: - include: postgresql.activity.connections action: update operations: - action: aggregate_labels # Содержит список меток, которые останутся после агрегирования label_set: #- database - user #- backend_process_state # Определяет способ агрегирования объединённых точек данных # Возможные значения: sum, mean, min, max, count, median aggregation_type: sumОбратите внимание, что для гистограмм и экспоненциальных гистограмм поддерживается только операция суммирования.
Агрегируйте точки данных с определённым значением метки:
metricstransform/aggregate_label_values: transforms: - include: postgresql.activity.connections action: update operations: - action: aggregate_label_values label: database # Содержит список значений меток, которые будут агрегированы aggregated_values: [ db11, db12, db13 ] new_value: all_db1 aggregation_type: sumОбратите внимание, что для гистограмм и экспоненциальных гистограмм поддерживается только операция суммирования.
Объедините несколько связанных метрик в одну. Например, объедините несколько метрик
tuples_*вtuples_totalс меткойtype:metricstransform/combine_metrics: transforms: - include: ^postgresql\.databases\.tuples_(?P<type>.*)$$ match_type: regexp action: combine new_name: postgresql.databases.tuples_total submatch_case: lowerПараметр
submatch_caseуправляет регистром значений меток, извлечённых из подсовпадений регулярного выражения при операциях объединения. Оставьте пустым для сохранения исходного регистра. Возможные значения:lowerилиupper.Сгруппируйте метрики из одного ресурса и преобразуйте в несколько метрик ресурса:
metricstransform/group_metrics: transforms: - include: ^postgresql.databases.size_bytes$$ match_type: regexp action: group group_resource_labels: {"resource.type": "default", "source": "default"} - include: ^postgresql.databases.orphaned_files_size_bytes$$ match_type: regexp action: group group_resource_labels: {"resource.type": "orphaned", "source": "orphaned"}Создайте новую метрику, отфильтрованную по значению метки (экспериментальная функция):
metricstransform/experimental_create_by_label: transforms: - include: postgresql.databases.size_bytes match_type: regexp experimental_match_labels: {"database": "db1.*"} action: insert new_name: postgresql.db1.sizeЕсли задан параметр
experimental_match_labels, преобразования применяются только к метрикам, соответствующим указанным значениям меток. Это работает как со значениемstrict, так и сregexpпараметраmatch_type.Масштабируйте значения метрик из байтов в биты (экспериментальная функция):
metricstransform/experimental_scale_value: transforms: - include: postgresql.databases.size_bytes match_type: strict action: insert new_name: postgresql.databases.size_bits operations: - action: experimental_scale_value experimental_scale: 8Параметр
experimental_scaleопределяет скаляр для применения к значениям метрик. Обратите внимание, что масштабирование экспоненциальных гистограмм неизбежно приводит к некоторой потере точности.
Настройте экспортёры и конвейер службы в соответствии с выбранными разделами:
exporters: prometheus: endpoint: :8889 send_timestamps: true # translation_strategy: UnderscoreEscapingWithoutSuffixes # Если true, все атрибуты ресурса по умолчанию будут преобразованы в метки метрик # resource_to_telemetry_conversion: # enabled: true service: pipelines: metrics: receivers: - postgrespro processors: - metricstransform/rename # - metricstransform/rename_by_regexp # - metricstransform/create_new # - metricstransform/add_label # - metricstransform/rename_label # - metricstransform/rename_label_multiple # - metricstransform/rename_label_value # - metricstransform/delete_by_label_value # - metricstransform/convert_data_type # - metricstransform/aggregate_labels # - metricstransform/aggregate_label_values # - metricstransform/combine_metrics # - metricstransform/group_metrics # - metricstransform/experimental_create_by_label # - metricstransform/experimental_scale_value exporters: - prometheusЗапустите pgpro-otel-collector с основным файлом конфигурации и
metrics_transform.yml:build/pgpro-otel-collector/pgpro-otel-collector --config configs/basic.yml --config configs/metrics_transform.yml
За полным списком параметров конфигурации обратитесь к документации OpenTelemetry.
6.2.1.5. Добавление и настройка экспортёра prometheus #
Экспортёр prometheus является компонентом OpenTelemetry Collector с открытым исходным кодом. За подробной информацией обратитесь к документации OpenTelemetry.
prometheus наиболее прост в использовании — он не требует обязательной настройки внешних компонентов и может быть включён по умолчанию. Для настройки достаточно указать адрес для прослушивания входящих запросов:
exporters:
prometheus:
endpoint: "1.2.3.4:8889"
send_timestamps: true6.2.1.6. Добавление и настройка экспортёра otlphttp #
Экспортёр otlphttp является компонентом OpenTelemetry Collector с открытым исходным кодом и используется для отправки собранных журналов в OTLP-совместимую систему хранения или мониторинга, которая предварительно должна быть развёрнута и доступна. За подробной информацией обратитесь к документации OpenTelemetry.
Для настройки экспортёра otlphttp достаточно указать адрес целевой системы, куда следует отправить данные:
exporters:
otlphttp:
endpoint: https://otlp.example.org6.2.1.7. Добавление и настройка экспортёра kafka #
Экспортёр kafka является компонентом OpenTelemetry Collector с открытым исходным кодом для отправки метрик и журналов в Apache Kafka. За подробной информацией обратитесь к документации OpenTelemetry.
В примере ниже показано, как настроить отправку метрик.
receivers:
postgrespro:
max_threads: 3
collection_interval: 60s
initial_delay: 1s
transport: tcp
endpoint: localhost:5432
database: postgres
username: postgres
password: ${env:POSTGRESQL_PASSWORD}
metrics: null
plugins:
activity:
enabled: true
bgwriter:
enabled: true
locks:
enabled: true
version:
enabled: true
wal:
enabled: true
cache:
enabled: true
exporters:
kafka:
brokers:
- localhost:9092
protocol_version: 2.1.0
client_id: pgpro-otel-collector
metrics:
topic: otlp_metrics
encoding: otlp_json # proto supported
include_metadata_keys:
- service.name
- service.instance.id
tls:
insecure: true
timeout: 30s
producer:
max_message_bytes: 1000000
required_acks: 1
compression: none # gzip, snappy, lz4, and zstd;
processors:
batch/kafka:
send_batch_size: 1024
timeout: 1s
resource:
attributes:
- key: service.name
action: upsert
value: postgresql
- key: service.instance.id
action: upsert
value: address-of-postgres-instance:5432
service:
pipelines:
metrics/kafka:
receivers: [ postgrespro ]
processors: [ batch/kafka,resource ]
exporters: [ kafka ]6.2.1.8. Настройка конвейера #
После того как ресиверы, процессоры и экспортёры добавлены и настроены, нужно объединить их в конвейер. Конвейер настраивается в секции service. Состав конвейера напрямую зависит от предварительно добавленных компонентов (не существует конфигурации по умолчанию).
В примере ниже показано, как настроить конвейер для работы с метриками. Данные собираются ресиверами postgrespro и hostmetrics, обрабатываются процессором batch и экспортируются prometheus и otlphttp.
Таким образом, все компоненты, используемые в конвейере, также должны быть добавлены в файл конфигурации и настроены.
service:
extensions: []
pipelines:
metrics:
receivers:
- postgrespro
- hostmetrics
processors:
- batch
exporters:
- prometheus
- otlphttp6.2.2. Сценарии использования #
6.2.2.1. Сбор метрик из BiHA-кластера #
pgpro-otel-collector можно настроить для сбора метрик из BiHA-кластеров с помощью плагина biha. Пример такой настройки:
Создайте файл конфигурации с именем
biha.ymlсо следующим содержимым:receivers: postgrespro/biha: transport: tcp endpoint: &endpoint localhost:5432 database: biha_db username: biha_replication_user password: ${env:POSTGRESQL_PASSWORD} collection_interval: 60s initial_delay: 1s max_threads: 3 plugins: biha: enabled: true cluster_name: cluster_name exporters: prometheus/biha: endpoint: :8889 send_timestamps: true # Определяет, как долго метрики остаются доступными без обновлений # Поскольку некоторые метрики BiHA включают 'biha_state' в свои метки, # лучше установить этот параметр равным collection_interval, # чтобы устаревшие состояния не появлялись на странице Prometheus metric_expiration: 60s processors: batch/metrics: send_batch_size: 8192 timeout: 10s memory_limiter/metrics: check_interval: 1s limit_mib: 2048 service: pipelines: metrics/biha: receivers: - postgrespro/biha processors: - memory_limiter/metrics - batch/metrics exporters: - prometheus/bihaЗапустите pgpro-otel-collector с созданным файлом конфигурации:
build/pgpro-otel-collector/pgpro-otel-collector --config configs/biha.yml
Чтобы узнать, какие метрики включены в плагин biha, обратитесь к разделу Раздел 8.18.
Примечание
Плагины с особыми правами доступа должны быть настроены отдельно.
Если вам нужно включить плагины, требующие особых прав доступа, добавьте их все в отдельный раздел postgrespro с соответствующим каждому именем пользователя. Например:
receivers:
postgrespro/biha:
username: biha_replication_user
...
plugins:
biha:
enabled: true
...
postgrespro/otel:
username: otel
...
plugins:
databases:
enabled: trueЗа дополнительной информацией о правах доступа обратитесь к Разделу 3.1.
Примечание
По умолчанию база данных postgres не копируется на узел в режиме referee или referee_with_wal (если не используется параметр --referee-with-postgres-db).
При сборе статистики на уровне базы данных, таблиц, индексов или функций с этих узлов необходимо явно исключить базу данных postgres с помощью раздела acl.databases.deny, как показано ниже. Это исключение не требуется при сборе статистики на уровне экземпляра. За дополнительной информацией о списках разрешений и запретов обратитесь к Подразделу 6.6.5.
acl:
databases:
deny:
- name: postgres