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


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

В следующий раз будем писать хандлер.