Моніторинг дискового простору в Grafana


4 хвилини

Детальний посібник із налаштування моніторингу дискового простору в Grafana та Prometheus. Дізнайтеся, як обійти ізоляцію Docker-контейнерів, правильно налаштувати точки монтування (mount points) та безпечно вивести метрики всіх ваших дисків на дашборд.

Перевірка точки монтування накопичувачів

Наразі Root FS та MicroSD картки не відображаються на дашборді. В цій статті я покроково пофікшу це!

Список реальних дисків та точок монтування виглядає так:

lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0     2G  0 loop
mmcblk0     179:0    0 117.1G  0 disk
└─mmcblk0p1 179:1    0 117.1G  0 part /media/rpi/NX
zram0       254:0    0     2G  0 disk [SWAP]
nvme0n1     259:0    0 238.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/firmware
└─nvme0n1p2 259:2    0   238G  0 part /

Тобто в мене лише 2 диски:

  • nvme0n1 на 256 Гб – мій SSD на якому встановлено систему
  • mmcblk0 на 128 Гб – моя MicroSD картка для відеоспостереження

Тепер треба визначити як бачить ці диски Prometheus та Grafana

Диски та точки монтування доступні Prometheus

Першим кроком у налаштуванні моніторингу Raspberry Pi є перевірка того, які саме накопичувачі та точки монтування (mount points) бачить Prometheus. Використовуючи запит node_filesystem_size_bytes, ми очікуємо побачити повний перелік фізичних пристроїв, як-от системний SSD (/dev/nvme0n1) або MicroSD картка (/dev/mmcblk0). Саме ці дані є фундаментом для візуалізації на дашборді Node Exporter Full, де змінні (variables) фільтрують метрики за назвою пристрою або точкою його підключення в системі.

Проте на жаль при виконанні запиту node_filesystem_size_bytes я отримую неочікувану відповідь, яка свідчить про те, що mountpoint відбувається не до диску, а до певних файлів.

Замість реальних розділів диска Prometheus видає лише три специфічні точки монтування:

  • /etc/hostname
  • /etc/hosts
  • /etc/resolv.conf

Ця проблема виникає через «ізоляцію» контейнера, коли Node Exporter запущений у Docker без належного доступу до хостової системи.

В такому стані експортер бачить лише ті віртуальні файли, які Docker автоматично прокидає всередину кожного контейнера для роботи мережі, ігноруючи SSD та інші накопичувачі.

Виправлення конфігурації Node Exporter

Щоб виправити цю ситуацію та отримати доступ до реальних показників заліза, необхідно змінити конфігурацію запуску контейнера. Основним рішенням є монтування всієї кореневої файлової системи Raspberry Pi у контейнер (зазвичай у директорію /host) та використання прапорця --path.rootfs.

Це дозволяє Node Exporter вийти за межі “пісочниці” Docker і збирати коректні дані про заповнення дисків, температуру та стан файлових систем безпосередньо з вашої ОС.

Зміни для Root FS

До файлу конфігурації, в блок Node Exporter треба дописати наступні рядки:

volumes:
  - /:/host:ro,rslave
command:
  - '--path.rootfs=/host'

Після перезавантаження контейнеру, значення Root FS з’явиться на дашборді.

Зміни для MicroSD

Проте цього недостатньо, адже потрібно ще додати картку пам’яті MicroSD. Моя картка виконує роль диску для зберігання даних з камери відеоспостереження, тому для неї застосовуються обмеження при монтуванні:

cat /etc/fstab
/dev/disk/by-id/mmc-USDU1_0x023b122a-part1 /media/rpi/NX/ auto nosuid,nodev,nofail,x-gvfs-show 0 0

Саме через наявність атрибуту nodev докер не має доступу до цього диску, тому і пише помилку в Prometheus:

node_filesystem_device_error{device="/dev/mmcblk0p1", device_error="permission denied", fstype="ext4", instance="node-exporter:9100", job="node", mountpoint="/media/rpi/NX"} 1

Щоб виправити права доступу для докер контейнера треба в конфігураційному файлі дописати ще параметр:

user: "1000:1000"

Тепер контейнер буде запускатися від імені користувача системи. В будь якому разі це краще аніж запускати контейнер від користувача root:root.

node_filesystem_size_bytes{device="/dev/mmcblk0p1", fstype="ext4", instance="node-exporter:9100", job="node", mountpoint="/media/rpi/NX"}	123181195264

На основі сусіднього віджету Root FS, я зробив дублікат та замінивши точку монтування з / на /media/rpi/NX таким чином отримав графік окремо для своєї картки.

Залишилося тепер прибрати зайві примонтовані файли, тому треба ще додати рядок, в якому будуть виключені наступні директорії:

- '--collector.filesystem.mount-points-exclude=^/(dev|proc|sys|run|tmp|host)($|/)'

Результат

Після внесення змін, доступ з’явився до файлової системи, картки пам’яті та зайві файли та дироекторії були приховані. Результуючий повний блок налаштування node-exporter виглядає так:

node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    user: "1000:1000"
    volumes:
      - /:/host:ro,rslave
    command:
      - '--path.rootfs=/host'
      - '--collector.filesystem.mount-points-exclude=^/(dev|proc|sys|run|tmp|host)($|/)'
    ports:
      - 9100:9100
    restart: unless-stopped

Висновки

Отже, для відображення основної файлової системи (Root FS) головною перешкодою була базова ізоляція Docker-контейнера, через яку експортер бачив лише системні файли мережі. Я успішно вирішив це, повністю змонтувавши кореневу директорію Raspberry Pi всередину контейнера та вказавши Node Exporter правильний шлях через прапорець --path.rootfs. Додаткове застосування регулярних виразів для виключення службових директорій (dev, proc, sys тощо) дозволило позбутися інформаційного шуму та вивести на дашборд чисту статистику нашого системного NVMe SSD.

Що стосується MicroSD картки для відеоспостереження, проблема полягала в жорстких обмеженнях прав доступу, заданих параметрами монтування в /etc/fstab. Замість того, щоб йти на компроміси з безпекою та запускати контейнер із правами root, ми застосували кращу практику — делегували контейнеру права звичайного користувача системи через параметр user: "1000:1000". Це елегантне рішення миттєво усунуло помилку “permission denied”, дозволивши Prometheus зібрати метрики, а нам — легко вивести їх на окремий віджет у Grafana.