Сбор, хранение, обработка метрик
Набор компонентов
- Single-node
- metrics-storage
- слушает порт 8428 и работает в режиме хранения (storage), выборки (select) и вставки (insert);
- основные параметры запуска:
-retentionPeriod(время хранения метрик, по-умолчанию1- 1 месяц);-storageDataPath(каталог хранения метрик, по-умолчанию/metrics).-dedup.minScrapeInterval(интервал дедупликации samples; используется для схлопывания дублей, полученных от нескольких metrics-agent с одинаковым scrape config. Рекомендуется указывать равнымscrape_interval, например60sприscrape_interval=60s).
- 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 метрик не добавляется).
- 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).
- metrics-storage
- HA-cluster
- metrics-storage
- слушает порты 8400 (TCP, для insert), 8401 (TCP, для select) и 8482 (HTTP, для API и метрик), и работает только в режиме хранения;
- параметры запуска аналогичны параметрам single-node версии metrics-storage;
- для HA-конфигурации рекомендуется указывать
-dedup.minScrapeIntervalс тем же значением, что и на metrics-select, например60sприscrape_interval=60s.
- metrics-insert
- слушает порт 8480 (HTTP) и занимается приемом метрик от агента сбора метрик и отправкой их в metrics-storage в соответствии с фактором репликации;
- основные параметры запуска:
-storageNode(адреса узлов metrics-storage, разделенные запятой, пример:vmstorage-1:8400,vmstorage-2:8400);-replicationFactor(фактор репликации, если не указан или 1, кластер будет работать в режиме шардирования, пример:2).
- metrics-select
- слушает порт 8481 (HTTP) и занимается выборкой метрик по запросу из хранилища метрик;
- основные параметры запуска:
-storageNode(адреса узлов metrics-storage, разделенные запятой, пример:vmstorage-1:8401,vmstorage-2:8401);-dedup.minScrapeInterval(интервал дедупликации samples при выполнении запросов; рекомендуется указывать то же значение, что и на metrics-storage).
- metrics-agent
- работает аналогично single-node версии metrics-agent.
- metrics-ruler
- работает аналогично single-node версии metrics-ruler.
- metrics-storage
Главное отличие кластерной версии от 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-конфигурации блок 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
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:
services:
metrics-storage:
labels: !override []
metrics-agent:
profiles: !override [never]
metrics-ruler:
profiles: !override [never]
Шаг 2. Смонтировать статические конфиги в контейнер frontend:
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:
upstream metrics-storage {
server <IP-узла-select-1>:8481;
server <IP-узла-select-2>:8481 backup;
keepalive 4;
}
Шаг 4. Описать location в data/nginx/vhost/backend с переписыванием пути на /select/<accountID>/:
location ^~ /metrics-storage/ {
auth_request /_pamir_auth;
proxy_pass http://metrics-storage/select/0/;
}
<accountID> в proxy_pass должен совпадать с тенантом, который используется в DATASOURCE_URL
(см. note в начале раздела про мультитенантность).
:::
На одном узле Docker Engine
Также возможен запуск нескольких экземпляров Metrics на одном узле:
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 — сбросить лейблы:
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. Пример конфигурации с двумя агентами:
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.
- в случае распределения по узлам Docker Engine нужно опубликовать наружу порт сервиса metrics-storage и использовать адрес узла с опубликованным портом в
Конфигурация агента обработки правил
Агент обработки правил (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. Пример конфигурации с двумя агентами:
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 Engine нужно опубликовать наружу порт сервиса metrics-storage и использовать адрес узла с опубликованным портом в
- адрес узла нотификации для отправки уведомлений по обработанным правилам.
Применение всех внесенных параметров в файлы docker-compose.additional.yml, либо другие env-файлы осуществляется командой:
pamirctl start # Можно указать конкретные сервисы через пробел, в таком случае будут перезапущены только указанные сервисы.