Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

О программе

Persona Exporter — это легковесный, высокопроизводительный системный агент (экспортер), предназначенный для сбора метрик операционной системы и их последующей отправки на сервер мониторинга.

Главная особенность проекта — его архитектура. Экспортер полностью написан на языке программирования Rust, благодаря чему он обладает высокой безопасностью работы с памятью и максимальной производительностью. Он потребляет ничтожно малое количество ресурсов CPU и RAM, что делает его хорошим выбором для развертывания на машинах с жесткими аппаратными ограничениями или в высоконагруженных окружениях. Поддерживает формат данных JSON / Line Protocol, а следовательно основным хранилищем метрик может выступать любая база данных поддерживающая эти форматы, к примеру Influx DB / Victoria Metrics

ИЗ особенностей можно выделить:

  • Минимальная нагрузка: Эффективное использование ресурсов без тяжелых рантаймов.
  • Простая доставка: Отправка собранных метрик стандартными POST-запросами на указанный url.
  • Кроссплатформенность: Работает в Linux, Windows и macOS как в виде бинарного файла, так и внутри Docker-контейнеров.

Введение

Архитектура потока данных

Процесс работы Persona Exporter можно верхнеуровнево описать следующей схемой:

graph TD
    OS[Операционная система с которой хотите собирать метрики] 
    -->|Сбор метрик: CPU, RAM, Сеть, Датчики, Диски, Процессы| PE(Persona Exporter)
    PE 
    -->|POST-запрос: JSON / Line Protocol| TSDB[(Сервер мониторинга<br>InfluxDB / Victoria Metrics *или любая другая поддерживающая формат данных Line Protocol*)]

С чего начать?

Если вы хотите развернуть экспортер прямо сейчас, переходите к разделу Установка, где описаны способы сборки из исходников, запуск в Docker и особенности настройки под разные операционные системы.

Установка

В первой главе будет уделено внимание установки экспортера на разные операционные системы. Из доступных вариантов:

  • Сборка из исходников - для чего требуется установленный Rust
  • Бинарный файл
  • Запуск из Docker контейнера

Сборка из исходников

Для того чтобы собрать проект из исходных файлов потребуется установить компилятор Rust и Git

Установка Rust Lang

Перейдите на официальный сайт Rust Programming Language в раздел установки и следуйте инструкциям.

Скачивание репозитория через git

Перед началом установите саму систему контроля версий git выберите вашу операционную систему в разделе установки и следуйте инструкциям.

После установки выполните ряд команд чтобы добавить репозиторий с исходным кодом Persona Exporter

git clone https://github.com/Persona-Team/persona-exporter.git

# Переходим в сам репозиторий
cd ./persona-exporter

# Меняем ветку на стабильную main
git checkout main

Сборка

После того как вы установили Rust, Git и перешли в директорию с исходным кодом выполните одну простую команду

cargo build --release

Подождите ~2 минуты (в зависимости от мощности вашего железа) после чего вы увидите что-то вроде

Compiling persona-exporter v0.2.0 (/home/nikita/persona-exporter)
Finished `release` profile [optimized] target(s) in 1m 15s

Готовый бинарный файл будет лежать в директории ./target/release/persona-exporter

Linux

Debian / Ubuntu

RHEL

NixOS

Windows

Конфигурация

Расположение файла конфигурации экспортера зависит от вашей операцинной системы

/etc/persona-exporter/config.yaml

Как вы могли заметить формат файла конфигурации .yaml что полезно так как в файле используется большая вложенность параметров. По умолчанию (при условии что вы запустили экспортер от имени суперпользователя) все директории создадутся сами и в конфиг запишется шаблон для InfluxDB

server:
  push:
    url: "https://localhost:8086/api/v2/write"
    http_headers:
      Content-Type: "text/plain; charset=utf-8"
      Authorization: "Authorization: Token ${INFLUX_DB_TOKEN}"
    # Your url params, out: https://example.com?example=true&user_id=3
    url_params:
      org: "nikita-group"
      bucket: "nikita-bucket"
      precision: "ns"
    # Metric sending interval in seconds
    send_interval: 10

agent:
  # "line_protocol" "json"
  data_type: "line_protocol"
  # "push" / "pull" (soon)
  send_model: "push"

metrics:
  # For Line Protocol
  global_tags:
    # variable_name: value
    hostname: "name-your-server-please"
    env: "test-servers"
  cpu:
    enabled: true
  memory:
    enabled: true
  system:
    enabled: true
  disks:
    enabled: true
  processes:
    enabled: true
    # Maximum size of the process list (excluding information about the exporter itself)
    process_limit: 5
    include_exporter_metrics: true
    remove_dead_processes: true
    # "cpu_usage" / "memory" / "virtual_memory" / "run_time" / "start_time"
    sort_by: "cpu_usage"
  network:
    enabled: true
  components:
    enabled: true

Также, как вы могли заметить в блоке http-заголовках

Authorization: "Authorization: Token ${INFLUX_DB_TOKEN}"

Используется конструкция ${INFLUX_DB_TOKEN}, где INFLUX_DB_TOKEN - это переменная окружения вашей операционной системы / текущей сессии. Это полезно, к примеру, для секретных токенов авторизации которые лучше не “хард-кодить” прямо в файле конфигурации.

Конфигурация приложения

Ниже приведено полное описание всех параметров конфигурационного файла.

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

server:
  push:
    url: "https://localhost:8086/api/v2/write"
    http_headers:
      Content-Type: "text/plain; charset=utf-8"
      Authorization: "Authorization: Token ${INFLUX_DB_TOKEN}"
    url_params:
      org: "nikita-group"
      bucket: "nikita-bucket"
      precision: "ns"
    send_interval: 10

agent:
  data_type: "line_protocol"
  send_model: "push"

metrics:
  global_tags:
    hostname: "name-your-server-please"
    env: "test-servers"
  cpu:
    enabled: true
  memory:
    enabled: true
  system:
    enabled: true
  disks:
    enabled: true
  processes:
    enabled: true
    process_limit: 5
    include_exporter_metrics: true
    remove_dead_processes: true
    sort_by: "cpu_usage"
  network:
    enabled: true
  components:
    enabled: true

server

Тип: object

Корневой блок для настройки сетевого взаимодействия и отправки данных на удаленный сервер.


push

Тип: object

Полный путь: server.push

Настройки модели отправки метрик (Push-модель) во внешнее хранилище.


url

Тип: string

Полный путь: server.push.url

Пример::

server:
  push:
    url: http://example.com

Полный URL-адрес эндпоинта, на который агент будет отправлять собранные метрики с помощью HTTP-запросов.


http_headers

Тип: HashMap

Полный путь: server.push.http_headers

Пример:

server:
  push:
    http_headers:
      Content-Type: "text/plain; charset=utf-8"
      Authorization : "Authorization: Token ${INFLUX_DB_TOKEN}"

Произвольные HTTP-заголовки, которые будут добавлены в каждый запрос при отправке метрик. Используется для указания типов данных, токенов авторизации и прочего.

см. также url_params


url_params

Тип: HashMap

Полный путь: server.push.url_params

Пример:

server:
  push:
    url_params:
      # Сформирует URl вида "http(s)://myurl?org=my-org&example=true"
      org: "my-org"
      example: "true"

Параметры строки запроса (Query parameters), которые автоматически добавляются к конечному URL. Вы можете жестко прописать параметры вручную в секции URL, но указание их в отедельной секции будет считаться более идиоматичным и чистым способом.

см. также http_headers


send_interval

Тип: interger

Полный путь: server.push.send_interval

По умолчанию: 10

Интервал отправки собранных метрик на сервер (в секундах).


agent

Тип: object

Общие настройки поведения и формата работы самого агента сбора метрик.


data_type

Тип: enum (string)

Полный путь: agent.data_type

Допустимые значения: "line_protocol", "json"

По умолчанию: "json"

Пример:

agent:
  data_type: "line_protocol"

Формат сериализации данных перед их отправкой.


send_model

Тип: enum (string)

Полный путь: agent.send_model

Допустимые значения: "push", "pull" (в разработке)

По умолчанию: "push"

Пример:

agent:
  send_model: "push"

Режим распространения метрик. При значении "push" агент сам инициирует отправку данных на указанный server.push.url.


metrics

Тип: object

Глобальный конфигурационный блок для управления собираемыми метриками и системными компонентами.


global_tags : object

Пользовательские теги (метки) в формате ключ: значение, которые будут автоматически добавляться ко всем отправляемым метрикам (актуально для формата line_protocol). Используются для идентификации серверов и окружения на стороне СУБД.

  • hostname : string — Уникальное имя текущего хоста/сервера.
  • env : string — Название окружения (например: test-servers, production).

cpu : object

  • enabled : boolean (по умолчанию: true) — Включает или выключает сбор метрик процессора (загрузка ядер, утилизация).

memory : object

  • enabled : boolean (по умолчанию: true) — Включает или выключает сбор метрик оперативной памяти (общая, занятая, свободная, swap).

system : object

  • enabled : boolean (по умолчанию: true) — Включает или выключает общие системные метрики (аптайм, load average).

disks : object

  • enabled : boolean (по умолчанию: true) — Включает или выключает сбор информации о дисковой подсистеме (свободное место на разделах, операции ввода-вывода IOPS).

processes : object

Конфигурация сбора детальной статистики по запущенным в системе процессам.


enabled : boolean

  • По умолчанию: true

Включает или выключает мониторинг процессов.


process_limit : integer

  • По умолчанию: 5

Максимальное количество процессов, информация о которых попадет в финальный отчет (исключая сам процесс экспортера, если включена соответствующая опция). Защищает от переполнения буфера при большом количестве процессов в ОС.


include_exporter_metrics : boolean

  • По умолчанию: true

Определяет, нужно ли включать в собираемую статистику собственные метрики утилизации ресурсов данным агентом-экспортером.


remove_dead_processes : boolean

  • По умолчанию: true

Автоматически очищает и не отправляет данные о процессах, которые завершили свою работу (перешли в состояние завершенных/зомби) к моменту итерации сбора.


sort_by : string

  • Допустимые значения: "cpu_usage", "memory", "virtual_memory", "run_time", "start_time"
  • По умолчанию: "cpu_usage"

Критерий, по которому сортируется список процессов перед применением ограничения process_limit. Позволяет выявлять топ самых «прожорливых» процессов в системе.


network : object

  • enabled : boolean (по умолчанию: true) — Включает или выключает сбор метрик сетевых интерфейсов (трафик, пакеты, ошибки, скорость).

components : object

  • enabled : boolean (по умолчанию: true) — Включает или выключает сбор метрик аппаратных компонентов (например, температура датчиков материнской платы, процессора, статус кулеров).

Собираемые метрики

Система

Оперативная память

Дисковое пространство

Процессы

Датчики

Процессор

Сеть

Формат данных

Line Protocol

JSON

Запуск

Отладка