Думал, куда бы перетащить эту статью -- в 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 реально упрощает жизнь.
В следующий раз будем писать хандлер.