Skip to end of metadata
Go to start of metadata

文章来源于#宏时数据 zabbix工程师王军

本模块文章来源于宏时数据及合作伙伴 zabbix 运维经验。

如有任何问题,欢迎留言或发送邮件到 ZabbixAdmin@grandage.cn 批评指正。我们期待您的声音。 

第1章     简介

1.1 概述

本文档描述了如何通过SNMPTT,将中兴云桌面以及中兴云桌面存储SnmpTrap告警接入Zabbix,并对产生的告警汉化翻译。通过Zabbix标签功能实现自动关联恢复告警。

1.2 环境描述

组件

版本

描述

SNMPTT

1.4.2

SNMP Trap Translator处理SNMPTRAP

Zabbix

5.0.5

 

net-snmp

5.7.2

提供snmptrapd服务

ZXCLOUD

7.01.01.P878

中心云桌面应用平台

第2章     接入中兴云桌面平台SNMPTRAP

2.1 导入ZTE云桌面平台MIB

创建ZTE mibs目录

# 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

 查看系统snmp模块默认加载配置路径

# net-snmp-config --snmpconfpath

自定义厂商mibs搜索路径

# cat /usr/local/net-snmp/snmp.conf

mibdirs +/usr/share/snmp/mibs/f5

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.con.<vendor>文件。

转换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;

检查相应的MIB是否都成功。

 

# sed  -r -i "s/^(FORMAT)/\1 ZBXTRAP \$aA/g" snmptt.conf.zte

# mv /tmp/snmptt.conf.zte /etc/snmp/

#提示: snmpttconvertmib更多用法请参考:http://www.snmptt.org/docs/temp/snmpttconvertmib.shtml

 2.3 追加新增conf配置

# 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 = <<END

/etc/snmp/snmptt.conf

/etc/snmp/snmptt.conf.zte

END

2.4 重启SNMPTT

# systemctl restart snmptt

 2.5 创建ZET云桌面SNMPTRAP监控模板

#提示:为了能够很快看到效果,创建了“snmptrap[]”不过滤任何关键字监控项,根据实际情况定义相关关键字告警。

2.6 创建ZTE SNMPTRAP监控主机

#提示:主机名称要和snmptt.conf.zte中定义的内置变量$aA保持一致。

 关联模板

2.7 查看最新数据

某些mib转换后可读性依然不高,需要根据snmptrap描述进行汉化,根据转换后的snmptt.conf.zte文件,可以看出此类trap信息,属于心跳trap信息。

2.8 翻译trap

# 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:$1"

SDESC

# systemctl restart snmptt

 

 可以创建一个监控项,用于检测心跳

根据trap描述,心跳trap设置值0代表不发送心跳trap。设置值超过300不生效。如果没有最新数据则代表心跳异常,出发告警。

 2.9 创建触发器

 

2.10      修改SNMPTRAP日志级别

通过snmpttconvertmib工具转换后的trap日志事件,通常都是Normal类型,可以将关注的日志级别调高,例如: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"

 创建触发器

 

 为了防止新的TRAP将之前的TRAP信息冲掉,导致告警被恢复,可以创建模板宏变量{$TRAPCONTROL}=1,并创建恢复触发器

 

当有新的“Normal”事件时,“Critical”事件不会被恢复

 

 

 

第3章     应用案例

3.1 应用案例一:通过外部脚本转码翻译SNMPTRAP信息

3.1.1    应用场景描述:

中兴云桌面snmptrap告警内容是hexstring并通过 “gb2312”进行编码,直接对接到zabbix中可读性很差。

通过SNMPTTEXEC”属性,自定义外部python脚本,将SNMPTRAP信息进行转码翻译后,将消息写入SNMPTrapperFile定义的文件中,提升SNMPTRAP信息可读性。

通过zabbix标签功能实现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配置文件中定义ztedesktopalarmNewztedesktopalarmClear类型事件格式化参数

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 $+*

 

 修改完配置后,需要重启SNMPTT

3、创建告警关联恢复

a、提取事件UUID

对于同一个事件ztedesktopalarmNewztedesktopalarmClear类型内容都有一个相同的alarmuuid,提取事件信息中的alarmuuid作为标签ztedesktopalarmuuid的值。

b、根据触发器标签进行关联恢复

对已产生的SNMPTRAP事件,如果出现恢复事件(事件类型为:ztedesktopalarmClear),则通过触发器标签来进行匹配ztedesktopalarmuuid,实现告警自动关闭。

4、实现效果

中兴云桌面中产生的告警:

Zabbix后台中出现的告警日志信息

Zabbix前端展现的告警信息

中兴云平台告警恢复

Zabbix后台中出现的恢复告警日志信息

Zabbix前端展现的告警恢复信息

3.2 应用案例二:通过外部预处理脚本翻译SNMPTRAP信息

3.2.1    应用场景描述:

1、中兴云分布式存储没有完整的mib文件,只提供了snmptrap事件类型的说明,根据oid描述,创建事件匹配规则。

2、通过PREEXEC转换告警等级。

3、此对象默认产生的SNMPTRAP信息是英文,通过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:<variabletype>:<variable>:<value>" >> $zte_snmptt_log

fi

 

 脚本需要传入两个参数:<alarmobject> <alarmseveritynumber>

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

 脚本需要传入一个参数:<alarmcode>,输出结果为告警码说明。

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

 修改完配置后,需要重启SNMPTT 

6、创建告警关联恢复

a、提取事件UUID

对于同一个事件ztestoragealarmNewztestoragealarmClear类型内容都有一个相同的alarmuuid,提取事件信息中的alarmuuid作为标签ztestoragealarmuuid的值。

b、根据触发器标签进行关联恢复

对已产生的SNMPTRAP事件,如果出现恢复事件(事件类型为:ztedesktopalarmClear),则通过触发器标签来进行匹配ztedesktopalarmuuid,实现告警自动关闭。

 

7、实现效果

中兴云分布式存储模拟磁盘异常

Zabbix后台中出现的告警日志信息

Zabbix前端展现的告警信息

中兴云分布式存储平台模拟磁盘恢复

Zabbix后台中出现的恢复告警日志信息

Zabbix前端展现的告警恢复信息

第4章     附件:

4.1 监控模板

 

4.2 配置文件

4.2.1    snmptrapd配置文件

 

4.2.2    snmptt配置文件

 

4.2.3    外部脚本

  • No labels