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