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: null

6.2.1.3. Добавление и настройка ресивера SQL-запросов #

Ресивер sqlquery — компонент OpenTelemetry Collector с открытым исходным кодом для сбора метрик и/или журналов из пользовательских SQL-запросов.

Предупреждение

В настоящее время ресивер sqlquery является экспериментальным и не рекомендован для использования в производственной среде.

Чтобы настроить ресивер sqlquery для сбора метрик, используйте приведённый ниже пример.

  1. Создайте файл конфигурации sqlquery.yml.

  2. В созданном файле конфигурации укажите параметры подключения к базе данных в разделе 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"
  3. Укажите запросы для сбора метрик. Каждый запрос состоит из 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 в столбце, на который ссылается конфигурация, ошибки будут добавлены в журнал, но ресивер продолжит работу.

  4. Настройте экспортёры, процессоры и конвейер службы:

    ...
    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 ]
  5. Запустите 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 приведён в процедуре ниже.

  1. Создайте файл конфигурации metrics_transform.yml.

  2. Добавьте в файл конфигурации подходящие для ваших задач разделы из примеров ниже:

    • Переименуйте метрику — например 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 определяет скаляр для применения к значениям метрик. Обратите внимание, что масштабирование экспоненциальных гистограмм неизбежно приводит к некоторой потере точности.

  3. Настройте экспортёры и конвейер службы в соответствии с выбранными разделами:

    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
  4. Запустите 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: true

6.2.1.6. Добавление и настройка экспортёра otlphttp #

Экспортёр otlphttp является компонентом OpenTelemetry Collector с открытым исходным кодом и используется для отправки собранных журналов в OTLP-совместимую систему хранения или мониторинга, которая предварительно должна быть развёрнута и доступна. За подробной информацией обратитесь к документации OpenTelemetry.

Для настройки экспортёра otlphttp достаточно указать адрес целевой системы, куда следует отправить данные:

exporters:
  otlphttp:
    endpoint: https://otlp.example.org

6.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
        - otlphttp

6.2.2. Сценарии использования #

6.2.2.1. Сбор метрик из BiHA-кластера #

pgpro-otel-collector можно настроить для сбора метрик из BiHA-кластеров с помощью плагина biha. Пример такой настройки:

  1. Создайте файл конфигурации с именем 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
  2. Запустите 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