Создание собственного плагина для мониторинга сервиса sheepdog
Постановка задачи
На основе прототипа https://github.com/strofimovsky/collectd-plugin-zfs сделать собственный плагин для контроля параметров кластера РФС sheepdog. Можно применять любой язык программирования, в т.ч. bash shell.
При создании плагина необходимо использовать руководство с официального сайта collectd
Как настроить пользовательский плагин
Вся структура метрик прописана в каталоге: /var/lib/collectd/rrd
- Сначала идет имя хоста: /var/lib/collectd/rrd/dc-stor-01
Поскольку уже были включены штатные плагины – эта папка уже существовала. - Далее идет группа: /var/lib/collectd/rrd/dc-stor-01/sheepdog
В нашем примере была задача собрать метрики по сервису sheepdog, поэтому я назвал папку sheepdog.
Важный момент - создать ее надо вручную!
3. Далее идет собственно название метрики: /var/lib/collectd/rrd/dc-stor-01/sheepdog/vdi_count В моем примере – это количество дисков (volumes) на текущий момент в объектном хранилище sheepdog.Чтобы добавить эту метрику, надо прописать ее прототип в файле Что означает данная запись? Первый параметр – имя метрики (полное имя метрики в gnocchi будет sheepdog@vdi_count).
Затем указано, что это будет значение (value), выраженное в измеряемой величине (GAUGE), и числовой (целочисленный) диапазон показателя будет в интервале от 0 до 65535.
Теперь самое простое (это везде описано) – настройка клиента collectd.
vi /etc/collectd/collectd.conf
...
LoadPlugin exec
...
<Plugin exec>
Exec "ubuntu" "/opt/collectd/libexec/vdi_count.sh"
</Plugin>
...
Plugin exec
написать программу, которая будет вызываться.Она может быть вызвана с параметрами, а в простейшем варианте – без параметров.
ВАЖНО! Нельзя запускать от пользователя “root”.
В данном примере шелл запускается без параметров от имени пользователя “ubuntu”.
Само собой, на этот файл должны быть права на запуск для пользователя ubuntu.
Программа vdi_count
Листинг программы vdi_count.sh
# cat /opt/collectd/libexec/vdi_count.sh
HOSTNAME="${COLLECTD_HOSTNAME:-dc-stor-01}"
INTERVAL="${COLLECTD_INTERVAL:-30}"
while sleep "$INTERVAL"; do
VDI_COUNT=$(/usr/sbin/dog vdi list | wc -l)
echo "PUTVAL $HOSTNAME/sheepdog/vdi_count interval=$INTERVAL N:$VDI_COUNT" | tee -a /var/log/collectd-exec.log
done
В первых двух переменных задается имя хоста (dc-stor-01) и интервал запуска (30 сек.).
Далее идет вычисление параметра и запись его в переменную VDI_COUNT.
Затем идет направление STDOUT командой PUTVAL в файл /var/lib/collectd/rrd/dc-stor-01/sheepdog/vdi_count.rrd по пути, описанному выше.
Кроме того, для отладки, формируется лог-файл.
Добавление метрики в ПУ grafana
Теперь осталось только прикрутить эту метрику в панели управления grafana.
После перехода по ссылке
http://10.0.10.92/d/XIqEzHkmk/sheepdog-vdi-count?panelId=2&fullscreen&edit&orgId=1&tab=metrics
увидим представление нашей метрики.
Все готово.
Предистория
А теперь немного предистории как я пытался завести чужой плагин, не понимая, как это работает.
Установка и контроль collectd-plugin-zfs
Для начала, чтобы понять систему, принял решение установить готовый плагин collectd-plugin-zfs.
Устанавливаю на dc-stor-01.
Создал файл /opt/collectd/libexec/zpiostat.py
Редактируем /etc/collectd/collectd.conf
Снимаю комментарий со строки “#LoadPlugin exec”?, чтобы включить выполнение exec.
Ниже добавляю секцию для запуска тестового плагина.
В качестве параметров задаю имя и группу пользователя, от имени которого запускаю программу, имя программы с полным путем, имя ZFS пула, который хотим мониторить.
count-%s_reqs_sec
kbytes-%s_kb_sec
count-wait_%s_no
count-active_%s_no
latency-wait_%s_time
latency-active_%s_time
percent-wait_%s_pct
percent-disk_%s_busy
Ищем идентификатор сервера dc-stor-01:
gnocchi resource list | grep dc-stor-01 | awk '{ FS="|"; print $2}'
20239591-a270-5937-90db-cb38ac6c6756
На ВМ gnocchi в логе /var/log/gnocchi/gnocchi.log отображается ошибки соединения с базой mysql.
DBConnectionError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') [SQL: u'SELECT 1'] (Background on this error at: http://sqlalche.me/e/e3q8)
2018-03-18 12:28:50,355 [33056] ERROR oslo_db.sqlalchemy.engines: Database connection was found disconnected; reconnecting
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/engines.py", line 73, in _connect_ping_listener
connection.scalar(select([1]))
...
File "/usr/lib/python2.7/dist-packages/pymysql/connections.py", line 1029, in _read_bytes
CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")
DBConnectionError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query') [SQL: u'SELECT 1'] (Background on this error at: http://sqlalche.me/e/e3q8)
В конфигураторе /etc/gnocchi/gnocchi.conf есть запись строки соединения с базой MySQL
Проверил, как идет соединение с базой: Все хорошо.Просмотрел рекомендации по ссылке: http://sqlalche.me/e/e3q8
Ничего похожего.
Возникло предположение, что не на gnocchi не установлен модуль python, отвечающий за соединение с базой MySQL.
Ставлю:
root@gnocchi:/etc/gnocchi# pip install mysql-connector-python
Collecting mysql-connector-python
Downloading mysql_connector_python-8.0.6-cp27-cp27mu-manylinux1_x86_64.whl (8.3MB)
100% |████████████████████████████████| 8.3MB 55kB/s
Installing collected packages: mysql-connector-python
Successfully installed mysql-connector-python-8.0.6
Здесь пишут, что не хватает размера пакета, допустимого на запрос.
Меняем значение max_allowed_packet c 16M на 64M на всех трех серверах кластера galera (controller-{1,2,3}) и перезапускаем демона mysql-server.
Все заработало.