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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章