Мониторинг Docker контейнеров в Zabbix

Мониторить хочу количество контейнеров в состоянии Running/Crashed/Available. Для нескольких особо важных контейнеров нужно иметь возможность мониторить их статус по имени.
Что до количества, взял готовое решение вот тут. Добавил в Zabbix вот так:
Размещаем в /etc/zabbix/scripts такой вот скриптец под именем docker_status.sh:

#!/bin/bash
 
function countContainers() {
    docker ps -q $1 | wc -l
}
 
function countCrashedContainers() {
    docker ps -a | grep -v -F 'Exited (0)' | grep -c -F 'Exited ('
}
 
TYPE=${1-all}
 
case $TYPE in
    running) COUNT_FUNCTION="countContainers"; shift;;
    crashed) COUNT_FUNCTION="countCrashedContainers"; shift;;
    all) COUNT_FUNCTION="countContainers -a"; shift;;
esac
 
$COUNT_FUNCTION

В конфиг агента добавляем новый UserParameter:

...
UserParameter=docker.status[*],/etc/zabbix/scripts/docker_status.sh "$1"
...

Также необходимо добавить пользователя zabbix в группу docker:

sudo gpasswd --add zabbix docker

Ну и перегрузить zabbix-agent

sudo service zabbix-agent restart

Теперь с zabbix-server-а можно опробовать получение данных:

usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.status[crashed]
0
usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.status[all]
13
usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.status[running]
6
usr@zabbixsrv:~$

Иногда наличие контейнеров в состоянии Crashed еще не показатель критического состояния системы, к примеру, когда «завалился» тестовый контейнер. Поэтому для меня было важно иметь возможность мониторить состояние нескольких конкретных контейнеров по имени. Эту проверку пришлось сооружать самому. Но особо ничего сложного, добавляем в zabbix-agent вот такой параметр:

UserParameter=docker.if.up[*],/usr/bin/docker ps |awk 'BEGIN { FS = "  +"; STATUS = "0"; DOCKER_NAME="$1" }; {if ( $$7 == DOCKER_NAME ) {if ( $$5 ~ "Up" ) STATUS = 1; else next;} else next; }; END''{print STATUS;}'

и перегружаем сервис zabbix-agent

sudo service zabbix-agent restart

Теперь используя ключ docker.if.up[имя_контейнера] мы можем узнать в состоянии «Up» он (вернется «1») или же состояние «не Up» (вернется «0»)
Попробуем спросить с забикс-сервера состояние конкретного контейнера:

usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.if.up[vm3]
1
usr@zabbixsrv:~$ zabbix_get -s 100.10.100.10 -k docker.if.up[dev5]
0
usr@zabbixsrv:~$

Усе … осталось соорудить Template и добавить его к серверам с docker-ом
Вот для примера мой шаблон, в нем имя контейнера задается макросами «{$CONTAINER_NAME1}«, «{$CONTAINER_NAME2}» и тд, присваивайте на каждом хосте свои имена, лишние элементы данных для хоста можно деактивировать. Вцелом шаблон опробован — работает отлично!
Хай щастить!

Enjoy!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?