Как и обещал, будем разбирать процесс создания хандлера.
В терминологии 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