Перейти к основному содержимому
Версия: 2.5

Сбор, хранение, обработка метрик

Набор компонентов​

  1. Single-node
    1. metrics-storage
      • слушает порт 8428 и работает в режиме хранения (storage), выборки (select) и вставки (insert);
      • основные параметры запуска:
        • -retentionPeriod (время хранения метрик, по-умолчанию 1 - 1 месяц);
        • -storageDataPath (каталог хранения метрик, по-умолчанию /metrics).
        • -dedup.minScrapeInterval (интервал дедупликации samples; используется для схлопывания дублей, полученных от нескольких metrics-agent с одинаковым scrape config. Рекомендуется указывать равным scrape_interval, например 60s при scrape_interval=60s).
    2. metrics-agent
      • слушает порт 8429 и осуществляет сбор метрик с экспортеров в формате Prometheus;
      • отправляет полученные метрики в metrics-storage по протоколу Prometheus remote-write;
      • автоматически получает конфигурацию таргетов с сервиса мониторинга;
      • основные параметры запуска:
        • -promscrape.config (uri путь до конфигурации таргетов, по-умолчанию http://monitoring:8004/v4/vmagent/vmagent/config);
        • -promscrape.configCheckInterval (интервал обновления конфигурации, по-умолчанию 10s);
        • -remoteWrite.url (путь до remote-write ручки сервиса хранения метрик, по-умолчанию http://metrics-storage:8428/api/v1/write);
        • -promscrape.cluster.name (уникальное имя metrics-agent в HA-конфигурации; рекомендуется задавать разные значения для агентов, которые scrape-ят один и тот же набор targets и пишут в одно хранилище. Используется для корректной и стабильной дедупликации samples; в итоговый набор labels метрик не добавляется).
    3. metrics-ruler
      • слушает порт 8880 и занимается обработкой (оценкой) правил оповещений в соответствии с конфигурацией;
      • основные параметры запуска:
        • -configCheckInterval (интервал обновления правил, по-умолчанию 10s);
        • -datasource.url (адрес источника метрик для оценки, по-умолчанию http://metrics-storage:8428);
        • -notifier.url (адрес сервиса нотификации, по-умолчанию http://monitoring:8004/v4);
        • -remoteWrite.url (путь до remote-write ручки сервиса хранения метрик, по-умолчанию http://metrics-storage:8428);
        • -rule (uri путь до конфигурации правил, может быть несколько, по-умолчанию http://monitoring:8004/v4/vmalert/vmalert/config).
  2. HA-cluster
    1. metrics-storage
      • слушает порты 8400 (TCP, для insert), 8401 (TCP, для select) и 8482 (HTTP, для API и метрик), и работает только в режиме хранения;
      • параметры запуска аналогичны параметрам single-node версии metrics-storage;
      • для HA-конфигурации рекомендуется указывать -dedup.minScrapeInterval с тем же значением, что и на metrics-select, например 60s при scrape_interval=60s.
    2. metrics-insert
      • слушает порт 8480 (HTTP) и занимается приемом метрик от агента сбора метрик и отправкой их в metrics-storage в соответствии с фактором репликации;
      • основные параметры запуска:
        • -storageNode (адреса узлов metrics-storage, разделенные запятой, пример: vmstorage-1:8400,vmstorage-2:8400);
        • -replicationFactor (фактор репликации, если не указан или 1, кластер будет работать в режиме шардирования, пример: 2).
    3. metrics-select
      • слушает порт 8481 (HTTP) и занимается выборкой метрик по запросу из хранилища метрик;
      • основные параметры запуска:
        • -storageNode (адреса узлов metrics-storage, разделенные запятой, пример: vmstorage-1:8401,vmstorage-2:8401);
        • -dedup.minScrapeInterval (интервал дедупликации samples при выполнении запросов; рекомендуется указывать то же значение, что и на metrics-storage).
    4. metrics-agent
      • работает аналогично single-node версии metrics-agent.
    5. metrics-ruler
      • работает аналогично single-node версии metrics-ruler.
примечание

Главное отличие кластерной версии от single-node — обязательная поддержка мультитенантности. В URL запросов добавляется accountID (tenant). Формат: /insert/<accountID>/... и /select/<accountID>/....

accountID — произвольное 32-битное целое число (обычно 0 для дефолтного тенанта).

Настройка переменной DATASOURCE_URL в Памир расположена в глобальных настройках сервиса мониторинга:

Пример значений DATASOURCE_URL при реализации кластера Metrics:

  • http://metrics-select-1:8481/select/0/prometheus (если контейнер select расположен на узле с сервисом мониторинга);
  • http://<адрес узла metrics-select>:8481/select/0/prometheus (если контейнер select расположен на другом узле с публикацией порта 8481).
Доступные ручки кластерных компонентов

Ниже приведен список основных HTTP-ручек кластерных компонентов с указанием портов (значения по-умолчанию).

vmui — web-интерфейс для выполнения PromQL/MetricsQL-запросов, размещен на узлах metrics-select:

  • http://<адрес узла metrics-select>:8481/select/<accountID>/vmui/ — интерактивный интерфейс конкретного тенанта;
  • http://<адрес узла metrics-select>:8481/select/<accountID>/prometheus/graph — алиас, аналог URL Prometheus Graph UI.

metrics-insert (порт 8480) — прием метрик:

  • http://<адрес>:8480/insert/<accountID>/prometheus/api/v1/write — прием по протоколу Prometheus remote-write (используется в -remoteWrite.url у metrics-agent и metrics-ruler);
  • http://<адрес>:8480/insert/<accountID>/prometheus/api/v1/import — импорт метрик в JSON-формате VictoriaMetrics;
  • http://<адрес>:8480/insert/<accountID>/prometheus/api/v1/import/prometheus — импорт в текстовом Prometheus exposition format;
  • http://<адрес>:8480/insert/<accountID>/prometheus/api/v1/import/native — импорт в нативном бинарном формате;
  • http://<адрес>:8480/insert/<accountID>/prometheus/api/v1/import/csv — импорт из CSV;
  • http://<адрес>:8480/insert/<accountID>/influx/write — прием метрик в формате InfluxDB line protocol;
  • http://<адрес>:8480/insert/<accountID>/opentsdb/api/put — прием метрик в формате OpenTSDB HTTP API;
  • http://<адрес>:8480/insert/<accountID>/datadog/api/v1/series — прием метрик в формате DataDog;
  • http://<адрес>:8480/metrics — собственные метрики компонента в формате Prometheus.

metrics-select (порт 8481) — выборка метрик и vmui:

  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/query — мгновенный PromQL-запрос;
  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/query_range — запрос за интервал времени;
  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/series — поиск временных рядов по селекторам;
  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/labels — список имен меток;
  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/label/<label_name>/values — значения конкретной метки;
  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/export — экспорт данных;
  • http://<адрес>:8481/select/<accountID>/prometheus/api/v1/status/tsdb — статистика по TSDB тенанта;
  • http://<адрес>:8481/select/<accountID>/graphite/... — Graphite-совместимый API;
  • http://<адрес>:8481/metrics — собственные метрики компонента.

metrics-storage — хранение данных и сервисный HTTP-API:

  • <адрес узла>:8400 (TCP) — прием данных от metrics-insert (используется во флаге -storageNode);
  • <адрес узла>:8401 (TCP) — отдача данных в metrics-select (используется во флаге -storageNode);
  • http://<адрес узла>:8482/metrics — собственные метрики компонента;
  • http://<адрес узла>:8482/snapshot/create — создание снимка данных;
  • http://<адрес узла>:8482/snapshot/list — список снимков;
  • http://<адрес узла>:8482/snapshot/delete?snapshot=<name> — удаление снимка;
  • http://<адрес узла>:8482/snapshot/delete_all — удаление всех снимков;
  • http://<адрес узла>:8482/api/v1/admin/tsdb/delete_series?match[]=<selector> — удаление временных рядов по селектору;
  • http://<адрес узла>:8482/internal/force_merge — принудительный merge данных на диске;
  • http://<адрес узла>:8482/internal/force_flush — принудительный flush буферов на диск.

Для всех компонентов также доступны служебные ручки /-/healthy, /-/ready (проверка состояния) и /debug/pprof/ (профилирование Go-runtime) на соответствующих HTTP-портах.

Создание кластера высокой доступности (HA)​

Для организации отказоустойчивой конфигурации Metrics необходимо переопределить сервисы в файле docker-compose.additional.yml:

Период хранения метрик в HA

В HA-конфигурации блок command переопределяется целиком, поэтому встроенный entrypoint (и его значение -retentionPeriod по умолчанию) не применяется — период хранения задаётся флагом -retentionPeriod прямо в command каждого vmstorage. Чтобы управлять им из одного места, используется подстановка -retentionPeriod=${METRICS_RETENTION_PERIOD:-1}: значение переменной METRICS_RETENTION_PERIOD (та же, что и в одноузловой схеме) подставляется compose из окружения или .env на этапе парсинга.

Значение по умолчанию 1 соответствует 1 месяцу: число без суффикса VictoriaMetrics трактует как количество месяцев, суффиксы — h (часы), d (дни), w (недели), y (годы). Суффикс m означает минуты, а не месяцы (например, 1m = 1 минута); для явного указания месяца используйте 31d.

На разных узлах Docker Engine​

docker-compose.additional.yml
services:
metrics-storage:
profiles: !override [never]
metrics-storage-1:
container_name: vmstorage-1
command:
- "vmstorage"
- "-retentionPeriod=${METRICS_RETENTION_PERIOD:-1}"
- "-storageDataPath=/metrics"
- "-maxLabelsPerTimeseries=80"
- "-search.maxQueryLen=256KB"
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8400:8400"
- "8401:8401"
volumes: !override
- type: volume
source: vmstorage-1_data
target: /metrics
metrics-insert-1:
container_name: metrics-insert-1
command:
- "vminsert"
- "-storageNode=metrics-storage-1:8400,<IP-адрес/DNS-имя metrics-storage-2>:8400"
- "-replicationFactor=2"
depends_on: !override
- metrics-storage-1
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8480:8480"
metrics-select-1:
container_name: metrics-select-1
command:
- "vmselect"
- "-storageNode=metrics-storage-1:8401,<IP-адрес/DNS-имя metrics-storage-2>:8401"
- "-dedup.minScrapeInterval=1ms" # Дедупликация
depends_on: !override
- metrics-storage-1
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8481:8481"
подсказка

где, <IP-адрес/DNS-имя metrics-storage-2>:<8400/8401> - указываются IP-адреса соседних узлов с контейнером metrics-storage.

Данную процедуру повторить на всех узлах, изменяя имя контейнера container_name и список узлов metrics-storage в command.

Интеграция с API Gateway​

В этой схеме API Gateway на узле Памир не видит контейнеры metrics-select-*, поэтому динамическая конфигурация на основе лейблов не работает — нужен статический конфиг nginx (общая схема описана в разделе Сценарий 1: сервисы Metrics на смежных серверах).

Отличие кластерной конфигурации от приведённой в api_gateway.md: upstream указывает на metrics-select (порт 8481), а в proxy_pass добавляется префикс тенанта /select/<accountID>/.

Шаг 1. Сбросить лейблы у локального metrics-storage и отключить неиспользуемые VM-сервисы на узле с API Gateway:

docker-compose.additional.yml
services:
metrics-storage:
labels: !override []
metrics-agent:
profiles: !override [never]
metrics-ruler:
profiles: !override [never]

Шаг 2. Смонтировать статические конфиги в контейнер frontend:

docker-compose.additional.yml
services:
frontend:
volumes:
- ./data/nginx/conf.d/metrics-cluster.conf:/etc/nginx/conf.d/metrics-cluster.conf:ro
- ./data/nginx/vhost/backend:/etc/nginx/vhost.d/backend:ro

Шаг 3. Описать upstream-блок в data/nginx/conf.d/metrics-cluster.conf:

data/nginx/conf.d/metrics-cluster.conf
upstream metrics-storage {
server <IP-узла-select-1>:8481;
server <IP-узла-select-2>:8481 backup;
keepalive 4;
}

Шаг 4. Описать location в data/nginx/vhost/backend с переписыванием пути на /select/<accountID>/:

data/nginx/vhost/backend
location ^~ /metrics-storage/ {
auth_request /_pamir_auth;
proxy_pass http://metrics-storage/select/0/;
}

<accountID> в proxy_pass должен совпадать с тенантом, который используется в DATASOURCE_URL (см. note в начале раздела про мультитенантность). :::

На одном узле Docker Engine​

Также возможен запуск нескольких экземпляров Metrics на одном узле:

docker-compose.additional.yml
services:
metrics-storage:
profiles: !override [never]
metrics-storage-1:
container_name: vmstorage-1
command:
- "vmstorage"
- "-retentionPeriod=${METRICS_RETENTION_PERIOD:-1}"
- "-storageDataPath=/metrics"
- "-maxLabelsPerTimeseries=80"
- "-search.maxQueryLen=256KB"
extends:
file: docker-compose.deps.yml
service: metrics-storage
volumes: !override
- type: volume
source: vmstorage-1_data
target: /metrics
metrics-storage-2:
container_name: vmstorage-2
command:
- "vmstorage"
- "-retentionPeriod=${METRICS_RETENTION_PERIOD:-1}"
- "-storageDataPath=/metrics"
- "-maxLabelsPerTimeseries=80"
- "-search.maxQueryLen=256KB"
extends:
file: docker-compose.deps.yml
service: metrics-storage
volumes: !override
- type: volume
source: vmstorage-2_data
target: /metrics
metrics-insert-1:
container_name: metrics-insert-1
command:
- "vminsert"
- "-storageNode=metrics-storage-1:8400,metrics-storage-2:8400"
- "-replicationFactor=2"
depends_on: !override
- metrics-storage-1
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8480:8480"
metrics-insert-2:
container_name: metrics-insert-2
command:
- "vminsert"
- "-storageNode=metrics-storage-1:8400,metrics-storage-2:8400"
- "-replicationFactor=2"
depends_on: !override
- metrics-storage-2
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8490:8480"
metrics-select-1:
container_name: metrics-select-1
command:
- "vmselect"
- "-storageNode=metrics-storage-1:8401,metrics-storage-2:8401"
- "-dedup.minScrapeInterval=1ms" # Дедупликация
depends_on: !override
- metrics-storage-1
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8481:8481"
metrics-select-2:
container_name: metrics-select-2
command:
- "vmselect"
- "-storageNode=metrics-storage-1:8401,metrics-storage-2:8401"
- "-dedup.minScrapeInterval=1ms" # Дедупликация
depends_on: !override
- metrics-storage-2
extends:
file: docker-compose.deps.yml
service: metrics-storage
ports:
- "8491:8481"

Интеграция с API Gateway​

Если кластер Metrics запущен на одном узле с Памир, по умолчанию API Gateway проксирует запросы на сервис metrics-storage:8428 (single-node режим). В кластерной конфигурации этого сервиса нет — запросы должны идти на один из контейнеров metrics-select с обязательным префиксом тенанта /select/<accountID>/.

Для этого нужно переопределить лейблы в docker-compose.additional.yml: оставить проксирование только на одном из metrics-select-* (с переадресацией пути), а на остальных сервисах Metrics — сбросить лейблы:

docker-compose.additional.yml
services:
# ...конфигурация storage/insert/select из примеров выше...

# Проксирование оставляем только на одном metrics-select-*
# (путь /metrics-storage/ из API Gateway → /select/0/ на vmselect)
metrics-select-1:
labels:
com.github.nginx-proxy.nginx-proxy.expose-service.enable: true
com.github.nginx-proxy.nginx-proxy.expose-service.path: metrics-storage
com.github.nginx-proxy.nginx-proxy.expose-service.port: "8481"
com.github.nginx-proxy.nginx-proxy.expose-service.dest: "/select/0/"
com.github.nginx-proxy.nginx-proxy.expose-service.auth: true

# На остальных сервисах Metrics сбрасываем лейблы, чтобы исключить
# их попадание в динамическую конфигурацию nginx
metrics-storage-1:
labels: !override []
metrics-storage-2:
labels: !override []
metrics-insert-1:
labels: !override []
metrics-insert-2:
labels: !override []
metrics-select-2:
labels: !override []

<accountID> в dest должен совпадать с тенантом, который используется в DATASOURCE_URL сервиса мониторинга (см. note выше). Подробности про лейблы — в разделе Настройка API Gateway. :::

к сведению

Применение всех внесенных параметров в файлы docker-compose.additional.yml, либо другие env-файлы осуществляется командой:

pamirctl start # Можно указать конкретные сервисы через пробел, в таком случае будут перезапущены только указанные сервисы.

Конфигурация агента сбора метрик​

Агент сбора метрик (metrics-agent) конфигурируется посредством флагов командной строки, описанных в наборе компонентов для metrics-agent, а также самой конфигурации, которая передается флагом -promscrape.config.

Данный аргумент принимает два типа значения:

  • путь до файла конфигурации в файловой системе (например, /config.yml)
  • URL-адрес файла конфигурации, доступного для загрузки (например, https://pamir.example.com/api/monitoring/v4/vmagent/vmagent/config).
Важно

Веб-сервер, на котором размещается файл конфигурации агента сбора метрик должен отдавать файл в формате text/plain.

Сервер Памир отдает конфигурацию в корректном формате.

В качестве значения по-умолчанию для этого флага указывается сервис мониторинга Памир с путем до файла конфигурации.

Адрес конфигурации можно получить в веб-интерфейсе конфигурации агента сбора метрик (поле URI для получения конфигурации):

Масштабирование и распределение агентов сбора метрик​

Агенты сбора метрик могут быть сконфигурированы в docker-compose.additional.yml. Пример конфигурации с двумя агентами:

docker-compose.additional.yml
services:
metrics-agent:
profiles: [never]
metrics-agent-1:
extends:
file: docker-compose.deps.yml
service: metrics-agent
command:
- "vmagent"
- "-httpListenAddr=:8429"
- "-promscrape.config=https://pamir.example.com/api/monitoring/v4/vmagent/vmagent1/config"
- "-promscrape.configCheckInterval=10s"
- "-promscrape.config.strictParse=false"
- "-remoteWrite.url=http://metrics-storage:8428/api/v1/write"
metrics-agent-2:
extends:
file: docker-compose.deps.yml
service: metrics-agent
command:
- "vmagent"
- "-httpListenAddr=:8429"
- "-promscrape.config=https://pamir.example.com/api/monitoring/v4/vmagent/vmagent2/config"
- "-promscrape.configCheckInterval=10s"
- "-promscrape.config.strictParse=false"
- "-remoteWrite.url=http://metrics-storage:8428/api/v1/write"

Аналогичные операции возможно реализовать при распределении агентов по разным узлам Docker Engine.

Ключевыми параметрами в данном случае будут:

  • адрес конфигурации агента сбора метрик в -promscrape.config;
  • адрес узла хранения метрик remoteWrite.url;
    • в случае распределения по узлам Docker Engine нужно опубликовать наружу порт сервиса metrics-storage и использовать адрес узла с опубликованным портом в remoteWrite.url.

Конфигурация агента обработки правил​

Агент обработки правил (metrics-ruler) конфигурируется посредством флагов командной строки, описанных в наборе компонентов для metrics-ruler, а также набором правил, которая передается флагом -rule.

Данный аргумент принимает два типа значения:

  • путь до файла конфигурации в файловой системе (например, /rules.yml)
  • URL-адрес файла конфигурации, доступного для загрузки (например, https://pamir.example.com/api/monitoring/v4/vmalert/vmalert/config).
Важно

Веб-сервер, на котором размещается файл конфигурации агента обработки правил должен отдавать файл в формате text/plain.

Сервер Памир отдает конфигурацию в корректном формате.

В качестве значения по-умолчанию для этого флага указывается сервис мониторинга Памир с путем до файла конфигурации.

Адрес конфигурации можно получить в веб-интерфейсе конфигурации агента обработки правил (поле URI для получения конфигурации):

Масштабирование и распределение агентов обработки правил​

Агенты обработки правил могут быть сконфигурированы в docker-compose.additional.yml. Пример конфигурации с двумя агентами:

docker-compose.additional.yml
services:
metrics-ruler:
profiles: [never]
metrics-ruler-1:
extends:
file: docker-compose.deps.yml
service: metrics-ruler
command:
- "vmalert"
- "-configCheckInterval=10s"
- "-datasource.url=http://metrics-storage:8428"
- "-notifier.url=https://pamir.example.com/api/monitoring/v4"
- "-remoteWrite.url=http://metrics-storage:8428"
- "-rule=https://pamir.example.com/api/monitoring/v4/vmalert/vmalert1/config"
- "-rule=https://pamir.example.com/api/monitoring/v4/vmalert/vmalert1_2/config"
metrics-ruler-2:
extends:
file: docker-compose.deps.yml
service: metrics-ruler
command:
- "vmalert"
- "-configCheckInterval=10s"
- "-datasource.url=http://metrics-storage:8428"
- "-notifier.url=https://pamir.example.com/api/monitoring/v4"
- "-remoteWrite.url=http://metrics-storage:8428"
- "-rule=https://pamir.example.com/api/monitoring/v4/vmalert/vmalert2/config"
- "-rule=https://pamir.example.com/api/monitoring/v4/vmalert/vmalert2_2/config"
примечание

В флаге rule в примере указано несколько адресов до конфигурации правил. Агент обработки правил поддерживает несколько файлов конфигурации и читает их в порядке переданных аргументов.

Аналогичные операции возможно реализовать при распределении агентов по разным узлам Docker Engine.

Ключевыми параметрами в данном случае будут:

  • адрес конфигурации обработки правил в -rule;
  • адрес узла хранения метрик remoteWrite.url;
    • в случае распределения по узлам Docker Engine нужно опубликовать наружу порт сервиса metrics-storage и использовать адрес узла с опубликованным портом в remoteWrite.url;
  • адрес узла нотификации для отправки уведомлений по обработанным правилам.
к сведению

Применение всех внесенных параметров в файлы docker-compose.additional.yml, либо другие env-файлы осуществляется командой:

pamirctl start # Можно указать конкретные сервисы через пробел, в таком случае будут перезапущены только указанные сервисы.

Связанные разделы​