• 分布式监控系统开发【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、创建动作列表

  • 相关阅读:
    zkRollup原理(转载)
    2012元旦遭遇坑爹的12306订票网站付了款不出票
    VM.xPort.ExcelClient XXX备忘
    Parsing html markup text using MSHTML
    Asp.net中模仿Winform的MessageBox
    ReportViewer 2008 打印出现Error loading resource library. (0x8007007E)和(0x80070006)
    使用ADO.net将数据导出到Excel并提供下载
    【备忘】Oracle常用系统表(做代码生成器用得到)
    Worm.Sober.b(“清醒”病毒)
    发布基于T4模板引擎的代码生成器[Kalman Studio]
  • 原文地址:https://www.cnblogs.com/luoahong/p/9564389.html
Copyright © 2020-2023  润新知