感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:[email protected]
PS:最近没有登录博客,很多朋友的留言没有看见,这里道歉!还有就是本人较少上QQ,可以邮件交流。
ceilometer报警器状态评估方式之联合报警器状态评估的具体实现
ceilometer报警系统中实现了两种报警器状态评估方式,即联合报警器状态评估和单一报警器状态评估,这篇博客将会解析联合报警器状态评估的具体实现,即/ceilometer/alarm/evaluator/combination.py中类CombinationEvaluator所实现的内容。在这个类所实现的若干方法中,所有方法都被方法evaluate所调用,最终实现联合报警器状态的评估操作,我们来看看这个类所有重要方法的实现。
1 def _get_alarm_state(self, alarm_id)
def _get_alarm_state(self, alarm_id): """ 通过客户端获取指定ID的报警器的状态; """ try: alarm = self._client.alarms.get(alarm_id) except Exception: LOG.exception(_('alarm retrieval failed')) return None return alarm.state方法小结:
这个方法实现通过客户端获取指定ID的报警器的状态;
2 def _sufficient_states(self, alarm, states)
def _sufficient_states(self, alarm, states): """ 确认指定联合报警器有足够多的数据用于评估操作; 1.获取联合报警器中,所有状态为'insufficient data'的报警器列表; 2.如果存在部分报警器的数据状态是'insufficient data',则令sufficient = 0; 如果所有报警器的数据状态都不是'insufficient data',则令sufficient = 1; 3.如果有部分报警器的数据状态是'insufficient data', 并且联合报警器的数据状态不是'insufficient data', 则设置联合报警器的数据状态为'insufficient data'; 4.返回sufficient值,表示联合报警器中所有报警器是否有足够的数据用于报警评估操作; 如果sufficient = 1,表示联合报警器中所有报警器有足够的数据用于报警评估; 如果sufficient = 0,表示联合报警器中部分报警器不满足报警评估的数据条件; """ """ alarms_missing_states:表示所有数据状态为'insufficient data'的报警器列表; """ alarms_missing_states = [alarm_id for alarm_id, state in states if not state or state == evaluator.UNKNOWN] """ sufficient = 0:说明存在部分报警器的数据状态是'insufficient data'; sufficient = 1:说明所有报警器的数据状态都不是'insufficient data'; """ sufficient = len(alarms_missing_states) == 0 """ 如果有部分报警器的数据状态是'insufficient data', 并且联合报警器的数据状态不是'insufficient data', 则设置联合报警器的数据状态为'insufficient data'; """ if not sufficient and alarm.state != evaluator.UNKNOWN: reason = _('Alarms %(alarm_ids)s' ' are in unknown state') % \ {'alarm_ids': ",".join(alarms_missing_states)} reason_data = self._reason_data(alarms_missing_states) """ 刷新报警器的状态为指定的状态; 设置联合报警器alarm的状态为UNKNOWN(UNKNOWN = 'insufficient data'); """ self._refresh(alarm, evaluator.UNKNOWN, reason, reason_data) """ 如果返回值为1,说明所有报警器的数据状态都不是'insufficient data'; 如果返回值为0,说明存在部分报警器的数据状态是'insufficient data', (此时已经设置联合报警器的数据状态为'insufficient data'); """ return sufficient
方法小结:
确认指定联合报警器有足够多的数据用于评估操作;
1.获取联合报警器中,所有状态为'insufficient data'的报警器列表;
2.如果存在部分报警器的数据状态是'insufficient data',则令sufficient = 0;
如果所有报警器的数据状态都不是'insufficient data',则令sufficient = 1;
3.如果有部分报警器的数据状态是'insufficient data',
并且联合报警器的数据状态不是'insufficient data',
则设置联合报警器的数据状态为'insufficient data';
4.返回sufficient值,表示联合报警器中所有报警器是否有足够的数据用于报警评估操作;
如果sufficient = 1,表示联合报警器中所有报警器有足够的数据用于报警评估;
如果sufficient = 0,表示联合报警器中部分报警器不满足报警评估的数据条件;
3 def _transition(self, alarm, underlying_states)
def _transition(self, alarm, underlying_states): """ 此方法实现对联合报警器进行报警评估操作,并刷新报警器的状态为ALARM或OK; 只有当所有报警器的状态都不是'insufficient data'的时候,会调用此方法; """ op = alarm.rule['operator'] """ COMPARATORS = {'and': all, 'or': any} 这里提供了两种报警器评估方法: 第一种是当所有报警器的报警状态均为alarm时,联合报警器的状态为alarm; 第二种是只要有任何报警器的报警状态为alarm,联合报警器的状态为alarm; 所以这里根据系统选择的报警器评估方法op,实现评估联合报警器的报警状态; 报警器的报警状态也只有两个alarm和ok; """ if COMPARATORS[op](s == evaluator.ALARM for __, s in underlying_states): state = evaluator.ALARM else: state = evaluator.OK """ 更新联合报警器的报警状态为上面评估的结果; """ continuous = alarm.repeat_actions reason, reason_data = self._reason(alarm, state, underlying_states) if alarm.state != state or continuous: self._refresh(alarm, state, reason, reason_data)
方法小结:
1.系统提供了两种报警器评估方法:
COMPARATORS = {'and': all, 'or': any}
第一种是当所有报警器的报警状态均为alarm时,联合报警器的状态为alarm;
第二种是只要有任何报警器的报警状态为alarm,联合报警器的状态为alarm;
所以如果想要制定合适的联合报警器评估方法,可以对这里进行改写;
2.系统设定的报警器的报警状态有两个:alarm和ok;
4 def evaluate(self, alarm)
这个方法最终实现联合报警器状态的评估操作,上面的方法实际上都被这个方法所调用,为联合报警器的评估实现了若干操作;
def evaluate(self, alarm): """ 根据所有报警器的数据状态,对联合报警器的报警状态进行评估操作; 1.通过客户端获取联合报警器中所有报警器的数据状态; 2.确认指定联合报警器有足够多的数据用于评估操作; 3.如果联合报警器有足够多的数据用于评估操作,则实现对联合报警器进行报警评估操 作,并刷新报警器的状态为ALARM或OK; """ 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 """ 通过客户端获取联合报警器中所有报警器的数据状态; """ states = zip(alarm.rule['alarm_ids'], itertools.imap(self._get_alarm_state, alarm.rule['alarm_ids'])) """ 确认指定联合报警器有足够多的数据用于评估操作; 如果返回值为1,表示联合报警器中所有报警器有足够的数据用于报警评估; 如果返回值为0,表示联合报警器中部分报警器不满足报警评估的数据条件; 当返回值为1,即联合报警器中所有报警器有足够的数据用于报警评估时, 实现对联合报警器进行报警评估操作,并刷新报警器的状态为ALARM或OK; """ if self._sufficient_states(alarm, states): # 只有当所有报警器的状态都不是'insufficient data'的时候,会调用此方法; # 此方法实现转换报警器的状态为ALARM或OK; self._transition(alarm, states)方法小结: