如何自定义 nagios 监控

nagios 是一款十分强大的监控工具,除了自带的丰富的监控脚本外,还支持建立自定义监控内容。前两篇文章中我们已经详细介绍了 nagios + pnp4nagios 的安装以及对相关配置进行了分析(详见《nagios + pnp4nagios 安装笔记》《nagios 配置详解》),现在我们来说说如何自定义 nagios 监控,以及 pnp4nagios 绘图格式一些常见错误的解决方法。

监控脚本自定义

所谓的自定义监控,其实就是自定义脚本,然后在客户端的 nrpe.cfg 里定义 command ,然后服务端 check_nrpe 的时候,直接调用脚本,返回相应信息,让服务端判断此监控的服务是否正常。调用自定义脚本和调用官方脚本的方式相同,具体配置可以参考《nagios配置详解》,这里就不再累述,下面我们来详细说说自定义监控脚本的编写。

编写脚本前,咱先来看看 nagios 服务端从脚本获取到的都是哪些数据,这样才好对症下药,写出符合规范的脚本:

nagios-load监控数据

从上图可以看到, nagios 从脚本获取的,是 Current StatusStatus InformationPerformance Data 这三项,只要脚本能正确提供这三项的数据, nagios 服务端就可以对脚本所针对的项目进行监控。

Current Status

Current Status 是监控项目的状态,先来看看 utils.sh 这个脚本文件,由于其他的监控脚本都是编译好的,虽然提高了执行速度,但我们无法查看源代码,也就失去了参考意义。 nagios 意识到了这点,为了方便我们自定义监控,故提供了 utils.sh 这个监控脚本模板。

1
2
3
4
5
6
7
8
9
10
11
12
vi /usr/local/nagios/libexec/utils.sh

########utils.sh########
#! /bin/sh

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
...
########utils.sh########

对于不经常接触 shell 编程的人来说,这个脚本太复杂,参考价值有限。但我们可以从中看到几个关键定义分别所代表的退出标志,即 STATE_OK 的退出符是 exit 0 ,而顾名思义, STATE_OK 是正常状态。根据以上我们可以明白,我们的自定义脚本,如果 exit 0 ,则 nagios 服务端就会把脚本的监控结果判断为正常。而后面的状态,判断方式相同,分别代表的含义为: STATE_WARNING 预警状态; STATE_CRITICAL 告警状态; STATE_UNKNOWN 未知状态; STATE_DEPENDENT 依赖状态。这个依赖状态很少用,我也不知道它所代表的含义,所以后续的脚本编写,就忽略掉吧。

Status Information 和 Performance Data

从模板比较难看出这两条数据,但咱可以执行预设脚本来和监控页面进行对比,那负载监控为例,咱先执行预设的 check_load 脚本,看会出现什么情况:

1
2
3
4
5
/usr/local/nagios/libexec/check_load -w 5.0,4.0,3.0 -c 10.0,6.0,4.0

########输出结果########
OK - load average: 0.00, 0.00, 0.00|load1=0.000;5.000;10.000;0; load5=0.000;4.000;6.000;0; load15=0.000;3.000;4.000;0;
########输出结果########

再对比 check_load 的监控页面截图我们可以看到,以 | 分隔, check_load 输出的数据分为了两部分,左边是 Status Information ,右边是 Performance Data

脚本编写

综上所诉,我们已经了解 nagios 监控所需要的信息,可以开始编写脚本了。以下就是一个监控 libexec 目录下文件数的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
vi /usr/local/nagios/libexec/check_test

########check_test########
#!/bin/bash

#定义帮助信息
help () {
echo "USAGE: [-w|--warning level] [-c|--critical level]";
exit 3;
}

#获取预警和告警数值
while getopts w:c: opt
do
case "$opt" in
w)
warn_num=$OPTARG;;
c)
critical_num=$OPTARG;;
*) help;;
esac
done

#获取监控数据
n=`ls -ltr /usr/local/nagios/libexec|wc -l`

#执行判断
if [[ $warn_num == "" || $critical_num == "" ]] ; then
help;
elif (( $n < $warn_num )) ; then
echo "OK : The number of shs is $n|shs=$n;$warn_num;$critical_num;0;";
exit 0;
elif (( $n > $warn_num && $n < $critical_num )) ; then
echo "Warning : The number of shs is $n|shs=$n;$warn_num;$critical_num;0;";
exit 1;
elif (( $n > $critical_num )) ; then
echo "CRITICAL : The number of shs is $n|shs=$n;$warn_num;$critical_num;0;";
exit 2;
elif [[ $n =~ ^[0-9]+$ ]] ; then
echo "UNKNOWN : $n";
exit 3;
fi

exit 3;
########check_test########

chmod u+x /usr/local/nagios/libexec/check_test

脚本编写完后,可以直接执行验证输出结果:

1
2
3
4
5
/usr/local/nagios/libexec/check_test -w 60 -c 70

########输出结果########
Warning : The number of shs is 62|shs=62;60;70;0;
########输出结果########

由以上看,输出的结果符合预期,那咱就把监控配上试试。

…(配置过程请参考《nagios 配置详解》

自定义脚本check_test监控数据

自定义脚本check_test的pnp视图

监控配置完成后,过一段时间可以看到,监控信息正常输出,证明脚本是可以正常工作的, warning 状态也证明,脚本的监控状态已被 nagios 服务端识别。至此,自定义脚本的配置,就告一段落了。可以说凡是能使用脚本输出具体数字的项目,都可以使用 nagios 来监控,进一步可以表明, nagios 的监控范围是非常广的。

pnp4nagios 绘图错误分析

Performance Data 未输出或格式错误

上面分析 nagios 获取脚本数据时有说到 Performance Data 数据的输出,就是执行脚本后 | 右边的那段数据,咱现在来分析一下它的数据结构:

1
2
3
4
5
6
7
8
9
rta=2.687ms;3000.000;5000.000;0;
| | | | | | |
|----|--|----|---------|-----|-|----- 标签(即你想定义的名称)
|--|----|---------|-----|-|----- 当前值
|----|---------|-----|-|----- 单位
|---------|-----|-|----- warning阀值
|-----|-|----- critical阀值
|-|----- 此标签的最小值
|----- 此标签的最大值

在较新的 pnp4nagios 版本中,如果偷懒,可以把以上数据输出简化成 rta=2.687ms ,这样也是可以识别的,但是为了提高脚本兼容性以及养成良好的习惯,还是建议按预定格式输出。

改变输出格式后,未将旧 rrd 文件删除

pnp4nagios 是使用 rrdtool 写入 rrd 文件的方式来记录监控信息,并从 rrd 文件中读取数据进行绘图。如果输出格式出现变化,例如改变单位或者改变标签之类的, rrdtool 无法将新格式数据写入旧 rrd 文件,会导致 pnp4nagios 暂停绘图的情况。所以 Performance Data 的输出格式在一开始就应该确定好,当改变输出格式时,最好另外新建一个监控任务,避免因格式冲突而导致数据写入错误。

结语

至此,通过近半个月对 nagios 进行解析和研究,所领悟的 nagios + pnp4nagios 三剑客之安装,配置,格式已全部分享完成,也算是对自己研究成果的一个记录吧。后续将根据使用过程中的体会和经验,再持续分享,have fun!