О программе
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) — Включает или выключает сбор метрик аппаратных компонентов (например, температура датчиков материнской платы, процессора, статус кулеров).