Моніторинг активності Докер контейнерів в Zabbix



Налаштувати моніторинг активності Docker-контейнерів у Zabbix – це завдання, яке я вирішив реалізувати для свого домашнього сервера на базі Raspberry Pi 5. Оскільки я використовую декілька контейнерів (бази даних, WordPress, контролер Unifi), мені важливо бачити в реальному часі, скільки ресурсів споживає кожен із них, щоб вчасно реагувати на навантаження.

Вступ

Звісно, можна просто зайти в консоль і прописати docker stats. Відобразиться базова інформація про використані ресурси. Утиліта docker stats виглядає доволі сумно.

Для кращого візуального сприйняття та аналізу історії я обрав Zabbix. Це дозволяє не лише бачити поточний стан, а й будувати графіки, порівнювати активність різних сервісів та зберігати історію метрик за тривалий період.

Ось приблизна схема того, як мій Zabbix Server взаємодіє з агентом на Raspberry Pi та отримує дані з Docker Engine

У цій архітектурі Raspberry Pi виступає фізичним хостом, на якому працює Docker і запущені всі сервіси у вигляді контейнерів, зокрема Zabbix Server, база даних, веб-інтерфейс Zabbix та інші прикладні контейнери.

На самому хості встановлений Zabbix Agent 2, який має доступ до Docker API через сокет docker.sock, завдяки цьому, агент отримує інформацію про стан контейнерів, їхній статус, використання CPU, пам’яті, мережі та дисків без прямого підключення до кожного контейнера.

Zabbix Agent 2 передає зібрані метрики Zabbix Server, що працює в Docker-контейнері, де ці дані обробляються, зберігаються в базі даних та використовуються для тригерів і алертів.

Користувач взаємодіє з системою через веб-інтерфейс Zabbix, який працює у контейнері та доступний по HTTP/HTTPS, отримуючи актуальну інформацію про стан як самого хоста Raspberry Pi, так і всіх Docker-контейнерів у динамічному вигляді.

Налаштування Zabbix Agent 2

В цьому розділі я опишу тільки певні команди, на які необхідно звернути увагу при інтеграції, тому я припущу, що Zabbix Server вже запущено в докер середовищі, також на хості вже встановлено Zabbix Agent 2.

Доступ до Docker socket

Zabbix Agent 2 звертається до Docker socket (/var/run/docker.sock), через який Docker daemon надає інформацію про стан і ресурси всіх контейнерів на хості.

Щоб додати агенту доступ до Docker socket треба виконати команду:

sudo usermod -aG docker zabbix

Ця команда додає користувача zabbix до групи docker, що дозволяє агенту читати Docker socket без використання root-прав і безпечно отримувати метрики контейнерів для передачі на Zabbix Server.

Тест Docker-плагіна агента

Для перевірки доступу Zabbix Agent 2 до Docker достатньо виконати команду:

zabbix_agent2 -t docker.info

Ця команда локально тестує Docker-плагін агента. У разі коректних прав доступу до Docker socket команда повертає структуровану інформацію про Docker (версія, кількість контейнерів, стан daemon), що підтверджує правильну конфігурацію агента та готовність до збору метрик.

Мій результат показав, що обмін даними відбувся успішно, тому можна переходити в налаштування Zabbix

Налаштування Zabbix хоста

За замовчуванням хост у Zabbix зазвичай прив’язаний до шаблону Linux by Zabbix agent, який відповідає за моніторинг операційної системи. Однак для моніторингу контейнерів цього недостатньо, тому до хоста необхідно додатково підключити шаблон Docker by Zabbix agent 2, який використовує Docker-плагін агента та дозволяє збирати метрики Docker daemon, контейнерів і їхнього стану.

В веб інтерфейсі треба вибрати існуючий хост, в моєму випадку RPI:

Data collection -> Hosts -> RPI

Далі в налаштуваннях хоста треба додати шаблон:

Templates -> Select Docker by Zabbix agent 2

Успішним результатом буде збільшення кількості Items. В моєму випадку аж до 614 записів, в дійсності це залежить від кількості контейнерів, адже один контейнер має 40 Items.

Збір даних

Щоб переконатися, що дані збираються необхідно перейти в меню Monitoring -> Latest data і в фільтрі Hosts вибрати із списку мій хост – RPI.

Якщо в списку відобразяться відповідні до скріншота значення TAGS та TAG VALUES, значить Zabbix успішно ідентифікував докер контейнери.

Тепер вибравши будь який контейнер можна подивитися метрику яка була зібрана. Припустимо мене цікавить значення CPU percent usage для контейнера webserver.

Використовуючи субфільтр треба вибрати TAG – container та Tag values – webserver. Список відпоівідно буде відфільтровано. Для перегляду графіку, треба клацнути на кнопку Graph.

Мій графік за останні 3 години виглядає наступним чином:

На основі цих даних можна вже будувати віджети на дашборді.

Метрики

Для розуміння можливостей наведу назви всіх 40 метрик для докер контейнерів. Згідно назви логічно можна зрозуміти за який параметр відповідає кожен item:

  1. CPU kernelmode usage per second
  2. CPU percent usage
  3. CPU total usage per second
  4. CPU usermode usage per second
  5. Created
  6. Current PIDs count
  7. Dead
  8. Error
  9. Exit code
  10. Finished at
  11. Get info
  12. Get stats
  13. Health failing streak
  14. Health status
  15. Image
  16. Memory commit bytes
  17. Memory commit peak bytes
  18. Memory maximum usage
  19. Memory private working set
  20. Memory usage
  21. Networks bytes received per second
  22. Networks bytes sent per second
  23. Networks errors received per second
  24. Networks errors sent per second
  25. Networks incoming packets dropped per second
  26. Networks outgoing packets dropped per second
  27. Networks packets received per second
  28. Networks packets sent per second
  29. Online CPUs
  30. OOMKilled
  31. Paused
  32. Pid
  33. Restart count
  34. Restarting
  35. Running
  36. Started at
  37. Status
  38. Throttled periods
  39. Throttled time
  40. Throttling periods

В віджеті я застосую CPU percent usage та загальні дані по контейнерам.

Віджети

Для візуалізації зібраних метрик я буду використовувати віджети, які дозволяють зручно відображати актуальний стан системи на дашборді.

Зокрема, віджет створюватиметься на основі Top Items, а не Top Hosts, оскільки взаємодія хоста з Docker-контейнерами в Zabbix реалізується через окремі item’и (метрики контейнерів), а не через самі хости, що дає змогу точніше та наочніше показати навантаження і стан контейнерів.

Кількість та статус контейнерів

Цей віджет призначений для наочного відображення кількості Docker-контейнерів та їх поточного стану. Він показує загальну кількість контейнерів, а також окремо кількість запущених і зупинених, що дозволяє швидко оцінити стан контейнерного середовища без переходу до детальних метрик.

В налаштуваннях віджета необхідно заповнити наступні поля:

  • Type – Top Items
  • Name – Containers
  • Layout – Vertical
  • Items – Containers running, Containers stopped, Containers total

Візуально це буде виглядати так

Використання процесора

Цей віджет використовується для моніторингу використання процесора окремими Docker-контейнерами на хості RPI. На основі типу Top Items він відображає список усіх контейнерів, де символ * у назві айтема означає автоматичне включення кожного контейнера з метрикою CPU percent usage.

Для кращої візуалізації в налаштуваннях Update column застосовується шаблон айтемів Container *: CPU percent usage, зелений базовий колір і режим відображення Indicators з діапазоном від 0 до 100 %. Додатково налаштовані порогові значення (50, 80, 90), які змінюють колір індикатора на жовтий, помаранчевий та червоний відповідно, що дозволяє швидко виявляти контейнери з підвищеним навантаженням.

В налаштуваннях віджета необхідно заповнити наступні поля:

  • Type – Top Items
  • Name – Containers CPU usage
  • Hosts – RPI
  • Layout – Vertical
  • Items – Container *: CPU percent usage

Додатково треба налаштувати відображення Items у вікні Update column:

  • Item patterns – Container *: CPU percent usage
  • Base colour – зелений
  • Display – Indicators
  • Min / Max – від 0 до 100
  • Thresholds – виьбрати значення за бажанням, я вибрав 50, 80, 90 та визначив кольори як жовтий, померанчевий червоний відповідно.

Таким чином віджет буде виглядати доволі привабливо, майже як TOP Hosts, за винятком того, що в цьому віджеті може бути використана лише одна колонка.

В цьому віджеті відображено перші 10 контейнерів. Кількість також можна змінити в налаштуваннях, наприклад показувати 5 найбільш завантажених докер контейнерів за ресурсом процесора.

Висновки

Підбиваючи підсумки, я можу сказати, що Zabbix зарекомендував себе як потужний, хоча й подекуди складний інструмент для моніторингу Docker-середовища. Його головна перевага полягає у неймовірній глибині аналізу: маючи доступ до 40 різних метрик на кожен контейнер, я перестав гадати, чому “гальмує” база даних чи веб-сервер. Можливість бачити специфічні показники, як-от Throttling процесора чи деталізовані помилки мережі, дає той рівень контролю, який не здатна забезпечити жодна стандартна утиліта. Особливо цінною для мене стала функція автоматичного виявлення (Discovery) – тепер кожен новий сервіс, який я піднімаю на Raspberry Pi, миттєво з’являється на дашборді без жодних ручних налаштувань.

Проте варто бути відвертим і щодо певних нюансів. Zabbix – це професійний “комбайн” із доволі високим порогом входу. На відміну від простіших рішень, тут не вийде налаштувати все за два кліки; доводиться вникати в логіку регулярних виразів, розбиратися з макросами та тегами, щоб змусити дашборд виглядати саме так, як ти хочеш. Також слід враховувати, що такий потужний функціонал потребує ресурсів: на старіших моделях Raspberry Pi робота сервера з базою даних могла б бути відчутною, хоча моя Raspberry Pi 5 справляється з цим навантаженням абсолютно спокійно.

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