Настройка в VMAgent параллельной отправки метрик в «новый» и «старый» VMetrics-кластеры



1. Некоторые правила пользования сервисом хранения метрик

1.1. О номере тенанта

VictoriaMetrics cluster supports multiple isolated tenants (aka namespaces). Tenants are identified by accountID or accountID:projectID, which are put inside request URLs for writes and reads.

  • Тенанты различаются по идентификатору аккаунта (accountID) или по паре accountID:projectID. Например: 203:5.

  • Технически, для того чтобы метрика была отправлена в конкретный тенант, к ней необходимо прикрепить метки, например vm_account_id=203 и vm_project_id=5. Допустимо указать только vm_account_id=203 — в этом случае кластер VictoriaMetrics воспримет, что метрика предназначена для тенанта 203:0.

  • Каждому арендатору назначается уникальный номер, определяющий аккаунт (accountID), в который сохраняются метрики в кластере VictoriaMetrics.

  • Все метрики, отправляемые арендатором в кластер, должны быть помечены меткой vm_account_id со значением, соответствующим выданному номеру аккаунта.

1.2. О номере проекта

  • Перед отправкой метрик в кластер, арендатор может дополнительно присваивать метрикам метку vm_project_id, определяющую номер проекта внутри выделенного аккаунта, в который будет сохранена метрика.

  • Диапазон допустимых значений vm_project_id — от 0 до 4 294 967 295. Конкретное значение выбирается арендатором самостоятельно.

  • Если метка vm_project_id не указана, по умолчанию используется значение 0. Рекомендуется избегать использования нуля, так как при ошибках в конфигурации метрики могут непреднамеренно попадать именно в проект 0.

  • При чтении метрик (например, через Grafana) использование метки vm_project_id удобно для логической группировки данных на уровне dashboard — эту группировку арендатор выполняет самостоятельно.

1.3. О высокой «кардинальности» метрик

  • Арендатору необходимо избегать назначения на метрики лейблов с динамическими значениями.

  • Пример «проблемных» меток:

    http_requests_total{method="GET", path="/api/v1/user/67890", status="200"}
    http_requests_total{method="GET", path="/api/v1/user/54321", status="200"}
    http_requests_total{method="GET", path="/api/v1/user/98765", status="404"}
  • Если в метках встречаются уникальные значения от миллионов пользователей, это приведёт к взрывному росту числа временных рядов, что негативно скажется на производительности и потреблении ресурсов кластера VictoriaMetrics.




2. Сбор используемой в сценарии информации

Имя переменной

Описание

Возможные значения

1

REMOTEWRITE_URL_NEW

VMAuth URL отправки метрик в VM-кластер. Запрашивается у ответственного за мониторинг.

2

REMOTEWRITE_URL_OLD

Адрес отправки метрик в «старый» кластер. Может быть найден в текущих настройках VMAgent.

3

BEARER_TOKEN

Токен доступа к VMAuth. Запрашивается у ответственного за мониторинг.

  • Например:

    ncku4sDsBvGVTUSqGT

4

TENANT

Номер выделенного для арендатора тенанта («аккаунта»). Запрашивается у ответственного за мониторинг.

  • Например:

    203




3. Проверка доступности «нового» VMetrics-кластера

VMAuth настроен возвращать своё состояние https://127.0.0.1:8426/-/ready на анонимные запросы.

Задача

Подробности

1

Проверка связности.

  • Выполните:

    curl --insecure ${REMOTEWRITE_URL_NEW}

    Ожидаемый вывод:

    VictoriaMetrics is Ready.




4. Установка VMAgent из внутреннего rpm-репозитория

Задача

Подробности

1

Добавление в систему rpm-репо.

  • Выполните:

    USERPASS='nx-pubrepo-reader:xxxxxxxxxxxxxxxxx'
    REPO='evo_distr_yum/monitoring/victoriametrics/x86_64/'
    cat << EOF > /etc/zypp/repos.d/evo_distr_yum.repo
    [evo_distr_yum]
    enabled=1
    autorefresh=1
    baseurl=http://${USERPASS}@nexus.example.org/repository/${REPO}
    gpgcheck=0
    #repo_gpgcheck=0
    EOF

2

Установка пакета.

  • Выполните:

    zypper install vmagent




5. Конфигурирование отправки метрик и настройка глобальных меток

Для параллельной отправки метрик в «новый» и «старый» кластеры, в большинстве случаев понадобятся изменения только в одной переменной remoteWrite_url. Дальше приведено объяснение этому.

Вообще здесь, в этой инструкции, для отправки метрик в различные места назначений задействованы переменные: remoteWrite_url, remoteWrite_bearerTokenFile, remoteWrite_headers, remoteWrite_urlRelabelConfig, remoteWrite_maxDiskUsagePerURL. Каждая переменная может содержать несколько значений, разделённых запятыми. Для отправки метрик в первое место, используется значения в первой позиции в этих переменных. Для отправки во второе — вторая позиция. И т.д.

В предложенной ниже схеме, аутентификация используется только для отправки метрик в «новый» кластер. Поэтому, в каждой из вышеуказанных переменных, значения для отправки метрик в «новый» VMetrics-кластер указаны в первой позиции. Тогда как значения для отправки в «старый» VMetrics-кластер указаны во второй позиции.

Так как отправка в «старый» VMetrics-кластер не требует аутентификации, то все переменные, кроме remoteWrite_url и remoteWrite_maxDiskUsagePerURL имеют только одно значение в первой позиции, предназначенные для использования при отправке в «новый» кластер. А в остальных двух переменных используются два значения. В remoteWrite_url мы видим адреса: в первой позиции — URL «нового» кластера, а во второй позиции — URL «старого». И в remoteWrite_maxDiskUsagePerURL определены размеры буфера, используемые при буферизации метрик: в первой позиции — размер буфера для первого URL, а во второй позиции — размер буфера для второго URL.

Переменная Первая позиция Вторая позиция

remoteWrite_url

"https://vd-vmauth.example.org"

"http://10.0.0.200:8480/insert/222/prometheus/api/v1/write"

remoteWrite_bearerTokenFile

"bearer.txt"

remoteWrite_headers

"TenantID: 203"

remoteWrite_urlRelabelConfig

"filters/203.yml"

remoteWrite_maxDiskUsagePerURL[1]

"5GB"

"5GB"

Естественно, при необходимости, можно дополнить переменные, чтобы организовать отправку в третье и последующие URL.

Задача

Подробности

1

Создание файла /etc/sysconfig/vmagent с флагами запуска демона VMAgent.

Переменные передаваемые в VMAgent при запуске демона:

  1. remoteWrite_url — содержит один или несколько адресов отправки метрик.

    Пример для отправки только в «новый» кластер:

    remoteWrite_url="${REMOTEWRITE_URL_NEW}"

    Пример для параллельной отправки в «новый» и «старый» кластеры:

    remoteWrite_url=\
    "${REMOTEWRITE_URL_NEW}",\
    "${REMOTEWRITE_URL_OLD}"
  2. remoteWrite_bearerTokenFile — путь к файлу со строкой Bearer Token для доступа к VMetrics-кластеру. Так как файл находится в «рабочем» каталоге VMagent (/etc/victoriametrics/), то путь к файлу можем опустить. Пример: remoteWrite_bearerTokenFile="bearer.txt"

  3. remoteWrite_headers — содержит следующую строку с номером целевого тенанта. Пример: remoteWrite_headers="TenantID: ${TENANT}"

  4. remoteWrite_urlRelabelConfig — путь к файлам с правилами отбора метрик по номеру тенанта (метка vm_account_id). Пример: remoteWrite_urlRelabelConfig="filters/${TENANT}.yml"

  5. remoteWrite_maxDiskUsagePerURL — размер буфера хранения метрик на случай временной недоступности VMetrics-кластера. Используются чанки размером 500MB, поэтому выделять меньше этого значения не имеет смысла. Если под буфер используется отдельный диск, что рекомендуется, то переменную можно не использовать. Для каждого remoteWrite_url указывается отдельное значение через запятую.

  6. remoteWrite_label — список глобальных лейблов, назначаемых на абсолютно все метрики, проходящие сквозь vmagent, независимо от способа получения (push или pull). Пример назначения глобальных меток, для удобства чтения оформленных в несколько строк, где переменная SYSTEMD_HOSTNAME объявляется в systemd-юните и определяет имя хоста, а остальные метки добавляются/изменяются вручную:

    remoteWrite_label=\
    "vmagent_hostname=%{SYSTEMD_HOSTNAME}",\
    "vmagent_region=kurch",\
    "vmagent_vlan_num=0617",\
    "vmagent_vlan_env=dev"

Содержимое /etc/sysconfig/vmagent:

  • До настройки (сразу после установки rpm-пакета)

  • Пример отправки метрик только в «новый» VM-кластер

  • Пример параллельной отправки метрик

httpListenAddr=127.0.0.1:8429
promscrape_config=vmagent.yml

## Silently skip unsupported fields
#promscrape_config_strictParse=false

loggerLevel=INFO
promscrape_suppressDuplicateScrapeTargetErrors=true

## Directory for temporary storage of collected data
#remoteWrite_tmpDataPath="/var/lib/vmagent"
remoteWrite_tmpDataPath="/data/vmagent"

remoteWrite_label="vmagent_hostname=%{SYSTEMD_HOSTNAME}"
httpListenAddr=127.0.0.1:8429
promscrape_config=vmagent.yml

## Silently skip unsupported fields
#promscrape_config_strictParse=false

loggerLevel=INFO
promscrape_suppressDuplicateScrapeTargetErrors=true

## Directory for temporary storage of collected data
#remoteWrite_tmpDataPath="/var/lib/vmagent"
remoteWrite_tmpDataPath="/data/vmagent"

remoteWrite_url="https://vd-vmauth.example.org"

remoteWrite_bearerTokenFile="bearer.txt"

remoteWrite_headers="TenantID: 203"

remoteWrite_urlRelabelConfig="filters/203.yml"

remoteWrite_maxDiskUsagePerURL=10GB

remoteWrite_label="vmagent_hostname=%{SYSTEMD_HOSTNAME}"
httpListenAddr=127.0.0.1:8429
promscrape_config=vmagent.yml

## Silently skip unsupported fields
#promscrape_config_strictParse=false

loggerLevel=INFO
promscrape_suppressDuplicateScrapeTargetErrors=true

## Directory for temporary storage of collected data
#remoteWrite_tmpDataPath="/var/lib/vmagent"
remoteWrite_tmpDataPath="/data/vmagent"

remoteWrite_url=\
"https://vd-vmauth.example.org",\
"http://10.1.1.122:8480/insert/222/prometheus/api/v1/write"

remoteWrite_bearerTokenFile="bearer.txt"

remoteWrite_headers="TenantID: 203"

remoteWrite_urlRelabelConfig="filters/203.yml"

remoteWrite_maxDiskUsagePerURL=5GB,5GB

remoteWrite_label=\
"vmagent_hostname=%{SYSTEMD_HOSTNAME}",\
"vmagent_region=kurch",\
"vmagent_vlan_num=0617",\
"vmagent_vlan_env=dev"

2

Опциональное добавление CA-сертификата домена.

Этот пункт пропускается, если хост был ранее введён в домен и является участником нашего домена example.org.
  • Выполняется только в описанном в левой части таблицы случае.

    1. Добавьте в файл /etc/sysconfig/vmagent следующую переменную с одним значением:

      remoteWrite_tlsCAFile="ca.crt"
      В переменной remoteWrite_url https-адрес «нового» VMetrics-кластера находится в первой позиции, поэтому здесь достаточно указать одно значение.
    2. Добавьте CA-сертификат домена EXAMPLE.ORG в «рабочий» каталог VMAagent:

      cat << EOF > /etc/victoriametrics/ca.crt
      -----BEGIN CERTIFICATE-----
      MIIDhTCCAm2gAwIBAgIBATANBgkqhkiG9w0BAQsFADA0MRIwEAYDVQQKDAlEQVRB
      ....
      qBh7PtUIDlIT3mb6oKMaLxm971GsX0cWiIynI6Vp/lg+ULFt3zRJVrA=
      -----END CERTIFICATE-----
      EOF

3

Создание файла с секретным Bearer Token.

  • Путь к этому файлу указывается в переменной remoteWrite_bearerTokenFile.

  • Выполните:

    set +o history
    echo ${BEARER_TOKEN} > /etc/victoriametrics/bearer.txt
    set -o history

4

Добавление файлов с фильтрами отбора метрик по номеру тенанта.

  • Путь к этому файлу указывается в переменной remoteWrite_urlRelabelConfig.

    Здесь создаётся файл с правилом отбора только тех метрик, у которых в метке vm_account_id присутствует требуемый номер тенанта.

    Пример:

    - action: keep
      source_labels: [vm_account_id]
      regex: "${TENANT}"
  • Примеры создания файла с фильтром для тенанта 203:

    TENANT=203
    cat << EOF > /etc/victoriametrics/filters/${TENANT}.yml
    - action: keep
      source_labels: [vm_account_id]
      regex: "${TENANT}"
    EOF




6. Редактирование «основного» файла для настройки сбора метрик методом pull

В большинстве случаев в установленном файле достаточно изменить:

  • интервал сбора метрик scrape_interval;

  • список меток, назначаемых на все собранные метрики.

Задача

Подробности

1

Редактирование «основного» conf-файла vmagent.yml

  • Путь к conf-файлу указывается во флагах запуска, в переменной promscrape_config,

  • В этом conf-файле определяем путь к каталогу с целями сбора в списке scrape_config_files.

  • Здесь же, в словаре external_labels, определяем лейблы, назначаемые на метрики, собранные только методом pull.

  • Вот пример различных меток, где переменная SYSTEMD_HOSTNAME объявляется в systemd-юните и определяет имя текущего хоста, а остальные метки добавляются/изменяются вручную:

external_labels: (1)
  scraper_hostname: %{SYSTEMD_HOSTNAME} (2)
  scraper_region: "kurch" (3)
  scraper_vlan_num: "0617" (3)
  scraper_vlan_env: "dev" (3)
1 Словарь с метками для всех метрик, собираемых методом pull.
2 Переменная SYSTEMD_HOSTNAME инициализируется в systemd-юните vmagent.service.
3 Примеры других меток.

Пример содержимого файла файла /etc/victoriametrics/vmagent.yml:

  • Сразу после установки rpm-пакета

  • После конфигурирования

scrape_config_files:
  - targets/*.yml

global:
  scrape_interval: 15s
  external_labels:
    scraper_hostname: %{SYSTEMD_HOSTNAME}
scrape_config_files:
  - targets/*.yml

global:
  scrape_interval: 15s
  external_labels:
    scraper_hostname: %{SYSTEMD_HOSTNAME}
    scraper_region: "kurch"
    scraper_vlan_num: "0617"
    scraper_vlan_env: "dev"




7. Пример настройки сбора собственных метрик

В большинстве случае в установленных файлах достаточно:

  • изменить номер тенанта в метке vm_account_id;

  • добавить/изменить номера проектов в метке vm_project_id;

  • добавить собственные job.

Задача

Подробности

1

Редактирование Job-файла для сбора собственных метрик VMAgent.

  • Здесь метрики будут отправлены в тенант 203:2.

  • Изменяемые строки:

    relabel_configs:
      - action: replace
        target_label: "vm_account_id"
        replacement: "${TENANT}"
    - action: replace
          target_label: "vm_project_id"
          replacement: "${PROJECT}"

Пример содержимого файла /etc/victoriametrics/targets/vmagent.yml:

- job_name: "vmagent"
  static_configs:
    - targets:
        - 127.0.0.1:8429
  metrics_path: /metrics
  relabel_configs:
    - source_labels: [__address__]
      target_label: instance
      replacement: %{SYSTEMD_HOSTNAME}
    - action: replace
      target_label: "vm_account_id"
      replacement: "203"
    - action: replace
      target_label: "vm_project_id"
      replacement: "2"

2

Редактирование Job для сбора метрик из установленного локально Telegraf.

  • Здесь метрики будут отправлены в тенант 203:1.

  • Переменная SYSTEMD_HOSTNAME объявляется в systemd-юните и определяет имя текущего хоста, что позволяет собрать метрики с локально работающего telegraf.

  • При необходимости, в этот же Job можно добавить target других хостов текущего VLAN для сбора Telegraf-метрик.

  • Изменяемые строки:

    relabel_configs:
      - action: replace
        target_label: "vm_account_id"
        replacement: "${TENANT}"
      - action: replace
        target_label: "vm_project_id"
        replacement: "${PROJECT}"

Пример содержимого файла /etc/victoriametrics/targets/telegraf.yml:

- job_name: "telegraf"
  #scrape_interval: 15s
  static_configs:
    - targets:
        - %{SYSTEMD_HOSTNAME}:9100
#       - hostname1:9100
#       - hostname2:9100
  metrics_path: /metrics
  relabel_configs:
    - action: replace
      target_label: "vm_account_id"
      replacement: "203"
    - action: replace
      target_label: "vm_project_id"
      replacement: "1"




8. Запуск демона vmagent

Задача

Подробности

1

Запуск демона.

Выполните команду:

systemctl enable --now vmagent

2

Проверка

Выполните команду:

journalctl -u vmagent -n 100 -f --no-hostname
Примерный ожидаемый вывод:
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.070Z        info        VictoriaMetrics/app/vmagent/main.go:144        starting vmagent at "[127.0.0.1:8429]"...
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.072Z        info        VictoriaMetrics/lib/memory/memory.go:42        limiting caches to 1241272320 bytes, leaving 827514880 bytes to the OS according to -memory.allowedPercent=60
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.073Z        info        VictoriaMetrics/lib/persistentqueue/fastqueue.go:71        opened fast queue at "/data/vmagent/persistent-queue/1_A3AAB188CD4F97D5" with maxInmemoryBlocks=400, it contains 0 pending bytes, persistence is enabled
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.097Z        info        VictoriaMetrics/app/vmagent/remotewrite/client.go:211        initialized client for -remoteWrite.url="1:secret-url"
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.098Z        info        VictoriaMetrics/lib/persistentqueue/fastqueue.go:71        opened fast queue at "/data/vmagent/persistent-queue/2_15F179C5C3171F41" with maxInmemoryBlocks=400, it contains 0 pending bytes, persistence is enabled
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.100Z        info        VictoriaMetrics/app/vmagent/remotewrite/client.go:211        initialized client for -remoteWrite.url="2:secret-url"
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.100Z        info        VictoriaMetrics/lib/persistentqueue/fastqueue.go:71        opened fast queue at "/data/vmagent/persistent-queue/3_E93052543439D9D5" with maxInmemoryBlocks=400, it contains 0 pending bytes, persistence is enabled
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.103Z        info        VictoriaMetrics/app/vmagent/remotewrite/client.go:211        initialized client for -remoteWrite.url="3:secret-url"
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.103Z        info        VictoriaMetrics/app/vmagent/main.go:169        started vmagent in 0.033 seconds
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.104Z        info        VictoriaMetrics/lib/httpserver/httpserver.go:169        started server at http://127.0.0.1:8429/
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.104Z        info        VictoriaMetrics/lib/httpserver/httpserver.go:171        pprof handlers are exposed at http://127.0.0.1:8429/debug/pprof/
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.104Z        info        VictoriaMetrics/lib/promscrape/scraper.go:118        reading scrape configs from "vmagent.yml"
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.106Z        info        VictoriaMetrics/lib/promscrape/config.go:149        starting service discovery routines...
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.106Z        info        VictoriaMetrics/lib/promscrape/config.go:155        started 2 service discovery routines in 0.000 seconds
Mar 27 18:25:31 vmagent-prod[21127]: 2025-03-27T15:25:31.106Z        info        VictoriaMetrics/lib/promscrape/scraper.go:439        static_configs: added targets: 2, removed targets: 0; total targets: 2

1. Если под буфер выделен отдельный диск, то переменная remoteWrite_maxDiskUsagePerURL не потребуется.