[#] Пишем хандлер для Sensu
Difrex(mira, 14) — All
2016-01-28 16:53:28


Как и обещал, будем разбирать процесс создания хандлера.

В терминологии Sensu хандлер – это тот же плагин, только вызывающийся по определенным событиям.

Рассмотрим ситуацию, когда нам надо запускать хандлер на события OK и CRITICAL. Пример конфигурации:
{
  "checks": {
    "cpu": {
      "handlers": ["email"],
      "command": "/etc/sensu/plugins/system/check-cpu.rb",
      "interval": 60,
      "subscribers": [
        "base"
      ]
    }
  }
}

Проверка запускается раз в 60 секунд.
{
    "handlers": {
        "email": {
            "type": "pipe",
            "command": "/etc/sensu/handlers/notification/mailer.pl",
                "severities": ["critical", "ok"]
        }
    }
}
При наступлении события смены состояния чека ok<->critical выхлоп проверки в формате JSON отправится на STDIN программе mailer.pl.

Как же выглядит выхлоп? А вот так:
$VAR1 = {
          'check' => {
                       'status' => 2,
                       'handlers' => [
                                       'test'
                                     ],
                       'subscribers' => [
                                          'test'
                                        ],
                       'interval' => 60,
                       'history' => [
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '0',
                                      '2',
                                      '2',
                                      '2',
                                      '2'
                                    ],
                       'issued' => 1442576325,
                       'executed' => 1442576325,
                       'total_state_change' => 5,
                       'duration' => '0.086',
                       'name' => 'test_check',
                       'command' => '/etc/sensu/plugins/files/check-checksums.rb -f /tmp/testfile -h e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
                       'output' => 'Checksum CRITICAL: /tmp/testfile does not match
'
                     },
          'action' => 'create',
          'client' => {
                        'timestamp' => 1442576321,
                        'address' => 'graphite.bingo-boom.ru',
                        'name' => 'graphite.bingo-boom.ru',
                        'version' => '0.20.0',
                        'subscriptions' => [
                                             'hp',
                                             'base',
                                             'uchiwa',
                                             'test',
                                             'dizard_snmp'
                                           ]
                      },
          'id' => '0139b1f9-db4c-4a2b-8124-a2c9b076e40d',
          'occurrences' => 4
        };
Теперь мы можем взять этот JSON и преобразовать его в объект. В python это будет выглядеть примерно так:
import ast
import fileinput

json = ''

for line in fileinput.input():
    json  += line

# Get dictionary from string
def get_dict(json):
        out_dict = ast.literal_eval(json)
    
        return out_dict


check_message_dict = get_dict(json)


Теперь, когда у нас есть с структурированной информацией о проверке, я думаю, понятно, что делать дальше.

Код из нашего продакшена – мылохандлера(немного устаревший код) https://github.com/Difrex/sensu/blob/master/handlers/mailer.pl