В этом разделе описаны шаги, необходимые для работы с метриками.
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'
...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: nullРесивер 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.
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.
prometheus #Экспортёр prometheus является компонентом OpenTelemetry Collector с открытым исходным кодом. За подробной информацией обратитесь к документации OpenTelemetry.
prometheus наиболее прост в использовании — он не требует обязательной настройки внешних компонентов и может быть включён по умолчанию. Для настройки достаточно указать адрес для прослушивания входящих запросов:
exporters:
prometheus:
endpoint: "1.2.3.4:8889"
send_timestamps: trueotlphttp #Экспортёр otlphttp является компонентом OpenTelemetry Collector с открытым исходным кодом и используется для отправки собранных журналов в OTLP-совместимую систему хранения или мониторинга, которая предварительно должна быть развёрнута и доступна. За подробной информацией обратитесь к документации OpenTelemetry.
Для настройки экспортёра otlphttp достаточно указать адрес целевой системы, куда следует отправить данные:
exporters:
otlphttp:
endpoint: https://otlp.example.orgkafka #Экспортёр 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 ]После того как ресиверы, процессоры и экспортёры добавлены и настроены, нужно объединить их в конвейер. Конвейер настраивается в секции service. Состав конвейера напрямую зависит от предварительно добавленных компонентов (не существует конфигурации по умолчанию).
В примере ниже показано, как настроить конвейер для работы с метриками. Данные собираются ресиверами postgrespro и hostmetrics, обрабатываются процессором batch и экспортируются prometheus и otlphttp.
Таким образом, все компоненты, используемые в конвейере, также должны быть добавлены в файл конфигурации и настроены.
service:
extensions: []
pipelines:
metrics:
receivers:
- postgrespro
- hostmetrics
processors:
- batch
exporters:
- prometheus
- otlphttppgpro-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