本文目录如下:
1 引言
2 复合告警解析规则
3 总结
1 引言
aodh是从ceilometer拆分出来的告警组件。之前已经分析过,这个组件主要的服务在于
aodh-evaluator服务: 每隔一定时间进行告警是否触发的验证,如果触发,就发送告警信息给aodh-notifier服务
aodh-notifier服务: 进行告警通知的触发。例如: webhook,日志等告警通知器。
之前分析过,aodh-evaluator服务与aodh-notifier服务之间的通信是借助于消息队列(即rabbitmq)来完成。
2 复合告警规则解析
aodh这个组件在openstack各个组件中算是一个比较简单的组件,看最近社区似乎在这个组件上几乎没有太多重要的更新了。
这个组件本身无非是进行告警的校验,告警的通知这两个主要功能。但是这个组件除了其服务的分工框架上可以学到一些以后
自研告警项目对于框架的整体划分外。
我认为这个组件最核心的一个功能就是复合告警规则解析,这个功能完全是可以应用到以后
类似的很多基于规则解析的项目中。
下面是针对这部分内容的源码分析。
2.1 总入口
如果是复合告警规则类型的告警,则进入
源码:
aodh/evaluator/composite.py的CompositeEvaluator类的evaluate方法
该方法具体如下:
def evaluate(self, alarm):
if not self.within_time_constraint(alarm):
LOG.debug('Attempted to evaluate alarm %s, but it is not '
'within its time constraint.', alarm.alarm_id)
return
LOG.debug("Evaluating composite rule alarm %s ...", alarm.alarm_id)
self.rule_targets = []
self.rule_num = 0
rule_target_alarm, rule_target_ok = self._parse_composite_rule(
alarm.rule)
sufficient = self._evaluate_sufficient(alarm, rule_target_alarm,
rule_target_ok)
if not sufficient:
for rule in self.rule_targets:
rule.evaluate()
sufficient = self._evaluate_sufficient(alarm, rule_target_alarm,
rule_target_ok)
if not sufficient:
# The following unknown situations is like these:
# 1. 'unknown' and 'alarm'
# 2. 'unknown' or 'ok'
reason, reason_data = self._reason(alarm, evaluator.UNKNOWN,
rule_target_alarm)
if alarm.state != evaluator.UNKNOWN:
self._refresh(alarm, evaluator.UNKNOWN, reason, reason_data)
else:
LOG.debug(reason)
分析:
1) 上述方法中最重要的内容如下:
rule_target_alarm, rule_target_ok = self._parse_composite_rule(
alarm.rule)
这个方法就是对复合告警规则解析
2) evaluate: 总入口方法,
步骤1: 先解析复合规则
步骤2: 对解析的复合规则调用bool方法
步骤3: 得到校验结果后,进行后续处理
2.2 复合告警规则解析方法分析
该方法是aodh/evaluator/composite.py的CompositeEvaluator类的
_parse_composite_rule方法,
方法定义如下:
def _parse_composite_rule(self, alarm_rule):
"""Parse the composite rule.
The composite rule is assembled by sub threshold rules with 'and',
'or', the form can be nested. e.g. the form of composite rule can be
like this:
{
"and": [threshold_rule0, threshold_rule1,