一、策略和动作多对多的好处坏处
1、好处:
相同服务,相同策略的服务可以不用重复写好多次触发器
2、坏处:
1、策略A给小李和小罗发邮件
2、策略B给小胡和小崔发邮件
3、策略A是第三部发邮件
4、策略B是第五步发邮件
二、解决问题与代码实现
1、trigger发生后,如何报警
1、解决了什么问题
1、问题恢复自定义通知
2、触发是触发器决定,报警不报警是报警中心说了算,一个是收集部门,一个是处理部门
3、报警的次数报警升级阈值
4、通知组别
5、脚本名称相当与故障自愈
2、代码实现
class ActionOperation(models.Model): """报警动作列表""" action_type_choices = ((0,'Email'),(1,'weixin'),(3,'Script'),) action_type = models.CharField(u"动作类型",choices=action_type_choices,default='email',max_length=64) step = models.SmallIntegerField(u"第n次告警",default=1,help_text="当trigger触发次数小于这个值时就执行这条记录里报警方式") notifiers= models.ManyToManyField('UserProfile',verbose_name=u"通知对象",blank=True) script_name = models.CharField(max_length=128,blank=True,null=True) _msg_format = '''Host({hostname},{ip}) service({service_name}) has issue,msg:{msg}''' #通知的格式 msg_format = models.TextField(u"消息格式",default=_msg_format) def __str__(self): return self.name
2、报警动作列表
1、解决了什么问题
1、触发和动作是多对一
2、动作列表
3、报警多少次与多少次中间报警
4、报警策略,一个策略包含很多动作
5、策略和动作多对多的好处坏处
2、代码实现
class Action(models.Model): """定义trigger发生后,如何报警""" name = models.CharField(max_length=64,unique=True) triggers = models.ManyToManyField('Trigger',blank=True,help_text=u"想让哪些trigger触发当前报警动作") interval = models.IntegerField(u'告警间隔(s)',default=300) recover_notice = models.BooleanField(u'故障恢复后发送通知消息',default=True) recover_subject = models.CharField(max_length=128,blank=True,null=True) recover_message = models.TextField(blank=True,null=True) enabled = models.BooleanField(default=True) def __str__(self): return self.name
三、和去年写的代码的区别
1、区别内容:
1、之前的triggers关联的是模板
2、之前是多对多,现在是一对多
2、区别的代码:
1、之前的triggers关联的是模板
host_groups = models.ManyToManyField('HostGroup',blank=True) #在template里已经关联了主机和tirgger了,为什么这里还要有 hosts = models.ManyToManyField('Host',blank=True)
2、之前triggers是多对多,现在是一对多
triggers = models.ManyToManyField('Trigger',blank=True,help_text=u"想让哪些trigger触发当前报警动作")
四、后台操作
1、admin注册文件
from django.contrib import admin from django import forms from monitor import models # Register your models here. from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import ReadOnlyPasswordHashField class HostAdmin(admin.ModelAdmin): list_display = ('id','name','ip_addr','status') filter_horizontal = ('host_groups','templates') class TemplateAdmin(admin.ModelAdmin): filter_horizontal = ('services','triggers') class ServiceAdmin(admin.ModelAdmin): filter_horizontal = ('items',) list_display = ('name','interval','plugin_name') #list_select_related = ('items',) class TriggerExpressionInline(admin.TabularInline): model = models.TriggerExpression #exclude = ('memo',) #readonly_fields = ['create_date'] class TriggerAdmin(admin.ModelAdmin): list_display = ('name','severity','enabled') inlines = [TriggerExpressionInline,] #filter_horizontal = ('expressions',) class TriggerExpressionAdmin(admin.ModelAdmin): list_display = ('trigger','service','service_index','specified_index_key','operator_type','data_calc_func','threshold','logic_type') admin.site.register(models.Host,HostAdmin) admin.site.register(models.HostGroup) admin.site.register(models.Template,TemplateAdmin) admin.site.register(models.Service,ServiceAdmin) admin.site.register(models.Trigger,TriggerAdmin) admin.site.register(models.TriggerExpression,TriggerExpressionAdmin) admin.site.register(models.ServiceIndex) admin.site.register(models.Action) admin.site.register(models.ActionOperation) #admin.site.register(models.ActionCondtion,ActionConditionAdmin) admin.site.register(models.Maintenance) admin.site.register(models.UserProfile,UserProfileAdmin) admin.site.register(models.EventLog)
2、后台创建表达式
1、创建截图
2、创建完成
3、表达式列表
3、triggers和表达式有关联表达式吗?
1、反向的关联
- triggers和表达式有关联表达式吗?
- 反向的,triggers表达式关联的trigger
- 正常在在admin应该是triggeradmin里能看到trigger
- 没有直接关联的,我想看到反向关联的数据
2、实现代码如下:
class TriggerExpressionInline(admin.TabularInline): model = models.TriggerExpression #exclude = ('memo',) #readonly_fields = ['create_date'] class TriggerAdmin(admin.ModelAdmin): list_display = ('name','severity','enabled') inlines = [TriggerExpressionInline,] #filter_horizontal = ('expressions',