Chinaunix

标题: Nagios 监控 Redis 内存使用量的脚本 [打印本页]

作者: 7looki    时间: 2012-11-16 15:46
标题: Nagios 监控 Redis 内存使用量的脚本
本帖最后由 7looki 于 2012-11-16 15:48 编辑

合同已经到期了, 没有打算续签, 想好好休息一下, 过完年再出来找工作.  这几天在办社保之类的手续, 在公司天天打酱油, 就写了下面的这个脚本.

本人能力有限, 学 Perl 还不到 3 个月, 脚本某些地方写的比较丑陋, 望各位大牛多多指点.

check_redis_used_memory.tar.gz (1.96 KB, 下载次数: 232)

这个脚本主要是监控 Redis 的内存使用量.

写这个监控脚本的主要原因有两个:
(1) 因为网上找的几个脚本只支持本地监控, 不能监控远程主机.
(2) 因为网上找的几个脚本都是Redis没有连接密码的情况下使用的, 如果Redis设置了连接密码, 则不能监控了.

基于以上两点, 写了这个监控脚本.

几点说明:

测试环境:
System :  CentOS 5.8 x86_64
Nagios  :  Nagios 3.4.1
Plugins :   Nagios Plugins 1.4.16
Redis    :  Redis 2.4.15
Perl      :   Perl 5.8.8

1. 请先确认已经安装了Nagios的插件(Nagios Plugins);

2. 修改这个脚本的第28行, 替换对应的目录, 默认目录是: /usr/local/nagios/libexec

3. 此脚本需要Perl中的Redis模块,可通过以下方式安装:
     shell> perl -MCPAN -e shell
    CPAN> install Redis


4. 此脚本中, Redis 内存使用量是按 Byte 监控的, 所以 WARNING 和 CRITICAL 只支持纯数字, 单位是 Byte, 且 WARNING 必须小于 CRITICAL.


5. -H 的选项为 hostname或者IP:端口, 例如: -H 192.168.1.200:6379 或 -H localhost:6379
    当初写脚本的时候, 就没有打算将 IP和端口 分开, 并不是不会写, 只是个人喜欢这种方式.
    PS: 不喜欢这种方式的可以绕道.

   -P 为连接 Redis 时需要的密码, 视实际情况而定, 可有可无

6. 简单的几个示例:

定义check_redis_used_memory, 在 /usr/local/nagios/etc/objects/commands.cfg 最后添加以下内容:

# 'check_redis_used_memory' command definition
# 连接Redis时需要密码
define command{
    command_name  check_redis_used_memory
    command_line     /usr/local/nagios/libexec/check_redis_used_memory -H $ARG1$ -P $ARG2$ -w $ARG3$ -c $ARG4$
}

# 'check_redis_used_memory' command definition
# 连接Redis时不需要密码
define command{
    command_name  check_redis_used_memory_no_passwd
    command_line     /usr/local/nagios/libexec/check_redis_used_memory -H $ARG1$ -w $ARG2$ -c $ARG3$
}

------------------------------------------------------------------------------------------------------------------------------------------

配置示例, 在 /usr/local/nagios/etc/objects/localhost.cfg 最后添加以下配置

配置示例1,需要密码:
define service{
        use                             local-service
        host_name                  localhost
        service_description       Redis used memory 6380
        check_command           check_redis_used_memory!127.0.0.1:6380!redispasswd!3000000!5000000!
}

配置示例2,不需要密码:
define service{
        use                             local-service
        host_name                  localhost
        service_description       Redis used memory 6370
        check_command           check_redis_used_memory_no_passwd!127.0.0.1:6379!3000000!5000000!
}

相关截图:


------------------------------------------------------------------------------------------------------------------------------------------
修改一下, 调整一下 WARNING 和 CRITICAL:
配置示例1修改为:
define service{
        use                             local-service
        host_name                  localhost
        service_description       Redis used memory 6380
        #check_command           check_redis_used_memory!127.0.0.1:6380!redispasswd!3000000!5000000!
        check_command           check_redis_used_memory!127.0.0.1:6380!redispasswd!1000000!2000000!
}

配置示例2修改为:
define service{
        use                             local-service
        host_name                  localhost
        service_description       Redis used memory 6370
        #check_command           check_redis_used_memory_no_passwd!127.0.0.1:6379!3000000!5000000!
        check_command           check_redis_used_memory_no_passwd!127.0.0.1:6379!2000000!3000000!
}


相关截图:


监控远程的主机, 只需要配置相应的IP和端口及密码等就可以了, 例如:
define service{
        use                             local-service
        host_name                  Redis Server
        service_description       Redis used memory
        check_command           check_redis_used_memory!192.168.1.200:6379!redispasswd!1000000!2000000!
}

--END--






作者: bh6886    时间: 2012-12-05 13:42
[root@localhost]#/usr/local/nagios/libexec/check_redis_used_memory -H 172.16.10.112:6380
Can't locate Redis.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/nagios/libexec/check_redis_used_memory line 25.
我是CENTOS6.2的系统。按照你说的执行报错,请问是什么原因?
作者: 7looki    时间: 2012-12-05 13:55
回复 2# bh6886


    3. 此脚本需要Perl中的Redis模块,可通过以下方式安装:
     shell> perl -MCPAN -e shell
    CPAN> install Redis
作者: 7looki    时间: 2012-12-05 13:56
回复 2# bh6886


    3. 此脚本需要Perl中的Redis模块,可通过以下方式安装:
     shell> perl -MCPAN -e shell
    CPAN> install Redis
作者: bh6886    时间: 2012-12-05 15:28
本帖最后由 bh6886 于 2012-12-05 16:03 编辑

好东西,测试正常
作者: 7looki    时间: 2012-12-05 16:31
回复 5# bh6886


    刚才我还看你说出错了, 一眨眼就好了. 是什么原因? 分享一下.
作者: bh6886    时间: 2012-12-05 16:38
本帖最后由 bh6886 于 2012-12-05 18:05 编辑

不是的,还有问题,我像多测试几下再发给你,你看:
[root@localhost libexec]# ./check_redis_used_memory -H  172.16.10.112:6380 -P miam2012&&^^$$ -w 100000000 -c 200000000
Warning threshold not specified
[root@localhost libexec]# ./check_redis_used_memory -H  172.16.10.112:6380 -P  'miam2012&&^^$$' -w 100000000 -c 200000000000OK ! Redis Used Memory : 726160Bytes [709.14K]
这样注意密码,我必须要加''号才能获取到。
按照你上述配置,增加到server.cfg中,没密码的端口是正常,有密码的端口在nagios网页界面提示
UNKNOWN Redis Used Memory
我直接写在commands.cfg一样不行(如下),不知道为什么。直接执行
# 'check_redis_passwd' command definition
define command{
    command_name  check_redis_used_memory
    command_line    /usr/local/nagios/libexec/check_redis_used_memory -H 172.16.10.112:6380 -P 'miam2012&&^^$$'  -w 2000000 -c 3000000
}
我再测试了下,密码删掉这些特殊字符后就能正常监控,不太理解nagios为什么写在commands.cf 还是不行。这些密码是商用的,不能修改,用这些密码如何才能监控到?
作者: 7looki    时间: 2012-12-05 16:50
回复 7# bh6886


    我现在在家, 暂时没有测试环境, 晚上我搭建一套测试环境, 再测试一下.
作者: bh6886    时间: 2012-12-05 16:59
嗯,可能是我的密码有特殊字符吗?我的QQ是2568032832,有啥事交流下 回复 8# 7looki


   
作者: 7looki    时间: 2012-12-06 03:29
本帖最后由 7looki 于 2012-12-06 03:35 编辑

回复 7# bh6886


你的密码包含了特殊字符, 需要转义一下.

我测试的环境:
CentOS 5.5 x86_64
Nagios 3.4.3

Nagios 配置文件:

/usr/local/nagios/etc/objects/commands.cfg
  1. # 'check_redis_used_memory' command definition
  2. define command{
  3.     command_name    check_redis_used_memory
  4.     command_line    /usr/local/nagios/libexec/check_redis_used_memory -H $ARG1$ -P $ARG2$ -w $ARG3$ -c $ARG4$
  5. }
复制代码
/usr/local/nagios/etc/objects/localhost.cfg
  1. define service{
  2.         use                             local-service
  3.         host_name                       localhost
  4.         service_description             Redis used memory 6379
  5.         check_command                   check_redis_used_memory!192.168.1.191:6379!miam2012\\&\\&\\^\\^\\$\\$!3000000!5000000!
  6. }
复制代码
转义方法:
miam2012\\&\\&\\^\\^\\$\\$

截图:


参考文档:
https://kb.groundworkopensource. ... shes+may+be+needed+(DEPRECATED)

http://www.nagiosql.org/forum/ge ... k-in-arguments.html

http://permalink.gmane.org/gmane.network.nagios.user/60951

http://www.krenger.ch/blog/nagios-escape-dollar-character/
作者: bh6886    时间: 2012-12-06 10:05
多谢。好监控脚本,赞一个~!回复 10# 7looki


   
作者: 7looki    时间: 2012-12-06 11:22
回复 11# bh6886


   
作者: typuc    时间: 2012-12-10 22:31
command_line    /usr/local/nagios/libexec/check_redis_used_memory -H $ARG1$ -P $ARG2$ -w $ARG3$ -c $ARG4$
可以把第一个参数 —H 用$HOSTADDRESS$替换,这样简洁些,完整如下
command_line    /usr/local/nagios/libexec/check_redis_used_memory -H $HOSTADDRESS$ -P $ARG1$ -w $ARG2$ -c $ARG3$

作者: wjf4321    时间: 2012-12-24 17:04
您好,正如你所说的网上找到的监控脚本不能监控远程主机。。这是我网上找的监控系统运行时间的脚本。。。希望你给与指教啊、、如何修改才能实现监控远程主机。。
#!/bin/sh
# Dmitry Vayntrub 01/18/2010
#
# The plugin shows the uptime and optionally
# compares it against MIN and MAX uptime thresholds
#######################################################################
VERSION="check_uptime v1.06"

# Exit-Codes:
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

usage()
{
cat << EOF
usage: $0 [-c OPTION]|[-w OPTION] [-C OPTION]|[-W OPTION] [ -V ]
#usage: $0 -H host [-c OPTION]|[-w OPTION] [-C OPTION]|[-W OPTION] [ -V ]

This script checks uptime and optionally verifies if the uptime
is below MINIMUM or above MAXIMUM uptime treshholds

OPTIONS:
   -h   Help
   -H   --hostname=HOST
   -c   CRITICAL MIN uptime (minutes)
   -w   WARNING  MIN uptime (minutes)
   -C   CRITICAL MAX uptime (minutes)
   -W   WARNING  MAX uptime (minutes)
   -V   Version
EOF
}

while getopts c:w:C:W:Vv OPTION
do
     case $OPTION in
        c)
           MIN_CRITICAL=`echo $OPTARG | grep -v "^-"`
           [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
           exit $STATE_UNKNOWN
           ;;
        w)
           MIN_WARNING=`echo $OPTARG | grep -v "^-"`
           [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
           exit $STATE_UNKNOWN
           ;;
        C)
           MAX_CRITICAL=`echo $OPTARG | grep -v "^-"`
           [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
           exit $STATE_UNKNOWN
           ;;
        W)
           MAX_WARNING=`echo $OPTARG | grep -v "^-"`
           [ ! "$?" = 0 ] && echo "Error: missing or illegal option value" && \
           exit $STATE_UNKNOWN
          ;;
        V|v)
           echo $VERSION
           exit $STATE_OK
           ;;
        ?)
           usage
           exit $STATE_UNKNOWN
           ;;
     esac
done


UPTIME_REPORT=`uptime | tr -d ","`

if      echo $UPTIME_REPORT | grep -i day > /dev/null ; then
        DAYS=`echo $UPTIME_REPORT | awk '{ print $3 }'`
        HOURS=`echo $UPTIME_REPORT | awk '{ print $5}' | cut -f1 -d":"`
        MINUTES=`echo $UPTIME_REPORT | awk '{ print $5}' | cut -f2 -d":"`

  elif  #in AIX 5:00 will show up as 5 hours, and in Solaris 2.6 as 5 hr(s)
        echo $UPTIME_REPORT | egrep -e "hour|hrs|hr\(s\)" > /dev/null ; then
        HOURS=`echo $UPTIME_REPORT | awk '{ print $3}'`
  else
        echo $UPTIME_REPORT | awk '{ print $3}' | grep ":" > /dev/null && \
        HOURS=`echo $UPTIME_REPORT | awk '{ print $3}' | cut -f1 -d":"`
        MINUTES=`echo $UPTIME_REPORT | awk '{ print $3}' | cut -f2 -d":"`
fi

UPTIME_MINUTES=`expr 0$DAYS \* 1440 + 0$HOURS \* 60 + 0$MINUTES`
UPTIME_MSG="${DAYS:+$DAYS Days,} ${HOURS:+$HOURS Hours,} $MINUTES Minutes"
PERFDATA="|'uptime'=`expr 0$UPTIME_MINUTES \* 60`s;`expr 0$MIN_WARNING \* 60`;`expr 0$MIN_CRITICAL \* 60`"

if     [ $MIN_CRITICAL ] && [ $UPTIME_MINUTES -lt $MIN_CRITICAL ] ; then
        echo "CRITICAL - system rebooted $UPTIME_MSG ago$PERFDATA"
        exit $STATE_CRITICAL

  elif [ $MIN_WARNING ] && [ $UPTIME_MINUTES -lt $MIN_WARNING ] ; then
        echo "WARNING - system rebooted $UPTIME_MSG ago$PERFDATA"
        exit $STATE_WARNING

  elif [ $MAX_CRITICAL ] && [ $UPTIME_MINUTES -gt $MAX_CRITICAL ] ; then
        echo "CRITICAL - system has not rebooted for $UPTIME_MSG$PERFDATA"
        exit $STATE_CRITICAL

  elif [ $MAX_WARNING ] && [ $UPTIME_MINUTES -gt $MAX_WARNING ] ; then
        echo "WARNING - system has not rebooted for $UPTIME_MSG$PERFDATA"
        exit $STATE_WARNING

  else
        echo "OK - uptime is $UPTIME_MSG$PERFDATA"
        exit $STATE_OK
fi




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2