Работа сервера метрик в режиме разделенного коллектора и агрегатора

Сервер метрик состоит из двух компонентов:

  • Коллектор. Эта часть отвечает за непосредственный обмен метриками между приложениями (например, СУБД «Квант-Гибрид») и сервером метрик. Отправка метрик осуществляется через разделяемую память, которой управляет сервер метрик. Данный компонент не занимается обработкой метрик, лишь их сбором из множества источников. Далее метрики передаются во второй компонент — агрегатор.
  • Агрегатор. Как следует из названия, этот компонент агрегирует, то есть накапливает метрики и делает статистические вычисления: усреднение, вычисление перцентилей, максимальных значений и т. д. Также этот компонент занимается отправкой агрегированных метрик дальше, например, в Graphite, или записывает их в CSV-файл.

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

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

ВНИМАНИЕ!
Сервер метрик в режиме коллектора все еще должен работать на том же хосте, что и исследуемое приложение, так как обмен метриками осуществляется через разделяемую память. Техническая возможность вынести коллектор на отдельный хост отсутствует.



Возможные причины для переноса агрегатора сервера метрик на отдельный хост

Разделение коллектора и агрегатора не является необходимым, но в ряде случаев их разделение может быть полезно, а именно:

  • Конечный получатель агрегированных метрик (например, Graphite) может быть недоступен с хоста, где запускается исследуемое приложение.
  • Исследуемое приложение разнесено на разные хосты, и есть желание агрегировать метрики по всем хостам «насквозь», не учитывая этого различия.
  • Для снижения нагрузки на хост, где запущен сервер метрик. Однако следует отметить, что агрегация метрик не отнимает много ресурсов, поэтому такая оптимизация сомнительна.

Данный перечень не является исчерпывающим, но призван описать возможные применения.



Настройка агрегатора сервера метрик на отдельном хосте

Запуск сервера метрик в режиме коллектора осуществляется одним из следующий способов, от более предпочтительных к менее:

  • Удалите или закомментируйте целиком раздел aggregation: в конфигурационном файле /etc/metricsd/config.yaml.
  • /usr/bin/metricsd --only-collector --config /etc/metricsd/config.yaml, где /etc/metricsd/config.yaml — путь к конфигурационному файлу.
  • С помощью дополнительного файла /etc/systemd/system/metricsd.service.d/override.conf (вместо override.conf можно выбрать любое другое имя, заканчивающееся на .conf) со следующим содержимым:
    [Service]
    ExecStart=
    ExecStart=/usr/bin/metricsd --only-collector --config /etc/metricsd/config.yaml
    
  • Посредством изменения файла metricsd.service и добавления флага --only-collector к вызову metricsd в поле ExecStart=. Данный способ не рекомендуется к применению. Используйте его, только если точно знаете, что делаете, на свой страх и риск.

Коллектор в данном случае является просто каналом для передачи метрик на другой хост к агрегатору. Агрегатор настраивается на подключение к соответствующему серверу (Prometheus, Graphite и др.).

Сервер метрик, работающий в режиме агрегатора, устанавливается на отдельном сервере, см. раздел Установка.

Запуск сервера метрик в режиме агрегатора осуществляется одним из следующий способов, от более предпочтительных к менее:

  • Удалите или закомментируйте целиком раздел collection: в конфигурационном файле /etc/metricsd/config.yaml.

  • /usr/bin/metricsd --only-aggregator --config /etc/metricsd/config.yaml, где /etc/metricsd/config.yaml — путь к конфигурационному файлу.

  • С помощью дополнительного файла /etc/systemd/system/metricsd.service.d/override.conf (вместо override.conf можно выбрать любое другое имя, заканчивающееся на .conf) со следующим содержимым:

    [Service]
    ExecStart=
    ExecStart=/usr/bin/metricsd --only-aggregator --config /etc/metricsd/config.yaml
    
  • Посредством изменения файла metricsd.service и добавления флага --only-aggregator к вызову metricsd в поле ExecStart=. Данный способ не рекомендуется к применению. Используйте его, только если точно знаете, что делаете, на свой страх и риск.

    ВНИМАНИЕ!
    Убедитесь в том, что:

    • в разделе «aggregation» конфигурации сервера метрик, работающего в режиме агрегатора, указан такой адрес listen_address, получение данных на который будет доступно с сервера метрик, работающего в режиме коллектора;
    • в разделе «collection» конфигурации сервера метрик, работающего в режиме коллектора, указан верный адрес агрегатора aggregator_address, соответствующий адресу из предыдущего пункта;
    • во избежание фрагментирования пакетов UDP, в разделе «collection» конфигурации сервера метрик, работающего в режиме коллектора, указан подходящий размер допустимого пакета udp_payload. Обратитесь к вашему системному/сетевому администратору для уточнения подходящего размера;
    • ваш сетевой администратор не запретил передачу пакетов UDP по сети.

Детали конфигурации сети выходят за рамки данного руководства. При возникновении вопроса обратитесь к вашему системному и/или сетевому администратору.


Пример файла конфигурации коллектора:

# Уровень детализации на сервере.
verbosity: "warn"

# Конфигурация сбора метрик.
#
# Если вы не хотите запускать сбор метрик, этот раздел можно пропустить.
collection:
  # Адрес и порт (UDP) агрегатора метрик.
  # Необязательны, если агрегация метрик выполняется на том же экземпляре сервера;
  # в противном случае необходимы.
  aggregator_address: "127.0.0.1:5400"

  # Unix-адрес квитирующего сервера коллектора.
  # Символ `@` в начале означает абстрактный сокет (т. е. в файловой системе
  # никакого сокета не создается).
  bind_addr: "@metrics-collector"

  # Путь, по которому создаются запросы spsc.
  queue_path: "/metrics-collector-queues"

  # Вместимость приемника запросов.
  # Необязательно. Значение по умолчанию – 1024.
  queue_capacity: 1024

  # Количество обработанных элементов, после которого обновляются разделяемые
  # счетчики.
  # Необязательно. Значение по умолчанию – до 10.
  batch_size: 10

  # Количество обрабатываемых потоков.
  # Необязательно. Значение по умолчанию – до 2.
  threads: 2

  # Объем полезных данных UDP.
  # Необязательно. Значение по умолчанию – 1024.
  udp_payload: 1024

  # Максимальный интервал между передачами.
  # Необязательно. Значение по умолчанию – "1s" (1 с).
  send_interval: "1s"

  # Количество потоков рабочих процессов.
  # Необязательно. Значение по умолчанию – 2.
  workers: 2

Пример файла конфигурации агрегатора:

# Уровень детализации на сервере.
verbosity: "info"

# Конфигурация агрегации метрик.
#
# Если вы не хотите запускать агрегацию метрик, этот раздел можно пропустить.
aggregation:
  # Адрес прослушивания агрегатора
  # Необязателен, если сбор метрик выполняется на том же экземпляре сервера;
  # в противном случае необходим.
  listen_address: "0.0.0.0:5400"

  # Интервал между каждой агрегацией
  send_interval: 10s

  # Список используемых перцентилей для величин синхронизации. Значения по
  # умолчанию – [50, 90, 95, 99, 999].
  # Значения больше 1000 не поддерживаются.
  percentiles_list: [50, 90, 95, 99, 999]

  # Срок существования «индикаторных» (gauge) значений. Необязательно;
  # по умолчанию 5 минут.
  gauge_lifetime: 5min

  # Конфигурация серверов. Должен быть сконфигурирован как минимум один сервер.
  backends:
    # Конфигурация сервера graphite
    - graphite:
      # Адрес конечной точки TCP Graphite для текстового протокола. Порт по
      # умолчанию 2003.
      # Доступен только протокол TCP, поэтому если Graphite не ожидает передачи
      # данных на этом порту, вы получите ошибку!
      address: "Address:2003"
      # Префикс, стоящий в начале имени всех метрик. Необязательно; по умолчанию
      # это пустая строка.
      prefix: "Address"
      # Максимальное время ожидания подключения. Необязательно; по умолчанию 30 секунд.
      connection_timeout: "30 sec"
      # Максимальное время ожидания передачи данных. Необязательно; по умолчанию 5 секунд.
      send_timeout: "5 sec"