Краткое описание системы костылей и подпорок, используемой у нас (в тестовом режиме) для рассылки уведомлений об авариях.
Предлагаю к обсуждению с целью выработки идей по реализации аналогичного функционала штатными средствами.
Создаём нужные шаблоны в Main - Setup - Templates
Например такой:
Name: Ping Failed (Core)
Subject: Потеряна связь с узлом ядра {{alarm.managed_object.name}}
Body: В {{alarm.timestamp}} потеряна связь с улом ядра {{alarm.managed_object.name}}
Или такой:
Name: Alarm Cleared
Subject: Авария на {{alarm.managed_object.name}} устранена
Body: Авария <{{alarm.alarm_class.name}}> закрыта по событию <{{event.event_class.name}}> в {{event.timestamp}}
Создаём группы по интересам в Main - Setup - Notification Groups
Например, группу Admins, в Users добавляем нужных пользователей из NOC-а, в Other опционально - адреса вида телефон@sms.mtslife.ru для рассылки sms
Создаём селектор в Service Activation - Setup - Object Selectors
Например, селектор Core, где выбираем объекты по тегу "Core".
Пишем pyRule в Main - Setup - PyRule для автоматической подписки заинтересованных лиц на аварии.
В данном примере 4 и 5 - id пользователей, которых мы подписываем на уведомления.
##---------------------------------------------------------------------- ## subscribe to alarm ##---------------------------------------------------------------------- ## INTERFACE: IAlarmTrigger ##---------------------------------------------------------------------- ## Copyright (C) 2007-2013 The NOC Project ## See LICENSE for details ##---------------------------------------------------------------------- @pyrule def subscribe_admins_to_alarm(alarm): if not [4,5] in alarm.subscribers: alarm.subscribers += [4,5] alarm.save()
Далее настраиваем тиггеры в Fault Management - Setup - Alarm Triggers
Name: Ping Failed (Core)
Alarm Class RE: Ping Failed$
Time Pattern: Any
Managed Object Selector: Core
Notification Group: Admins
Template: Ping Failed (Core)
pyRule: subscribe_admins_to_alarm
Теперь наверное, самое неправильное: патчим коррелятор. Это нужно для уведомления подписчиков аварии об её закрытии.
diff -r cf00ba8b7614 fm/correlator/daemon.py --- a/fm/correlator/daemon.py Sat Feb 09 00:50:44 2013 +0400 +++ b/fm/correlator/daemon.py Wed Mar 20 09:44:39 2013 +0700 @@ -28,7 +28,8 @@ from noc.main.models import PrefixTable, PrefixTablePrefix from noc.lib.version import get_version from noc.lib.debug import format_frames, get_traceback_frames, error_report - +# my test +from noc.main.models import Notification, Template, UserProfile class Correlator(Daemon): daemon_name = "noc-correlator" @@ -257,6 +258,21 @@ r.u_name, str(e.id), e.event_class.name, str(a.id), a.alarm_class.name)) a.clear_alarm("Cleared by disposition rule '%s'" % r.u_name) + # + # my test patch - notify subscribers + # + tpl = Template.objects.get(name="Alarm Cleared") + for s in a.subscribers: + usr_prof = UserProfile.objects.get(user=s) + for ac in usr_prof.active_contacts: + Notification( + notification_method=ac[0], + notification_params=ac[1], + subject=tpl.render_subject(alarm=a), + body=tpl.render_body(alarm=a,event=e), + link=None + ).save() + # end my test patch def get_delayed_event(self, r, e): """
Как минимум, надо бы этот патч перенести в метод clear_alarm класса ActiveAlarm - тогда будет уведомление не только об авариях, закрытых коррелятором, но и о закрытых пользователем. Но тогда нужно переделывать, т.к. там нет информации о событии, закрывающем аварию.
Вообще, как уже было озвучено в IRC, было бы неплохо привязать шаблоны уведомлений к классам аварий, тогда не придётся городить в корреляторе поиск нужного шаблона. Потом, нужно иметь возможность подписывать на аварии целые группы, а не отдельных пользователей. тогда генерация уведомлений ещё немного упрощается и можно будет без особых проблем распихать вызов Notification по всем остальным изменениям состояния аварии (например, найдена новая причина, изменён приоритет или добавлен комментарий пользователя).
Кстати, если будут проблемы с подпиской, посмотрите - NOC-961Getting issue details... STATUS
P.S. Мой первый блогопост здесь, так что буду рад замечаниям и предложениям.