第三方平臺告警接入、翻譯、關聯恢復
第三方平臺告警接入、翻譯、關聯恢復
第1章 簡介
1.1 說明
本文檔描述了如何通過SNMPTT,將中興云桌面以及中興云桌面存儲SnmpTrap告警接入Zabbix,并對產生的告警漢化翻譯,通過Zabbix標簽功能實現自動關聯恢復告警。
1.2 環境
第2章 接入中興云桌面平臺SNMPTRAP
2.1 導入ZTE桌面平臺MIB
net-snmp組件默認只提供了通用的MIB文件,第三方私有MIB文件需要自行導入并配置搜索解析。
1. 創建自定義MIB目錄
# mkdir /usr/share/snmp/mibs/ZTE/ # ls -l /usr/share/snmp/mibs/ZTE/ total 60 -rw-r--r-- 1 root root 907 Feb 9 2012 ZTE-IRP-MIB -rw-r--r-- 1 root root 46864 Mar 23 2012 zxcomc-snmp-alarmirp-mib-v1.1.txt -rw-r--r-- 1 root root 2962 Feb 9 2012 zxcomc-snmp-csirp-mib.txt -rw-r--r-- 1 root root 907 Feb 9 2012 zxcomc-snmp-irp-common-mib.txt
2. 配置net-snmp加載自定義mib
#查看系統snmp模塊默認加載配置路徑 # net-snmp-config --snmpconfpath #自定義第三方mib搜索目錄 # cat /usr/local/net-snmp/snmp.conf mibdirs +/usr/share/snmp/mibs/ZTE #測試自定義地示范mib搜索是否正常 # snmptranslate -Dinit_mib .1.3 2>&1 |grep MIBDIR # snmptranslate -On ZTE-ALARM-IRP-MIB::alarmCleared
2.2 轉換MIB文件
MIB(SNMPTRAP)文件中定義了各種SNMPTRAP的通知信息,SNMPTT中可以使用工具snmpttconvertmib將所有包含snmp trap/notification信息的mib文件轉換成相應的snmptt.conf.
轉換mib命令格式:
# snmpttconvertmib --in=path-to-mib --out=output-file-name –net_snmp_perl
提示: 轉換結果會追加到output-file-name定義的文件中
由于snmpttconvertmib不支持批量轉換,可能需要通過腳本來進行批量轉換。
# for f in $(grep -l -i "notification" ./*);do snmpttconvertmib -in="$f" -out=/tmp/snmptt.conf.zte --net_snmp_perl;done;
初始化轉換后的配置文件
# sed -r -i "s/^(FORMAT)/ ZBXTRAP $aA/g" snmptt.conf.zte # grep "FORMAT" snmptt.conf.zte
每個 FORMAT 行都需要添加ZBXTRAP,否則ZABBIX無法解析,
關于SNMPTT更多用法,請參考官方文檔
2.3 追加新增conf配置
將自定義轉換的conf文件追加到SNMPTT配置文件中
# vim /etc/snmp/snmptt.ini [TrapFiles] # A list of snmptt.conf files (this is NOT the snmptrapd.conf file). The COMPLETE path # and filename. Ex: '/etc/snmp/snmptt.conf' snmptt_conf_files = < 2.4 重啟SNMPTT # systemctl restart snmptt 2.5 創建ZTE云桌面SNMPTRAP監控模板 提示:為了能夠很快看到效果,創建了“snmptrap[]”不過濾任何關鍵字的監控項 2.6 創建監控實例 提示:主機名稱要和snmptt.conf.zte中定義的內置變量$aA保持一致 2.7 查看最新數據 至此,就完成了如何通過SNMPTT將第三方平臺的SNMPTRAP信息集成到Zabbix的操作步驟。 在實際環境中,由于某些需求或者通過轉換后的規則,SNMPTRAP信息可讀性依然不高。例如:TRAP信息是全英文或者應用平臺對TRAP信息進行了編碼。 通過SNMPTT規則配置文件的EXEC和PREXEC屬性,可以實現SNMPTRAP信息的漢化翻譯或者解碼(在應用案例中實現)等。根據MIB或轉換后配置文件的描述,可以看出最新數據中的trap信息屬于平臺組件之間的心跳探測信息。 2.8 漢化翻譯SNMPTRAP 1. 編輯配置文件,漢化相關oid信息 # vim /etc/snmp/snmptt.conf.zte EVENT heartbeatNotification .1.3.6.1.4.1.3902.4101.4.2.1.1 "Status Events" Normal FORMAT ZBXTRAP $aA "中興云桌面平臺-NMS系統與北向網管心跳檢查,heartbeatNotification:" SDESC 2. 重啟SNMPTT # systemctl restart snmptt 3. 查看漢化后的信息 4. 創建觸發器 根據trap描述,心跳trap設置值0代表不發送心跳trap。設置值超過300不生效。如果沒有最新數據則代表心跳異常,觸發告警。 5. 觸發SNMPTRAP告警 2.9 修改SNMPTRAP日志級別 1. 通過snmpttconvertmib工具轉換后的trap日志事件,格式如下: EVENT event_name event_OID "category" severity FORMAT format_string [EXEC command_string] [NODES sources_list] [MATCH [MODE=[or | and]] | [$n:[!][( ) | n | n-n | > n] [SDESC] [EDESC] 通過修改severity,可以將需要關注的日志級別調高,例如:Critical,然后通過觸發器函數regexp ()匹配對應嚴重性級別的日志。例如: EVENT heartbeatNotification .1.3.6.1.4.1.3902.4101.4.2.1.1 "Status Events" Critical FORMAT ZBXTRAP $aA "中興云桌面平臺-NMS系統與北向網管心跳檢查,$N:$1" 2. 創建指定事件級別觸發器 3. 按照事件嚴重性觸發告警 至此,完成了通過修改SNMPPT配置規則,來實現SNMPTRAP事件的漢化翻譯和事件級別的調整。 2.10 SNMPTRAP恢復事件關聯 對于周期性的SNMPTRAP信息,例如:平臺組件之間的心跳TRAP。不存在恢復事件,只能通過有無數據來判斷是否正常,實現告警恢復。 對于平臺故障alarmNew信息,例如:磁盤讀寫異常,主機離線等。如果連續出現多條告警,新的TRAP事件就會將上一條TRAP事件信息沖掉,導致上一條告警被恢復。 如何防止事件被恢復或者通過相關恢復事件自動恢復? 1. 防止事件被恢復 如果事件嚴重性較高,或者由于特定需求不允許被恢復。可以通過創建模板或者主機宏變量**{$TRAPCONTORL}=1來實現。 2. 通過恢復事件自動恢復已觸發的告警 平臺故障類事件和恢復事件,通常會在TRAP事件位置變量(例如:$14)中對應有一個相同alarmId。通過在Zabbix標簽功能,提取事件的alarmId來實現事件的關聯恢復。 # vim /etc/snmp/snmptt.conf.zte 14: alarmId Syntax="OCTETSTR" Descr="This object represents an alarm in EMS using the private format of vendor" 15: alarmCodeName Syntax="OCTETSTR" Descr="This object represents an alarm code name" 第3章 應用案例 3.1 應用案例1:通過外部腳本轉碼翻譯SNMPTRAP信息 3.1.1 案例描述 中興云桌面snmptrap告警內容是hexstring格式并通過 “gb2312”進行編碼,直接對接到zabbix中可讀性很差。 通過SNMPTT中”EXEC”屬性,自定義外部python腳本,將SNMPTRAP信息進行轉碼翻譯后,再將翻譯后的消息寫回到SNMPTrapperFile定義的文件中,實現告警事件接入ZABBIX并提升SNMPTRAP信息可讀性。 通過zabbix標簽功能,提取告警信息中的alarmid,實現SNMPTRAP恢復事件關聯恢復操作。 3.1.2 實現步驟 1. 創建解碼腳本 # cat /etc/snmp/zte/translatetraptozbx.py #!/usr/bin/python # -*- coding:utf-8 -*- #version:1.0 #user:jun #description: convert hex-string to string # import sys import time # 定義日志信息 logtime=time.strftime('%H:%M:%S %Y/%m/%d',time.localtime()) snmptrapfile="/var/log/snmptt/snmptt.log" # 將hex轉換成中文,hex to gb2312 def hex_to_ascii(hex_str): try: hex_str = hex_str.replace('Hex-STRING', '').replace(':','').replace(' ', '').replace('0x', '').replace('\t', '').replace('\n', '') ascii_str = hex_str.decode('hex').decode('gb2312',errors='ignore') #except (TypeError): except : ascii_str = 'ZBXTRAP can not translate this message' return ascii_str # 獲取參數:IP [SNMPTRAP OIDS],example:$aA $N $+* if len(sys.argv) >= 4: ZBXTRAPHOST=sys.argv[1] EVENTTYPE=sys.argv[2] SNMPTRAPMESSAGE=''.join(sys.argv[3:]) KEYWORD='enterprises.3902.4101.1.3.1.3' if KEYWORD in SNMPTRAPMESSAGE: alertmessage=SNMPTRAPMESSAGE.replace('enterprises','\nenterprises').split('\n') eventextnumber=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3','').split(':')[0] eventtime=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3'+eventextnumber+':','') eventseverity=alertmessage[9].replace('enterprises.3902.4101.1.3.1.6'+eventextnumber+':','').strip() alarmid=alertmessage[14].strip() # 告警等級轉換 if eventseverity=='1': severity="critical" elif eventseverity=='2': severity="critical" elif eventseverity=='3': severity="major" elif eventseverity=='4': severity="major" elif eventseverity=='5': severity="warning" elif eventseverity=='6': severity="cleared" else: severity="unknown" eventtheme=hex_to_ascii(alertmessage[15].replace('enterprises.3902.4101.1.3.1.14'+eventextnumber+':','').replace(' ','')) eventsource=hex_to_ascii(alertmessage[16].replace('enterprises.3902.4101.1.3.1.15'+eventextnumber+':','').replace(' ','')) zbxtrapmessage=logtime+" ZBXTRAP "+ZBXTRAPHOST+" "+eventtime+"-"+ZBXTRAPHOST+" "+EVENTTYPE+",alarmuuid:"+alarmid+",severity:"+severity+" "+eventtheme+" "+eventsource zbxtrapmessage2=zbxtrapmessage.encode("raw_unicode_escape").decode("raw_unicode_escape").encode("utf8") with open(snmptrapfile,'a+') as f: f.write(zbxtrapmessage2) f.write("\n") f.close() print zbxtrapmessage2 else: sys.exit() 2. 定義SNMPTRAP事件類型的格式化參數 在snmptt.conf.zte配置文件中修改ztedesktopalarmNew和ztedesktopalarmClear類型事件格式化參數 # vim /etc/snmp/snmptt.conf.zte EVENT ztedesktopalarmNew .1.3.6.1.4.1.3902.4101.1.4.1.1 "Status Events" Normal FORMAT $aA $N "【中興云桌面告警】$+*" REGEX(\n)()g REGEX(\(unknown\))()g REGEX(\s+)(-)g # EXEC /etc/snmp/zte/translatetraptozbx.py $aA $N $+* EVENT ztedesktopalarmCleared .1.3.6.1.4.1.3902.4101.1.4.1.2 "Status Events" Normal FORMAT $aA $N "【中興云桌面告警】$+*" REGEX(\n)()g REGEX(\(unknown\))()g REGEX(\s+)(-)g # EXEC /etc/snmp/zte/translatetraptozbx.py $aA $N $+* 3. 重啟SNMPTT # systemctl restart snmptt 4. 提取TRAP事件的alarmId 云桌面的SNMPTRAP信息經過了轉碼腳本處理,對于同一個事件ztedesktopalarmNew(告警事件)和ztedesktopalarmClear(恢復事件)類型內容,都有一個相同的alarmuuid,提取事件信息中的alarmuuid作為標簽ztedesktopalarmuuid的值。 5. 根據觸發器標簽進行事件關聯恢復 對已產生的SNMPTRAP事件,如果出現恢復事件(事件類型為:ztedesktopalarmClear),則通過觸發器標簽來進行匹配ztedesktopalarmuuid,實現告警自動關閉。 6.實現效果 3.2 應用案例2:通過預處理翻譯SNMPTRAP信息 3.2.1 案例描述 中興云分布式存儲沒有完整的mib文件,只提供了snmptrap事件類型的說明,根據oid描述,創建事件匹配規則。 通過SNMPTT配置規則文件中的PREEXEC屬性,將事件等級(數字)轉換成英文字符,將事件告警碼轉換成對應的中文描述。 3.2.2 實現步驟 1. 創建事件等級映射文件 # cat /etc/snmp/zte/variablemvaluemap_zte.txt #alarmPerceivedSeverity ztestoragealarmSeverity-1:critical ztestoragealarmSeverity-2:serious ztestoragealarmSeverity-3:warning ztestoragealarmSeverity-4:prompt ztestoragealarmSeverity-5:notice 2. 創建事件等級轉換腳本 # cat /etc/snmp/zte/getvariablestring.sh #!/bin/bash LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") zte_variables_file='/etc/snmp/zte/variablemvaluemap_zte.txt' zte_snmptt_log='/etc/snmp/zte/snmptt_preexec_zte.log' if [ $# -ne 2 ];then exit 2 fi if [ -s $zte_variables ];then value=$(grep -w "$1-$2" "$zte_variables_file"|grep -v "#"|awk -F':' '{print $2}') if [ 'Z'"$value" != 'Z' ];then echo $value else echo "unknown" fi else echo "$LOGTIME zte variable map file is not found.File Format: 3. 創建告警碼說明映射文件 # cat /etc/snmp/zte/ztestorage_alarmcode.txt 100100#服務器網絡網絡異常#Critical 100101#服務器網絡網絡斷鏈#Critical 100102#服務器狀態下電#Critical 100103#服務器狀態所有存儲服務離線#Critical 100104#服務器狀態處于維護模式#Info 100105#服務器版本版本與集群版本不一致#Warning 100106#服務器CPU 利用率超過 80%#Warning 100107#服務器CPU 利用率超過 90%#Critical 100108#服務器內存利用率超過 80%#Warning 100109#服務器內存利用率超過 90%#Critical 100110#服務器網絡帶寬利用率超過 80%#Warning 100111#服務器網絡帶寬利用率超過 90%#Critical 100114#硬盤狀態離線#Critical 100115#硬盤狀態處于維護模式#Info 100116#硬盤狀態IO 讀寫慢#Warning 100118#硬盤狀態SMART 檢測Critical異常#Critical 100119#硬盤已用容量超過 50%#Warning 100120#硬盤已用容量超過 80%#Critical 100121#服務MON節點時鐘未同步#Critical 100122#服務MON磁盤可用空間不足#Critical 100123#服務MON服務離線#Critical 100129#服務MGR服務離線#Critical 100130#服務AGENT服務離線#Critical 100131#集群狀態IO 請求異常#Critical 100132#集群狀態集群與管理系統連接中斷#Critical 100133#集群狀態處于維護模式#Info 100136#集群已用容量超過 50%#Warning 100137#集群已用容量超過 80%#Critical 100138#存儲池狀態存儲池不可用#Critical 100139#存儲池狀態存儲池數據冗余度降級#Critical 100140#存儲池狀態存儲池數據重構中#Warning 100141#存儲池已用容量超過 50%#Warning 100142#存儲池已用容量超過 80%#Critical 100143#共享設備已用容量超過 50%#Warning 100144#共享設備已用容量超過 80%#Critical 100145#共享設備狀態共享設備狀態異常#Critical 100146#License有效期不足 30 天#Warning 100147#License有效期不足 7 天#Critical 100148#證書有效期不足 30 天#Warning 100149#證書有效期不足 7 天#Critical 100150#服務器狀態主機名不一致#Critical 100151#服務器狀態主機名含有非法字符#Critical 100152#服務器狀態集群中主機名重復#Critical 4. 創建告警碼轉換腳本 # cat /etc/snmp/zte/ztestorage_transalarmcode.sh #!/bin/bash LOGTIME=$(date "+%Y-%m-%d %H:%M:%S") ztestorage_alarmcode='/etc/snmp/zte/ztestorage_alarmcode.txt' ztestorage_alarmcode_log='/etc/snmp/zte/ztestorage_alarmcode.log' if [ $# -ne 1 ];then exit 2 fi if [ -s $ztestorage_alarmcode ];then value=$(grep -w "$1" "$ztestorage_alarmcode"|grep -v "^#"|awk -F'#' '{print $2}') if [ 'Z'"$value" != 'Z' ];then echo $value else echo "$LOGTIME zte storage alarm code is not found." >> $ztestorage_alarmcode_log fi else echo "$LOGTIME zte storage alarm code file is not found." >> $ztestorage_alarmcode_log fi #腳本需要傳入一個參數: 5. 定義云存儲SNMPTRAP事件類型的解析參數 # cat /etc/snmp/snmptt.conf.zte # 新增中興云桌面分布式存儲trap信息 EVENT ztestoragealarmNew .1.3.6.1.4.1.3902.2904.1.2.1.4.1.1 "Status Events" Normal FORMAT ZBXTRAP $ar $N "alarmuuid:$+4,severity:$p1($9),$12 $p2" PREEXEC /etc/snmp/zte/getvariablestring.sh ztestoragealarmSeverity $9 PREEXEC /etc/snmp/zte/ztestorage_transalarmcode.sh $13 ## SDESC .1.3.6.1.4.1.3902.2904.1.2.1.4.1.1 表示 新的告警產生 .1.3.6.1.4.1.3902.2904.1.2.1.4.1.2 表示 相應告警恢復 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.6: 告警級別,分5個等級('critical': 1,'serious': 2,'warning': 3,'prompt': 4,'notice': 5) .1.3.6.1.4.1.3902.2904.1.2.1.3.1.8: 告警內容 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.10: 告警位置 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.11: 告警碼 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.15: 告警主機hostname EDESC EVENT ztestoragealarmClear .1.3.6.1.4.1.3902.2904.1.2.1.4.1.2 "Status Events" Normal FORMAT ZBXTRAP $ar $N "alarmuuid:$+4,severity:$p1($9),$12 $p2" ## PREEXEC /etc/snmp/zte/getvariablestring.sh ztestoragealarmSeverity $9 PREEXEC /etc/snmp/zte/ztestorage_transalarmcode.sh $13 SDESC .1.3.6.1.4.1.3902.2904.1.2.1.4.1.1 表示 新的告警產生 .1.3.6.1.4.1.3902.2904.1.2.1.4.1.2 表示 相應告警恢復 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.6: 告警級別,分5個等級('critical': 1,'serious': 2,'warning': 3,'prompt': 4,'notice': 5) .1.3.6.1.4.1.3902.2904.1.2.1.3.1.8: 告警內容 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.10: 告警位置 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.11: 告警碼 .1.3.6.1.4.1.3902.2904.1.2.1.3.1.15: 告警主機hostname EDESC 6. 重啟SNMPTT # systemctl restart snmptt 7. 提取TRAP事件信息的alarmId 云存儲的SNMPTRAP信息經過了預處理后寫入snmptt日志,對于同一個事件ztestoragealarmNew(告警事件)和ztestoragealarmClear(恢復事件)類型內容都有一個相同的alarmuuid,提取事件信息中的alarmuuid作為標簽ztestoragealarmuuid的值。 8. 根據觸發器標簽進行事件關聯恢復 對已產生的SNMPTRAP事件,如果出現恢復事件(事件類型為:ztestoragealarmClear),則通過觸發器標簽來進行匹配ztestoragealarmuuid,實現告警自動關閉。 9. 實現效果
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。