zoukankan      html  css  js  c++  java
  • 分布式监控系统开发【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、创建动作列表

  • 相关阅读:
    第八章 多线程编程
    Linked List Cycle II
    Swap Nodes in Pairs
    Container With Most Water
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock II
    Linked List Cycle
    4Sum
    3Sum
    Integer to Roman
  • 原文地址:https://www.cnblogs.com/luoahong/p/9564389.html
Copyright © 2011-2022 走看看