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