# Пишем хандлер для Sensu
Difrex (mira, 14) → All – 12:53:28 2016-01-28
Как и обещал, будем разбирать процесс создания хандлера.
В терминологии Sensu хандлер – это тот же плагин, только вызывающийся по определенным событиям.
Рассмотрим ситуацию, когда нам надо запускать хандлер на события OK и CRITICAL. Пример конфигурации:
Проверка запускается раз в 60 секунд.
При наступлении события смены состояния чека ok<->critical выхлоп проверки в формате JSON отправится на STDIN программе mailer.pl.
Как же выглядит выхлоп? А вот так:
Теперь мы можем взять этот JSON и преобразовать его в объект. В python это будет выглядеть примерно так:
Теперь, когда у нас есть с структурированной информацией о проверке, я думаю, понятно, что делать дальше.
Код из нашего продакшена – мылохандлера(немного устаревший код) https://github.com/Difrex/sensu/blob/master/handlers/mailer.pl
Difrex (mira, 14) → All – 12:53:28 2016-01-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