• 分布式监控系统开发【day38】:监控trigger表结构设计(一)


    一、需求讨论

    1、zabbix触发器的模板截图

     1、zabbix2.4.7

    2、zabbix3.0

    2、模板与触发器关联的好处

    好处就是可以批量处理,比如我说我有1000机器都要监控cpu、内存、IO的监控

    3、模板触发器多对多的优缺点

    1、优点:

    可以批量引用,不用重复创建相同的模板,比如我说我有1000机器都要监控cpu、内存、IO的监控创建相同的触发器,

    2、缺点:

    模板1更改触发器的阀值会影响所有的模板

    3、生产不建议使用多对多的关系,这样灵活性就会很差,而且修改模板1会影响别的模板,这样会出现很多坑

    4、表达式的创建考虑的逻辑处理

    二、实现代码

    1、触发器表

    class Trigger(models.Model):
        name = models.CharField(u'触发器名称',max_length=64)
        severity_choices = (
            (1,'Information'),
            (2,'Warning'),
            (3,'Average'),
            (4,'High'),
            (5,'Diaster'),
        )
        #expressions = models.ManyToManyField(TriggerExpression,verbose_name=u"条件表达式")
        severity = models.IntegerField(u'告警级别',choices=severity_choices)
        enabled = models.BooleanField(default=True)
        memo = models.TextField(u"备注",blank=True,null=True)
    
        def __str__(self):
            return "<serice:%s, severity:%s>" %(self.name,self.get_severity_display())

    2、触发器表达式表

    class TriggerExpression(models.Model):
        trigger = models.ForeignKey('Trigger',verbose_name=u"所属触发器")
        service = models.ForeignKey(Service,verbose_name=u"关联服务")
        service_index = models.ForeignKey(ServiceIndex,verbose_name=u"关联服务指标")
        specified_index_key = models.CharField(verbose_name=u"只监控专门指定的指标key",max_length=64,blank=True,null=True)
        operator_type_choices = (('eq','='),('lt','<'),('gt','>'))
        operator_type = models.CharField(u"运算符",choices=operator_type_choices,max_length=32)
        data_calc_type_choices = (
            ('avg','Average'),
            ('max','Max'),
            ('hit','Hit'),
            ('last','Last'),
        )
        data_calc_func= models.CharField(u"数据处理方式",choices=data_calc_type_choices,max_length=64)
        data_calc_args = models.CharField(u"函数传入参数",help_text=u"若是多个参数,则用,号分开,第一个值是时间",max_length=64)
        threshold = models.IntegerField(u"阈值")
        logic_type_choices = (('or','OR'),('and','AND'))
        logic_type = models.CharField(u"与一个条件的逻辑关系",choices=logic_type_choices,max_length=32,blank=True,null=True)
    
        def __str__(self):
            return "%s %s(%s(%s))" %(self.service_index,self.operator_type,self.data_calc_func,self.data_calc_args)
  • 相关阅读:
    spring给容器中注入组件的几种方式
    Linux多进程
    Linux多进程的应用
    Linux进程通信
    Linux信号
    Linux共享内存
    Linux信号量
    Linux多线程
    Linux线程同步
    Linux调用可执行程序
  • 原文地址:https://www.cnblogs.com/luoahong/p/9558352.html
Copyright © 2020-2023  润新知