一、需求讨论
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)