分布式监控系统开发【day38】:报警策略设计(二)

一、策略和动作多对多的好处坏处

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、反向的关联

  1. triggers和表达式有关联表达式吗?
  2. 反向的,triggers表达式关联的trigger
  3. 正常在在admin应该是triggeradmin里能看到trigger
  4. 没有直接关联的,我想看到反向关联的数据

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',

4、创建触发器列表

5、创建动作列表

 

posted @ 2018-08-31 18:32  活的潇洒80  阅读(952)  评论(0编辑  收藏  举报