- Добавлен новый коллектор proxvmsystem, объединяющий функциональность system и gpu коллекторов - Добавлен machine_uid для идентификации VM/контейнеров в Proxmox инфраструктуре - Обновлена документация по коллекторам и проекту - Добавлены новые хосты в inventory для тестирования - Обновлен Makefile для сборки нового коллектора - Обновлен config.yaml с конфигурацией proxvmsystem коллектора Автор: Сергей Антропов Сайт: https://devops.org.ru
11 KiB
Коллектор proxvmsystem
Автор: Сергей Антропов
Сайт: https://devops.org.ru
Платформа: Linux
Тип: exec (Go-бинарник)
Описание
Коллектор proxvmsystem
объединяет функциональность коллекторов system
и gpu
, добавляя уникальный идентификатор machine_uid
для идентификации виртуальной машины или контейнера в Proxmox инфраструктуре.
Назначение
- Сбор системных метрик (CPU, RAM, сеть, диски, время синхронизации, обновления)
- Сбор информации о GPU устройствах (NVIDIA/AMD)
- Генерация уникального
machine_uid
на основе/etc/machine-id
или/var/lib/dbus/machine-id
- Предоставление единого интерфейса для мониторинга VM/контейнеров с привязкой к уникальному идентификатору
Конфигурация
proxvmsystem:
enabled: true
type: exec
key: proxvmsystem
interval: "300s"
timeout: "60s"
exec: "./collectors/proxvmsystem"
platforms: [linux]
Выходные данные
Структура JSON
{
"collector_name": "proxvmsystem",
"machine_uid": "e7b3e8ed05a8d0c9",
"cpu": {
"usage_percent": 15.2,
"cores": 4,
"load_avg": [0.8, 1.2, 1.5]
},
"ram": {
"total_gb": 16.0,
"used_gb": 8.5,
"free_gb": 7.5,
"usage_percent": 53.1
},
"swap": {
"total_gb": 2.0,
"used_gb": 0.1,
"free_gb": 1.9,
"usage_percent": 5.0
},
"network": {
"interfaces": [
{
"name": "eth0",
"speed_mbps": 1000,
"mac": "00:11:22:33:44:55",
"ips": ["10.14.246.75/24"],
"rx_bytes": 1024000,
"tx_bytes": 2048000
}
]
},
"disks": [
{
"device": "/dev/sda",
"mountpoint": "/",
"total_gb": 50.0,
"used_gb": 25.0,
"free_gb": 25.0,
"usage_percent": 50.0
}
],
"time_sync": {
"ntp_sync": true,
"ntp_offset_ms": 0.5,
"system_time": "2024-01-15T10:30:00Z"
},
"updates": {
"available": 5,
"security": 2,
"last_check": "2024-01-15T09:00:00Z"
},
"gpu": [
{
"id": "0",
"name": "NVIDIA GeForce RTX 3080",
"driver_version": "470.86",
"memory_total_mb": 10240,
"memory_used_mb": 2048,
"memory_free_mb": 8192,
"utilization_percent": 25.0,
"temperature_c": 65,
"power_usage_w": 180
}
],
"gpu_summary": {
"total_gpus": 1,
"total_memory_mb": 10240,
"total_utilization_percent": 25.0,
"total_power_usage_w": 180
},
"execution_time_ms": 1250,
"execution_time_seconds": 1.25
}
Поля данных
Основные поля
collector_name
(string) - имя коллектора: "proxvmsystem"machine_uid
(string) - уникальный идентификатор машины (SHA256 хэш от machine-id)
Системные метрики
-
cpu
(object) - информация о процессореusage_percent
(float) - загрузка CPU в процентахcores
(int) - количество ядерload_avg
(array) - средняя загрузка за 1, 5, 15 минут
-
ram
(object) - информация об оперативной памятиtotal_gb
(float) - общий объем RAM в GBused_gb
(float) - используемый объем RAM в GBfree_gb
(float) - свободный объем RAM в GBusage_percent
(float) - процент использования RAM
-
swap
(object) - информация о swaptotal_gb
(float) - общий объем swap в GBused_gb
(float) - используемый объем swap в GBfree_gb
(float) - свободный объем swap в GBusage_percent
(float) - процент использования swap
-
network
(object) - информация о сетевых интерфейсахinterfaces
(array) - массив сетевых интерфейсовname
(string) - имя интерфейсаspeed_mbps
(int) - скорость в Mbpsmac
(string) - MAC адресips
(array) - IP адресаrx_bytes
(int) - получено байтtx_bytes
(int) - отправлено байт
-
disks
(array) - информация о дискахdevice
(string) - устройствоmountpoint
(string) - точка монтированияtotal_gb
(float) - общий размер в GBused_gb
(float) - используемый размер в GBfree_gb
(float) - свободный размер в GBusage_percent
(float) - процент использования
-
time_sync
(object) - информация о синхронизации времениntp_sync
(bool) - синхронизация с NTPntp_offset_ms
(float) - смещение от NTP в миллисекундахsystem_time
(string) - системное время
-
updates
(object) - информация об обновленияхavailable
(int) - количество доступных обновленийsecurity
(int) - количество обновлений безопасностиlast_check
(string) - время последней проверки
GPU метрики
-
gpu
(array) - информация о GPU устройствахid
(string) - ID GPUname
(string) - название GPUdriver_version
(string) - версия драйвераmemory_total_mb
(int) - общая память в MBmemory_used_mb
(int) - используемая память в MBmemory_free_mb
(int) - свободная память в MButilization_percent
(float) - загрузка GPU в процентахtemperature_c
(int) - температура в градусах Цельсияpower_usage_w
(int) - потребление энергии в ваттах
-
gpu_summary
(object) - агрегированная информация о GPUtotal_gpus
(int) - общее количество GPUtotal_memory_mb
(int) - общая память всех GPU в MBtotal_utilization_percent
(float) - средняя загрузка GPUtotal_power_usage_w
(int) - общее потребление энергии
Метаданные
execution_time_ms
(int) - время выполнения коллектора в миллисекундахexecution_time_seconds
(float) - время выполнения коллектора в секундах
Генерация machine_uid
Коллектор генерирует уникальный идентификатор machine_uid
на основе machine-id системы:
- Чтение machine-id: Пытается прочитать из
/etc/machine-id
или/var/lib/dbus/machine-id
- Генерация хэша: Создает SHA256 хэш от machine-id
- Усечение: Берет первые 16 символов хэша для компактности
func getMachineIDFromHost() string {
paths := []string{
"/etc/machine-id",
"/var/lib/dbus/machine-id",
}
for _, path := range paths {
if data, err := os.ReadFile(path); err == nil {
machineID := strings.TrimSpace(string(data))
if machineID != "" {
hash := sha256.Sum256([]byte(machineID))
return hex.EncodeToString(hash[:])[:16]
}
}
}
return ""
}
Зависимости
Системные команды
df
- информация о дискахntpq
- информация о NTP синхронизацииtimedatectl
- информация о времени системыapt
- информация об обновлениях (Ubuntu/Debian)yum
- информация об обновлениях (CentOS/RHEL)
GPU команды
nvidia-smi
- информация о NVIDIA GPUrocm-smi
- информация об AMD GPU
Файлы системы
/proc/stat
- статистика CPU/proc/meminfo
- информация о памяти/proc/loadavg
- средняя загрузка системы/sys/class/net/<iface>/speed
- скорость сетевых интерфейсов/etc/machine-id
- уникальный идентификатор машины/var/lib/dbus/machine-id
- альтернативный путь к machine-id
Использование
Запуск коллектора
# Прямой запуск
./collectors/proxvmsystem
# С переменными окружения
COLLECTOR_TIMEOUT=60s ./collectors/proxvmsystem
Интеграция с агентом
Коллектор автоматически запускается агентом согласно конфигурации в config.yaml
.
Ограничения
- Работает только на Linux системах
- Требует права на чтение системных файлов
- GPU метрики доступны только при наличии соответствующих драйверов
- Время выполнения может варьироваться в зависимости от количества GPU и системных ресурсов
Логирование
Коллектор выводит отладочную информацию в stderr для диагностики проблем:
- Ошибки чтения системных файлов
- Проблемы с выполнением команд
- Ошибки парсинга данных
Примеры использования
Мониторинг VM в Proxmox
# Получение machine_uid VM
ssh vm-host "./collectors/proxvmsystem" | jq '.machine_uid'
# Сравнение с данными от proxvms коллектора на Proxmox ноде
ssh proxmox-node "./collectors/proxvms" | jq '.vms[] | select(.machine_uid == "e7b3e8ed05a8d0c9")'
Мониторинг производительности
# Загрузка CPU и GPU
./collectors/proxvmsystem | jq '{cpu: .cpu.usage_percent, gpu: .gpu_summary.total_utilization_percent}'
# Использование памяти
./collectors/proxvmsystem | jq '{ram: .ram.usage_percent, swap: .swap.usage_percent}'
Связанные коллекторы
system
- базовые системные метрикиgpu
- информация о GPU устройствахproxvms
- информация о VM/контейнерах Proxmoxproxnode
- информация о Proxmox нодахproxcluster
- информация о Proxmox кластере