感謝朋友支持本博客,歡迎共同探討交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正!
如果轉載,請保留作者信息。
博客地址: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;