Ceilometer项目源码分析----ceilometer报警器状态评估方式之联合报警器状态评估的具体实现

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!

如果转载,请保留作者信息。
博客地址: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)
方法小结:
根据所有报警器的数据状态,对联合报警器的报警状态进行评估操作;
1.通过客户端获取联合报警器中所有报警器的数据状态;
2.确认指定联合报警器有足够多的数据用于评估操作;
3.如果联合报警器有足够多的数据用于评估操作,则实现对联合报警器进行报警评估操作,并刷新报警器的状态为ALARM或OK;

你可能感兴趣的:(源代码,openstack,ceilometer)