Создание собственного плагина для мониторинга сервиса sheepdog

Постановка задачи

На основе прототипа https://github.com/strofimovsky/collectd-plugin-zfs сделать собственный плагин для контроля параметров кластера РФС sheepdog. Можно применять любой язык программирования, в т.ч. bash shell.

При создании плагина необходимо использовать руководство с официального сайта collectd

Как настроить пользовательский плагин

Вся структура метрик прописана в каталоге: /var/lib/collectd/rrd

  1. Сначала идет имя хоста: /var/lib/collectd/rrd/dc-stor-01
    Поскольку уже были включены штатные плагины – эта папка уже существовала.
  2. Далее идет группа: /var/lib/collectd/rrd/dc-stor-01/sheepdog
    В нашем примере была задача собрать метрики по сервису sheepdog, поэтому я назвал папку sheepdog.

Важный момент - создать ее надо вручную!

mkdir /var/lib/collectd/rrd/dc-stor-01/sheepdog
3. Далее идет собственно название метрики: /var/lib/collectd/rrd/dc-stor-01/sheepdog/vdi_count В моем примере – это количество дисков (volumes) на текущий момент в объектном хранилище sheepdog.
Чтобы добавить эту метрику, надо прописать ее прототип в файле

/usr/share/collectd/types.db.
# sil@omega custom types from 180322
vdi_count               value:GAUGE:0:65535
Что означает данная запись? Первый параметр – имя метрики (полное имя метрики в 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>
...
Собственно, все сводится к тому, чтобы разрешить запуск плагина exec (снять комментарий с соответствующей строки), а затем в секции 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 увидим представление нашей метрики.

grafana_sheep.jpg

Все готово.

Предистория

А теперь немного предистории как я пытался завести чужой плагин, не понимая, как это работает.

Установка и контроль collectd-plugin-zfs

Для начала, чтобы понять систему, принял решение установить готовый плагин collectd-plugin-zfs.
Устанавливаю на dc-stor-01.
Создал файл /opt/collectd/libexec/zpiostat.py
Редактируем /etc/collectd/collectd.conf
Снимаю комментарий со строки “#LoadPlugin exec”?, чтобы включить выполнение exec.
Ниже добавляю секцию для запуска тестового плагина.
В качестве параметров задаю имя и группу пользователя, от имени которого запускаю программу, имя программы с полным путем, имя ZFS пула, который хотим мониторить.

<Plugin exec>
        Exec "sil:sil" "/opt/collectd/libexec/zpiostat.py" "tank"
</Plugin>
Перезапускаем демона collectd.
service collectd restart
Смотрим, какие параметры должен возвращать скрипт.
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
Заходим на ВМ gnocchi и смотрим, есть ли такие метрики на первом хранилище.
Ищем идентификатор сервера dc-stor-01:

gnocchi resource list | grep dc-stor-01 | awk '{ FS="|"; print $2}' 
20239591-a270-5937-90db-cb38ac6c6756
Смотрим, выдает-ли collectd одну из вышеперечисленных метрик.
gnocchi metric list | grep 20239591-a270-5937-90db-cb38ac6c6756 | grep "latency-active"
Выдает пустое значение. Будем разбираться – почему.

На ВМ 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

url = mysql+pymysql://gnocchi:yoo9iY7o@10.0.10.20/gnocchi
Проверил, как идет соединение с базой:
sudo apt install mysql-client –y
mysql -u gnocchi -h 10.0.10.20 –p'yoo9iY7o'
Все хорошо.

Просмотрел рекомендации по ссылке: 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
Все равно collectd выдает ошибку: Lost connection to MySQL server during query Нашел решение на stackoverflow

Здесь пишут, что не хватает размера пакета, допустимого на запрос.
Меняем значение max_allowed_packet c 16M на 64M на всех трех серверах кластера galera (controller-{1,2,3}) и перезапускаем демона mysql-server.

Все заработало.