首页 技术与阅读 生活 关于我

OpenStack Ceilometer -- 边界触发型告警器的状态更新和动作触发源码分析

文档

告警器(Alarm)

类Alarm的定义位于../ceilometer/api/controllers/v2/alarms.py:Alarm,Alarm的参数如下所列:

类AlarmThresholdRule的定义位于../ceilometer/api/controllers/v2/alarm_rules/threshold.py:AlarmThresholdRule, AlarmThresholdRule的参数如下所列:

原理框图

Ceilometer Alarm

首先,通过horizon提供的界面设置告警器规则,它会通过ceilometerclient调用相应的API把告警器规则写入数据库。Alarm Evaluator会周期性的检查用户所创建的告警器的状态,当告警器的状态发生变化时,Alarm Evaluator会先通过ceilometerclient调用相应的API更新告警器的规则,然后再通知Alarm Notifier执行该告警器定义的报警动作。Alarm Evaluator包括Alarm Threshold Evaluator、Alarm Combination Evaluator等,其中Alarm Threshold Evaluator的功能主要在../ceilometer/alarm/evaluator/threshold.py的ThresholdEvaluator.evaluate函数中实现,下面开始分析此函数。

ThresholdEvaluator.evaluate函数

ThresholdEvaluator.evaluate函数位于../ceilometer/alarm/evaluator/threshold.py文件中,它首先会判断现在的时间是否在alarm.time_constraints规定的时间段内,然后再利用alarm中的参数构造好形式如:ceilometer statistics -m "meter_name" -q "timestamp<=now;timestamp>=start" -p "period"的查询语句,再调用sufficient函数判断数据是否足够判断告警器的状态,如果数据不足以判断告警器状态,则调用refresh函数来判断是否需要更新数据库以及通知notifier去调用相关动作;如果数据足以判断告警器状态,则会调用transition函数,而transition函数也会调用_refresh函数做相应处理。

Evaluator.within_time_constraint函数

函数self.within_time_constraint的具体实现位于../ceilometer/alarm/evaluator/__init__.py:Evaluator.within_time_constraint,函数within_time_constraint的作用是检查当前时间是否在alarm.time_constraints规定的时间段内,如果当前时间不在alarm.time_constraints所规定的时间段内,就返回False,否则返回True。

ThresholdEvaluator._bound_duration函数

ThresholdEvaluator._bound_duration函数位于../ceilometer/alarm/evaluator/threshold.py文件中,它的主要作用是构造后面形如:ceilometer statistics -m "alarm.meter_name" -q "timestamp>=start;timestamp<=now" -p "AlarmThresholdRule.period"命令中-q部分的查询条件;now就是现在的时间,start则为now-(AlarmThresholdRule.period*AlarmThresholdRule.evaluation_periods+look_back)。

ThresholdEvaluator._statistics函数

ThresholdEvaluator.statistics函数位于../ceilometer/alarm/evaluator/threshold.py文件中,它的主要作用就是调用Evaluator.client.statistics.list函数,并传入三个参数:AlarmThresholdRule.meter_name, 函数ThresholdEvaluator._bound_duration的返回值,AlarmThresholdRule.period。

Evaluator.client.statistics.list函数位于../ceilometerclient/v2/statistics.py:StatisticsManager.list,跟着代码一步一步找就可以找到这;从中我们可以看到这个函数在构造url:('/v2/meters/' + meter_name + '/statistics',q,p),这相当于我们通过python-ceilometerclient执行命令:ceilometer statistics -m "meter_name" -q "" -p "",而-m、-q、-p的参数都传了进来分别为:AlarmThresholdRule.meter_name, 函数ThresholdEvaluator.bound_duration的返回值, AlarmThresholdRule.period。

ThresholdEvaluator._sanitize函数

ThresholdEvaluator.sanitize函数位于:../ceilometer/alarm/evaluator/threshold.py文件中,它主要的作用是根据参数AlarmThresholdRule.exclude_outliers和AlarmThresholdRule.evaluation_periods来精简函数ThresholdEvaluator.statistics的返回值。

ThresholdEvaluator._sufficient函数

Threshold.sufficient函数位于../ceilometer/alarm/evaluator/threshold.py文件中,函数Threshold.statistics的返回值经过函数Threshold.sanitize的精简后得到了值statistics,而函数Threshold.sufficient的作用就是检查值statistics的长度是否大于Threshold.quorum(默认为1),由此来判断alarm的state是否为not sufficient(UNKNOWN在前面被定义为了"not sufficient")。

ThresholdEvaluator._transition函数

ThresholdEvaluator.transition函数位于../ceilometer/alarm/evaluator/threshold.py文件中,函数Threshold.statistics的返回值经过函数Threshold.sanitize的精简后得到了值statistics,而函数ThresholdEvaluator.transition会将statistics与AlarmThresholdRule.threshold按AlarmThresholdRule中规定的方式做比较,根据比较结果设定alarm的状态,再根据当前状态、先前状态以及AlarmThresholdRule.repeat_actions来判断如何调用ThresholdEvaluator.refresh函数。ThresholdEvaluator.transition函数相当绕,还得仔细看下源代码。

Evaluator._refresh函数

Evaluator.refresh函数位于../ceilometer/alarm/evaluator/__init__.py文件中,Evaluator.refresh函数有两个作用,一个是判断alarm的状态是否发生变化,当发生变化时就更改数据库中相应alarm的状态;另一个作用时通知notifier执行相关动作。

最后

还有几个问题:

comments powered by Disqus

技术与阅读

生活

关于我