#  Пишем плагин для Sensu
Difrex (mira, 14) → All  –  09:47:54 2015-10-13

Думал, куда бы перетащить эту статью -- в linux.14 или в python.15. Решил остановиться на питоне.

Итак:

Будем писать на питоне.

Нам потребуется пакет sensu-plugin-python. Ставим его. У меня он опакечен, вам же предстоит это делать самому. Взять его можно на гитхабе: https://github.com/sensu/sensu-plugin-python.git.

*Пишем проверку*


#!/usr/bin/python
# -*- coding: utf-8 -*-

from sensu_plugin import SensuPluginCheck
from os import listdir
from os.path import isfile,join

class CoolCheck(SensuPluginCheck):
def setup(self):
self.parser.add_argument(
'-w',
'--warning',
required=True,
type=int,
help='Integer warning level to output'
)
self.parser.add_argument(
'-c',
'--critical',
required=True,
type=int,
help='Integer critical level to output'
)
self.parser.add_argument(
'-d',
'--directory',
required=True,
type=str,
help='Path to directory'
)


def run(self):
self.check_name('my_cool_check')

dir = self.options.directory

onlyfiles = [ f for f in listdir(dir) if isfile( join(dir, f) ) ]
size = len(onlyfiles)

if size < self.options.warning:
self.ok() # Exit code 0
elif size >= self.options.warning and size < self.options.critical:
self.warning('Files count ' + str(size)) # Exit code 1
elif size >= self.options.critical:
self.critical('Files count ' + str(size)) # Exit code 2
else:
self.unknown('Unknown error')

if __name__ == "__main__":
f = CoolCheck()


SensuPluginCheck уже предоставляет нам парсер командной строки по-этому нет необходимости использовать python-argparse или что-то еще подобное.

Функция *setup()* из класса *CoolCheck()* выполняется первой при запуске программы. В ней мы как раз задаем аргументы, какие будет принимать наша проверка.

В Функции *run()* уже выполняется сама проверка. Мы проверяем количество файлов в указанной директории, сравниваем с пороговыми значениями и выходим с соответствующим кодом выхода и сообщением.

*Метрики*

Адаптируем код проверки под метрику и вынесем код подсчета количества файлов в отдельную функцию.
cool.py:

from os import listdir
from os.path import isfile,join
def files_count(dir):
onlyfiles = [ f for f in listdir(dir) if isfile( join(dir, f) ) ]
size = len(onlyfiles)

return size


И сам плагин метрики.
cool_metric.py:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sensu_plugin import SensuPluginMetricGraphite
from cool import files_count

class CoolMetricGraphite(SensuPluginMetricGraphite):
def setup(self):
self.parser.add_argument(
'-s',
'--schema',
required=True,
type=str,
help='Graphite schema'
)

self.parser.add_argument(
'-d',
'--directory',
required=True,
type=str,
help='Path to directory'
)


def run(self):
size = files_count(self.options.directory)
self.output(self.options.schema, size)
self.ok()


if __name__ == "__main__":
f = CoolMetricGraphite()


Попробуем запустить:

chmod +x cool_metric.py
./cool_metric.py -s `hostname -f`.tmp.files -d /tmp
example.com.tmp.files 2 1442480739


Все отлично! Осталось только опакетить(не забывай только добавлять в зависимость sensu-plugin-python), привезти пакет на нужные хосты и написать конфиг Sensu и повесить графитовый хандлер

{
"checks": {
"cool_metrics": {
"type": "metric",
"handler": "graphite",
"command": "/etc/sensu/plugins/other/cool.py -s \"`hostname -f`.tmp.files\" -d /tmp",
"interval": 60,
"subscribers": [
"cool_hosts"
]
}
}
}


Аналогично делаем для проверки.



Как видно – все очень просто. Если использовать код ниже по тексту, как шаблон, то при написании плагина можно сосредоточиться только на том, что нужно проверять и не думать о том, как распарсить командную строку, какой код выхода использовать, и.т.д.

sensu-plugin-python реально упрощает жизнь.

В следующий раз будем писать хандлер.
Powered by iii-php v0.11