Skip to end of metadata
Go to start of metadata

Краткое описание системы костылей и подпорок, используемой у нас (в тестовом режиме) для рассылки уведомлений об авариях.
Предлагаю к обсуждению с целью выработки идей по реализации аналогичного функционала штатными средствами.

Создаём нужные шаблоны в 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-961 - Getting issue details... STATUS  

P.S. Мой первый блогопост здесь, так что буду рад замечаниям и предложениям.