任務內容:
獲取Zabbix各用戶告警媒介分鍾級統計,形成趨勢圖,便於觀察各用戶在每分鍾收到的告警數量,在后續處理中,可以根據用戶在某時間段內(例如3分鍾內)收到的郵件總數,來判斷是否有告警洪水的現象,以便於我們及時對相關現象做出處理。注釋掉短信告警語句,然后產生一次電話告警事件。
任務分析:
查閱完相關資料之后,沒有辦法直接從zabbix現有的配置中獲取到相關的統計值。就只能從zabbix的數據庫中獲取,畢竟太陽底下無新鮮事,收到的這些告警郵件,也是需要相關底層數據庫支撐着。從數據庫中找到zabbix.alerts表符合我們收集數據的基本要求。

從alerts中,可以知道到收件人(sendto),觸發器時間(Trigger DATE),主題(subject),從這三項數據,經過加工就可以獲取zabbix各用戶在每分鍾收到的告警事件數量。注意:觸發器時間(Trigger DATE),這項數據不是獨立的mysql字段,而是message字段里面的數據。經過分析該message數據的來源模板是在zabbix的動作里面設置的。如下圖
因此:要想正確獲取到相關的時間統計,就必須在動作模板里面包含有標題:{TRIGGER.STATUS},消息內容:{Trigger.DATE}
郵件事件統計腳本內容:
[root@zabbix scripts]# cat userEmailAlertCount.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#此腳本用於從zabbxi數據庫中獲取各個用戶的告警媒介,並統計上一分鍾告警條數為了獲取數據的准確性,只能獲取上一分鍾告警事件的統計值`
#2018.08.31
#jmucai
import time
import datetime
import sys
import MySQLdb
#獲取當前日期
day = time.strftime("%Y.%m.%d", time.localtime())
#獲取當前時間的上一分鍾時間
min = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%H:%M")
#獲取腳本傳入的參數
userAlertType=sys.argv[1]
if "郵件" in userAlertType:
userName = userAlertType.split("郵件")[0]
userEmail = userAlertType.split("郵件")[1]
sqlPattern = "select alertid from alerts where message like" + \
' "%' + day + "%" + min + ':%"' + " and sendto = " + '"' + userEmail + '"' + " and subject like " + '"PROBLEM:%"'
#print sqlPattern
# 打開數據庫連接
db = MySQLdb.connect("localhost", "zabbix", "hskj", "zabbix", charset='utf8' )
# 使用cursor()方法獲取操作游標
cursor = db.cursor()
# 使用execute方法執行SQL語句
userEmailAlertCount = cursor.execute(sqlPattern)
print userEmailAlertCount
# 關閉數據庫連接
db.close()
else:
print "傳入錯誤的告警媒介參數"
zabbix配置參數:
#郵件告警統計
UserParameter=userEmailAlertCount[*],/usr/local/zabbix/scripts/userEmailAlertCount.py $1
以郵件告警為例
名稱:自定義監控項目名稱
鍵值:userEmailAlertCount["名字A郵件zabbix@qq.com"]:這里主要是key值的組成,這里的名字A是我們zabbix用戶管理里面的別名(alias),zabbix@qq.com郵箱是我們在用戶里面定義的郵件告警媒介。”郵件“是作為我們腳本里面的分隔符。
最終圖像展示效果
