Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6378252
  • 博文数量: 162
  • 博客积分: 3600
  • 博客等级: 中校
  • 技术积分: 10366
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-19 11:23
个人简介

专注系统运维、网络架构,研究技术解决方案,记录我的思想轨迹、工作学习、生活和关注的领域

文章分类
文章存档

2014年(2)

2013年(16)

2012年(27)

2011年(117)

分类: 系统运维

2012-12-12 13:37:09

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://blog.chinaunix.net/space.php?uid=25266990&do=blog&id=3437195


如今,监控系统是琳琅满目,有NagiosCactiZabbixCentreonMunin等,也有系统集成如FAN等。个人在经过不同监控的安装测试后,还是比较倾向于Nagios的监控,简单命令;而且结合PNP4nagios等插件可以实现图表的功能。


NagiosPnp4nagios使用的是RRDtool工具来实现画图的,关于NaigosPnp4nagios的安装这里就不介绍了。

RRDtol是一套可以把数据生成表的程式,关于RRDtool的介绍和学习,大家可以到下面网站学习。


http://www.blogjava.net/ruoyoux/articles/257138.html


另外关于SHELL Scripts学习,网上有很多资料,偶然看到一个网站:



关于监控脚本,这里也不介绍了,可以自己编写,也可以网络上下载开发好的插件。



这里主要介绍关于监控数据的获取,以及通过Pnp4nagios展示数据报表。


一、数据的获取方式


nagios性能数据

nagios将插件输出中"|"号后的内容作为性能数据。性能数据格式如下:


  1. 'label'=value[UOM];[warn];[crit];[min];[max]

注意:

1. 多个性能数据之间用空格分割

2. label 可以包含任何字符

3. 如果label中包含空格、等号、或者单引号,则label需要用单引号来括起来

4. warn/crit/min/max可以为null

value, min and max只能为负号“-” “09” 和小数点“.” 并且单位必须统一 

例如:cpu_user=0.5%;99.9;-9;

5. 如果UOM单位是%,则minmax不需要再指定

6. UOM单位可以是如下: 默认空,表示数量(用于用户数、处理器数等)

       s    表示秒(也可以用usms

       %   表示百分比

       B    表示字节(也可以用KB,MB,TB,GB

       c    一个连续的计数(如:接口传输的字节数)

如内存监控的数据:


  1. # /usr/local/nagios/libexec//check_mem 90 95

  2. MEM OK - Memory usage = 18.700%, RealUsed=3003MB|Used=18.700%;REALMEMUSED=3003MB

说明:内存使用18.700%,实际使用内存为3003MB

我们查看脚本:


  1. #!/bin/bash

  2. # Determine memory usage percentage on Linux servers.

  3. # Original write for RHEL3 for PC1 Project - jlightner 05-Jul-2005

  4. #

  5. # Modified for RHEL5 on mailservers.

  6. # -Some of the escapes previously required for RHEL3's ksh not needed on RHEL5.

  7. # -Changed comparisons to allow for decimal rather than integer values.

  8. # jlightner 23-Jan-2009

  9. #

  10. # Usage: check_mem.sh WARNING CRITICAL

  11. # Where WARNING and CRITICAL are the integer only portions of the

  12. # percentage for the level desired.

  13. # (i.e. 85% Warning & 95% Critical should be input only as "85 95".)

  14. # Define Levels based on input

  15. #

  16. WARN=$1

  17. CRIT=$2

  18. # Setup standard Nagios/NRPE return codes

  19. #

  20. # Give full paths to commands - Nagios can't determine location otherwise

  21. #

  22. BC=/usr/bin/bc

  23. GREP=/bin/grep

  24. AWK=/bin/awk

  25. FREE=/usr/bin/free

  26. TAIL=/usr/bin/tail

  27. HEAD=/usr/bin/head

  28. # Get memory information from the "free" command - output of top two lines

  29. # looks like:

  30. # total used free shared buffers cached

  31. # Mem: 8248768 6944444 1304324 0 246164 5647524

  32. # The set command will get everything from the second line and put it into

  33. # posiional variables $1 through $7.

  34. #

  35. set `$FREE |$HEAD -2 |$TAIL -1`

  36. # Now give variable names to the positional variables we set above

  37. #

  38. MEMTOTAL=$2

  39. MEMUSED=$3

  40. MEMFREE=$4

  41. MEMBUFFERS=$6

  42. MEMCACHED=$7

  43. # Do calculations based on what we got from free using the variables defined

  44. #

  45. REALMEMUSED=`echo $MEMUSED - $MEMBUFFERS - $MEMCACHED | $BC`

  46. USEPCT=`echo "scale=3; $REALMEMUSED / $MEMTOTAL * 100" |$BC -l`

  47. REALMEMUSEDmb=`echo "($REALMEMUSED)/1024" | $BC`

  48. # Compare the Used percentage to the Warning and Critical levels input at

  49. # command line. Issue message and set return code as appropriate for each

  50. # level. Nagios web page will use these to determine alarm level and message.

  51. #

  52. #if [ `echo "5.0 > 5" |bc` -eq 1 ]

  53. #then echo it is greater

  54. #else echo it is not greater

  55. #fi

  56. if [ `echo "$USEPCT > $CRIT" |bc` == 1 ]

  57. then echo "MEM CRITICAL - Memory usage = ${USEPCT}%, RealUsed=${REALMEMUSEDmb}MB |Used=${USEPCT}%;REALMEMUSED=${REALMEMUSEDmb}MB"

  58. exit 2

  59. elif [ `echo "$USEPCT > $WARN" |bc` == 1 ]

  60. then echo "MEM WARNING - Memory usage = ${USEPCT}%, RealUsed=${REALMEMUSEDmb}MB |Used=${USEPCT}%;REALMEMUSED=${REALMEMUSEDmb}MB"

  61. exit 1

  62. elif [ `echo "$USEPCT < $WARN" |bc` == 1 ]

  63. then echo "MEM OK - Memory usage = ${USEPCT}%, RealUsed=${REALMEMUSEDmb}MB|Used=${USEPCT}%;REALMEMUSED=${REALMEMUSEDmb}MB"

  64. exit 0

  65. else echo "MEM ERROR - Unable to determine memory usage"

  66. exit 3

  67. fi

  68. echo "Unable to determine memory usage."

  69. exit 3

红色代码部分即为性能数据,其中:

labelUsedREALMEMUSED,再次强调,如果label有特殊字符,需加"",参数间最好不要空格。

Used作为pnp4nagios的变量,如var1var2,在pnp中也可以写成一样的值。

USEPCT为第一个参数值,即18.700

UOM单位是%,同样REALMEMUSEDUOM单位是MB

到处,监控的数据已经获取。

补充:格式为warn/crit/min/max值。

如:Used=${USEPCT}%;${WARN};${CRIT};0;100

WARNCRIT为触发值,$1 $2,,也可以在图表展示出来。

min/max 表示最低值、最高值。

二、Pnp4nagios生成数据图表。

找到Pnp的模版目录,我的目录为:

/usr/local/pnp4nagios/share/templates  模版开发目录

/usr/local/pnp4nagios/share/templates.dist 系统自带模版

监控脚本的名称和php模版名称对应。

因为为php语言,所以要遵循PHP格式

语法详解:


  1. $opt[1] = "--vertical-label % -l0 -u 100 --title \"Memory for $hostname / $servicedesc\" ";

说明:设置图表标题,高度等。详细参数有:
-s  绘图资料的起始时间,预设4小时

-e  绘图资料结束时间,预设现在

-t  --title图表标题
-v  --vertical-label  
-w  资料区的宽度,资料区指的是数据显示示的部份,即底部说明
-h   资料区的高度
-u   軸正值高度
-l   軸負值高度
-M  自动跳转Y最大值


  1. def("vname", rrd_filename, $DS_name, "[AVERAGE|MAX..]");

DEF 其语法为 

vnam 为Nagios监控脚本 "|" 后输出的第一个变量,如var1 var2,也可以指定名称。

DS(Data Source),亦即在表中宣告一个资料来源,必須先宣告,以下的这里资料AVERAGE|MAX|MIN 为取数据平均值和最大值等。

DEF以下代码为绘图显示过程。

1显示第一种写法,用()语法


  1. LINE{1|2|3}("vname",#rrggbb,name);

  2. GPRINT("vname", array("LAST", "AVERAGE", "MAX"), "format");


LINE线条方式:

这条函式就是您想把资料线条的方式表示,其中依照的粗又可分LINE1LINE2LINE3SIZEvnameDEF中的vname#rrggbb这里填你想要线条显示的顏色,使用RGB代码name填写底部显示名称

AREA方块方式:
AREA("vname",#rrggbb,name);

这种方式就是您想把资料用填充狀的方式表示,其他面的参数请參照LINE的用法,做出来的实例如下︰


STACK行数显示

STACK("vname",#rrggbb,name);

则是读出数据值至其上的也就是要有资料数值在 STACK 值之上如有多个变量,数值高的显示在上面,用法同上兩


GPRINT vname DEF中的vnamearray看你要输出的文字是AVERAGE/MAX/MIN/LASTformat 如同 printf 中的格式,
做出來如下示例

2、显示第二种写法,用 : 语法 


  1. LINE{1|2|3}:vname:#rrggbb:\"name\" ";

  2. GPRINT:vname:LAST:\"format\" ";

  3. GPRINT:vname:AVERAGE:\"format\" ";

  4. GPRINT:vname:LAST:\"format\"format\ ";

语法中参数还是一样。

另外关于报警线条的显示,可以写为:

1


  1. if ($WARN[1] != "") {

  2. $def[1] .= "HRULE:$WARN[1]#FFFF00 ";

  3. }

  4. if ($CRIT[1] != "") {

  5. $def[1] .= "HRULE:$CRIT[1]#FF0000 ";

  6. }

  7. 2、

  8. $def[1] .= "HRULE:$WARN[1]#FFFF00 ";

  9. $def[1] .= "HRULE:$CRIT[1]#FF0000 ";

做出来的示例:

三、示例

1、以check_mem.php模版说明

代码:


  1. <?php

  2. # Copyright (c) 2006-2010 Joerg Linge ()

  3. # Plugin: check_mem

  4. $opt[1] = "--vertical-label % -l0 -u 100 --title \"Memory for $hostname / $servicedesc\" ";

  5. $def[1] = rrd::def("var1", $RRDFILE[1], $DS[1], "AVERAGE");

  6. if ($WARN[1] != "") {

  7.     $def[1] .= "HRULE:$WARN[1]#FFFF00 ";

  8. }

  9. if ($CRIT[1] != "") {

  10.     $def[1] .= "HRULE:$CRIT[1]#FF0000 ";

  11. }

  12. $def[1] .= rrd::LINE1("var1", "#00FF00", "Memory") ;

  13. $def[1] .= rrd::gprint("var1", array("LAST", "AVERAGE", "MAX"), "%6.2lf");

  14. ?>

效果图:

2、check_traffic.php网卡流量监控模版

代码:


  1. <?php

  2. $opt[1] = "--vertical-label bits/s --title \"Traffic for $hostname / $servicedesc\" ";

  3. $colors = array(

  4.        'red'=> '#FF0000',

  5.        'green' => '#00FF00',

  6.        'blue' => '#0000FF',

  7.        'yellow' => '#FFFF00',

  8.        'black' => '#000000',

  9.        'deepred' => '#330000',

  10.         );

  11. $def[1] = "DEF:var1=$rrdfile:$DS[1]:AVERAGE " ;

  12. $def[1] .= "DEF:var2=$rrdfile:$DS[2]:AVERAGE " ;

  13. $def[1] .= "HRULE:$WARN[1]#FFFF00 ";

  14. $def[1] .= "HRULE:$CRIT[1]#FF0000 ";

  15. $def[1] .= "AREA:var1$colors[green]:\"In \" " ;

  16. $def[1] .= "GPRINT:var1:LAST:\"%6.1lf last\" " ;

  17. $def[1] .= "GPRINT:var1:AVERAGE:\"%6.1lf avg\" " ;

  18. $def[1] .= "GPRINT:var1:MAX:\"%6.1lf max\\n\" ";

  19. $def[1] .= "LINE:var2$colors[blue]:\"Out \" " ;

  20. $def[1] .= "GPRINT:var2:LAST:\"%6.1lf last\" " ;

  21. $def[1] .= "GPRINT:var2:AVERAGE:\"%6.1lf avg\" " ;

  22. $def[1] .= "GPRINT:var2:MAX:\"%6.1lf Total\\n\" " ;

  23. ?>

效果图:



以上仅个人理解,如有错误的地方,希望大家指正,谢谢。

阅读(25633) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~