原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://blog.chinaunix.net/space.php?uid=25266990&do=blog&id=3437195
如今,监控系统是琳琅满目,有Nagios、Cacti、Zabbix、Centreon、Munin等,也有系统集成如FAN等。个人在经过不同监控的安装测试后,还是比较倾向于Nagios的监控,简单命令;而且结合PNP4nagios等插件可以实现图表的功能。
Nagios、Pnp4nagios使用的是RRDtool工具来实现画图的,关于Naigos和Pnp4nagios的安装这里就不介绍了。
RRDtol是一套可以把数据生成表的程式,关于RRDtool的介绍和学习,大家可以到下面网站学习。
http://www.blogjava.net/ruoyoux/articles/257138.html
另外关于SHELL Scripts学习,网上有很多资料,偶然看到一个网站:
关于监控脚本,这里也不介绍了,可以自己编写,也可以网络上下载开发好的插件。
这里主要介绍关于监控数据的获取,以及通过Pnp4nagios展示数据报表。
一、数据的获取方式
nagios性能数据
nagios将插件输出中"|"号后的内容作为性能数据。性能数据格式如下:
- 'label'=value[UOM];[warn];[crit];[min];[max]
注意:
1. 多个性能数据之间用空格分割
2. label 可以包含任何字符
3. 如果label中包含空格、等号、或者单引号,则label需要用单引号来括起来
4. warn/crit/min/max可以为null值
value, min and max只能为负号“-” “0到9” 和小数点“.” 并且单位必须统一
例如:cpu_user=0.5%;99.9;-9;
5. 如果UOM单位是%,则min和max不需要再指定
6. UOM单位可以是如下: 默认空,表示数量(用于用户数、处理器数等)
s 表示秒(也可以用us,ms)
% 表示百分比
B 表示字节(也可以用KB,MB,TB,GB)
c 一个连续的计数(如:接口传输的字节数)
如内存监控的数据:
- # /usr/local/nagios/libexec//check_mem 90 95
- MEM OK - Memory usage = 18.700%, RealUsed=3003MB|Used=18.700%;REALMEMUSED=3003MB
说明:内存使用18.700%,实际使用内存为3003MB。
我们查看脚本:
- #!/bin/bash
- # Determine memory usage percentage on Linux servers.
- # Original write for RHEL3 for PC1 Project - jlightner 05-Jul-2005
- #
- # Modified for RHEL5 on mailservers.
- # -Some of the escapes previously required for RHEL3's ksh not needed on RHEL5.
- # -Changed comparisons to allow for decimal rather than integer values.
- # jlightner 23-Jan-2009
- #
- # Usage: check_mem.sh WARNING CRITICAL
- # Where WARNING and CRITICAL are the integer only portions of the
- # percentage for the level desired.
- # (i.e. 85% Warning & 95% Critical should be input only as "85 95".)
- # Define Levels based on input
- #
- WARN=$1
- CRIT=$2
- # Setup standard Nagios/NRPE return codes
- #
- # Give full paths to commands - Nagios can't determine location otherwise
- #
- BC=/usr/bin/bc
- GREP=/bin/grep
- AWK=/bin/awk
- FREE=/usr/bin/free
- TAIL=/usr/bin/tail
- HEAD=/usr/bin/head
- # Get memory information from the "free" command - output of top two lines
- # looks like:
- # total used free shared buffers cached
- # Mem: 8248768 6944444 1304324 0 246164 5647524
- # The set command will get everything from the second line and put it into
- # posiional variables $1 through $7.
- #
- set `$FREE |$HEAD -2 |$TAIL -1`
- # Now give variable names to the positional variables we set above
- #
- MEMTOTAL=$2
- MEMUSED=$3
- MEMFREE=$4
- MEMBUFFERS=$6
- MEMCACHED=$7
- # Do calculations based on what we got from free using the variables defined
- #
- REALMEMUSED=`echo $MEMUSED - $MEMBUFFERS - $MEMCACHED | $BC`
- USEPCT=`echo "scale=3; $REALMEMUSED / $MEMTOTAL * 100" |$BC -l`
- REALMEMUSEDmb=`echo "($REALMEMUSED)/1024" | $BC`
- # Compare the Used percentage to the Warning and Critical levels input at
- # command line. Issue message and set return code as appropriate for each
- # level. Nagios web page will use these to determine alarm level and message.
- #
- #if [ `echo "5.0 > 5" |bc` -eq 1 ]
- #then echo it is greater
- #else echo it is not greater
- #fi
- if [ `echo "$USEPCT > $CRIT" |bc` == 1 ]
- then echo "MEM CRITICAL - Memory usage = ${USEPCT}%, RealUsed=${REALMEMUSEDmb}MB |Used=${USEPCT}%;REALMEMUSED=${REALMEMUSEDmb}MB"
- exit 2
- elif [ `echo "$USEPCT > $WARN" |bc` == 1 ]
- then echo "MEM WARNING - Memory usage = ${USEPCT}%, RealUsed=${REALMEMUSEDmb}MB |Used=${USEPCT}%;REALMEMUSED=${REALMEMUSEDmb}MB"
- exit 1
- elif [ `echo "$USEPCT < $WARN" |bc` == 1 ]
- then echo "MEM OK - Memory usage = ${USEPCT}%, RealUsed=${REALMEMUSEDmb}MB|Used=${USEPCT}%;REALMEMUSED=${REALMEMUSEDmb}MB"
- exit 0
- else echo "MEM ERROR - Unable to determine memory usage"
- exit 3
- fi
- echo "Unable to determine memory usage."
- exit 3
红色代码部分即为性能数据,其中:
label为Used和REALMEMUSED,再次强调,如果label有特殊字符,需加"",参数间最好不要空格。
Used作为pnp4nagios的变量,如var1、var2,在pnp中也可以写成一样的值。
USEPCT为第一个参数值,即18.700。
UOM单位是%,同样REALMEMUSED的UOM单位是MB。
到处,监控的数据已经获取。
补充:格式为warn/crit/min/max值。
如:Used=${USEPCT}%;${WARN};${CRIT};0;100
WARN和CRIT为触发值,$1 、$2,,也可以在图表展示出来。
min/max 表示最低值、最高值。
二、Pnp4nagios生成数据图表。
找到Pnp的模版目录,我的目录为:
/usr/local/pnp4nagios/share/templates 模版开发目录
/usr/local/pnp4nagios/share/templates.dist 系统自带模版
监控脚本的名称和php模版名称对应。
因为为php语言,所以要遵循PHP格式
语法详解:
- $opt[1] = "--vertical-label % -l0 -u 100 --title \"Memory for $hostname / $servicedesc\" ";
说明:设置图表标题,高度等。详细参数有:
-s 绘图资料的起始时间,预设是4小时前
-e 绘图资料的结束时间,预设是现在
-t --title图表标题
-v --vertical-label Y 軸说明
-w 资料区的宽度,资料区指的是数据显示示的部份,即底部说明
-h 资料区的高度
-u Y 軸正值高度
-l Y 軸負值高度
-M 自动跳转Y軸最大值
- def("vname", rrd_filename, $DS_name, "[AVERAGE|MAX..]");
DEF 其语法为
vnam 为Nagios监控脚本 "|" 后输出的第一个变量,如var1 、var2,也可以指定名称。
DS(Data Source),亦即在图表中宣告一个资料来源,必須先宣告,让以下的图從这里取资料。AVERAGE|MAX|MIN 为取数据平均值和最大值等。
DEF以下代码为绘图显示过程。
1、显示第一种写法,用()语法:
- LINE{1|2|3}("vname",#rrggbb,name);
- GPRINT("vname", array("LAST", "AVERAGE", "MAX"), "format");
LINE线条方式:
用这条函式就是您想把资料用线条的方式表示,其中依照的粗细又可分为LINE1、LINE2、LINE3三种SIZE;vname即DEF中的vname;#rrggbb這这里填你想要线条显示的顏色,使用RGB代码;name填写底部显示名称。
AREA方块方式:
AREA("vname",#rrggbb,name);
用这种方式就是您想把资料用填充块狀的方式表示,其他后面的参数请參照LINE的用法,做出来的实例如下︰
STACK行数其显示︰
STACK("vname",#rrggbb,name);
则是读出数据值至其上的数值,也就是要有资料数值在 STACK 数值之上,如有多个变量,数值高的显示在上面,用法同上兩个。
GPRINT vname 即DEF中的vname,而array看你要输出的文字是AVERAGE/MAX/MIN/LAST等数值,format 如同 printf 中的格式,
做出來如下示例︰
2、显示第二种写法,用 : 语法 :
- LINE{1|2|3}:vname:#rrggbb:\"name\" ";
- GPRINT:vname:LAST:\"format\" ";
- GPRINT:vname:AVERAGE:\"format\" ";
- GPRINT:vname:LAST:\"format\"format\ ";
语法中参数还是一样。
另外关于报警线条的显示,可以写为:
1、
- if ($WARN[1] != "") {
- $def[1] .= "HRULE:$WARN[1]#FFFF00 ";
- }
- if ($CRIT[1] != "") {
- $def[1] .= "HRULE:$CRIT[1]#FF0000 ";
- }
- 2、
- $def[1] .= "HRULE:$WARN[1]#FFFF00 ";
- $def[1] .= "HRULE:$CRIT[1]#FF0000 ";
做出来的示例:
三、示例
1、以check_mem.php模版说明︰
代码:
- <?php
- # Copyright (c) 2006-2010 Joerg Linge ()
- # Plugin: check_mem
- $opt[1] = "--vertical-label % -l0 -u 100 --title \"Memory for $hostname / $servicedesc\" ";
- $def[1] = rrd::def("var1", $RRDFILE[1], $DS[1], "AVERAGE");
- if ($WARN[1] != "") {
- $def[1] .= "HRULE:$WARN[1]#FFFF00 ";
- }
- if ($CRIT[1] != "") {
- $def[1] .= "HRULE:$CRIT[1]#FF0000 ";
- }
- $def[1] .= rrd::LINE1("var1", "#00FF00", "Memory") ;
- $def[1] .= rrd::gprint("var1", array("LAST", "AVERAGE", "MAX"), "%6.2lf");
- ?>
效果图:
2、check_traffic.php网卡流量监控模版
代码:
- <?php
- $opt[1] = "--vertical-label bits/s --title \"Traffic for $hostname / $servicedesc\" ";
- $colors = array(
- 'red'=> '#FF0000',
- 'green' => '#00FF00',
- 'blue' => '#0000FF',
- 'yellow' => '#FFFF00',
- 'black' => '#000000',
- 'deepred' => '#330000',
- );
- $def[1] = "DEF:var1=$rrdfile:$DS[1]:AVERAGE " ;
- $def[1] .= "DEF:var2=$rrdfile:$DS[2]:AVERAGE " ;
- $def[1] .= "HRULE:$WARN[1]#FFFF00 ";
- $def[1] .= "HRULE:$CRIT[1]#FF0000 ";
- $def[1] .= "AREA:var1$colors[green]:\"In \" " ;
- $def[1] .= "GPRINT:var1:LAST:\"%6.1lf last\" " ;
- $def[1] .= "GPRINT:var1:AVERAGE:\"%6.1lf avg\" " ;
- $def[1] .= "GPRINT:var1:MAX:\"%6.1lf max\\n\" ";
- $def[1] .= "LINE:var2$colors[blue]:\"Out \" " ;
- $def[1] .= "GPRINT:var2:LAST:\"%6.1lf last\" " ;
- $def[1] .= "GPRINT:var2:AVERAGE:\"%6.1lf avg\" " ;
- $def[1] .= "GPRINT:var2:MAX:\"%6.1lf Total\\n\" " ;
- ?>
效果图:
以上仅个人理解,如有错误的地方,希望大家指正,谢谢。