如果没有企业短信网关,如何实现监控的自动短信告警呢?
1.开通QQ邮箱,并且绑定手机号。
设置之后,一旦QQ邮箱接收到新邮件,就会自动发送短信提醒。
http://jingyan.baidu.com/article/90808022a318b2fd91c80f9a.html
2.制作一个JAVA程序,可以接收请求,并将请求内容作为邮件发送到QQ邮箱。
3.在Redis服务器上进行脚本监控。如果监控超过阈值,则请求JAVA程序代发邮件。
它还居然没有浮点运算
有两个方式可以实现浮点运算。
1.$(awk 'BEGIN {printf("%.2f",'$used_memory'/'$maxmemory')}')
2.$(echo "scale=2;$mem_ratio>$mem_target" | bc)
另外需要注意的是,top命令的结果默认是乱码,不能使用awk运算
使用top -b 参数就可以解决这个问题了
将这个脚本添加到crontab以一个间隔运行。
这样就实现了简易的Redis监控自动短信告警功能。
1.开通QQ邮箱,并且绑定手机号。
设置之后,一旦QQ邮箱接收到新邮件,就会自动发送短信提醒。
http://jingyan.baidu.com/article/90808022a318b2fd91c80f9a.html
2.制作一个JAVA程序,可以接收请求,并将请求内容作为邮件发送到QQ邮箱。
3.在Redis服务器上进行脚本监控。如果监控超过阈值,则请求JAVA程序代发邮件。
#! /bin/bash
logfile=/home/redis/redisdata/redis_monitor.log
serverip='127.0.0.1'
redisport=6379
slave_target=1
mem_target=0.5
cpu_target=0.5
alert_url='http://IP:port/servlet?to=dba&title=RedisError('$serverip')&content='
error_msg=''
echo $(date) >> $logfile
pid=$(ps -ef | grep redis-server | grep -v grep | awk '{print $2}')
if [ "$pid" = '' ] ; then
echo "[ERROR]Redis is shutdown" >>$logfile
error_msg=$error_msg"+Redis_is_shutdown"
else
echo "[INFO]pid:$pid" >>$logfile
maxmemory=$(redis-cli -p $redisport config get maxmemory | awk 'NR==2 {print $1}')
used_memory=$(redis-cli -p $redisport info memory | grep used_memory: | awk -F : '{print $2}' | sed 's/\r//g')
mem_ratio=$(awk 'BEGIN {printf("%.2f",'$used_memory'/'$maxmemory')}')
if [ $(echo "scale=2;$mem_ratio>$mem_target" | bc) -eq 1 ] ; then
echo "[ERROR]used_memory:$used_memory" >>$logfile
echo "[ERROR]mem_used_ratio:$mem_ratio" >> $logfile
error_msg=$error_msg"+mem_target#$mem_target"
error_msg=$error_msg"+used_memory#$used_memory"
error_msg=$error_msg"+mem_used_ratio#$mem_ratio"
else
echo "[INFO]used_memory:$used_memory" >>$logfile
echo "[INFO]mem_used_ratio:$mem_ratio" >> $logfile
fi
cpu_ratio=$(top -b -p $pid -n 1 | grep $pid | awk '/redis-server/{print $9}' | sed 's/\r//g')
if [ $(echo "scale=2;($cpu_ratio/100)>$cpu_target" |bc) -eq 1 ] ; then
echo "[ERROR]cpu_ratio:$cpu_ratio" >> $logfile
error_msg=$error_msg"+cpu_target#$(echo "$cpu_target*100" | bc)"
error_msg=$error_msg"+cpu_ratio#$cpu_ratio"
else
echo "[INFO]cpu_ratio:$cpu_ratio" >> $logfile
fi
slave_count=$(redis-cli -p $redisport info replication | awk -F : '/connected_slaves:/{print $2}' | sed 's/\r//g')
if [ $slave_count -ne $slave_target ] ; then
echo "[ERROR]slave:$slave_count" >> $logfile
error_msg=$error_msg"+slave_target#$slave_target"
error_msg=$error_msg"+slave#$slave_count"
else
echo "[INFO]slave:$slave_count" >> $logfile
fi
fi
if [ "$error_msg" != '' ] ; then
curl $alert_url$error_msg
fi
Shell脚本确实写着费劲logfile=/home/redis/redisdata/redis_monitor.log
serverip='127.0.0.1'
redisport=6379
slave_target=1
mem_target=0.5
cpu_target=0.5
alert_url='http://IP:port/servlet?to=dba&title=RedisError('$serverip')&content='
error_msg=''
echo $(date) >> $logfile
pid=$(ps -ef | grep redis-server | grep -v grep | awk '{print $2}')
if [ "$pid" = '' ] ; then
echo "[ERROR]Redis is shutdown" >>$logfile
error_msg=$error_msg"+Redis_is_shutdown"
else
echo "[INFO]pid:$pid" >>$logfile
maxmemory=$(redis-cli -p $redisport config get maxmemory | awk 'NR==2 {print $1}')
used_memory=$(redis-cli -p $redisport info memory | grep used_memory: | awk -F : '{print $2}' | sed 's/\r//g')
mem_ratio=$(awk 'BEGIN {printf("%.2f",'$used_memory'/'$maxmemory')}')
if [ $(echo "scale=2;$mem_ratio>$mem_target" | bc) -eq 1 ] ; then
echo "[ERROR]used_memory:$used_memory" >>$logfile
echo "[ERROR]mem_used_ratio:$mem_ratio" >> $logfile
error_msg=$error_msg"+mem_target#$mem_target"
error_msg=$error_msg"+used_memory#$used_memory"
error_msg=$error_msg"+mem_used_ratio#$mem_ratio"
else
echo "[INFO]used_memory:$used_memory" >>$logfile
echo "[INFO]mem_used_ratio:$mem_ratio" >> $logfile
fi
cpu_ratio=$(top -b -p $pid -n 1 | grep $pid | awk '/redis-server/{print $9}' | sed 's/\r//g')
if [ $(echo "scale=2;($cpu_ratio/100)>$cpu_target" |bc) -eq 1 ] ; then
echo "[ERROR]cpu_ratio:$cpu_ratio" >> $logfile
error_msg=$error_msg"+cpu_target#$(echo "$cpu_target*100" | bc)"
error_msg=$error_msg"+cpu_ratio#$cpu_ratio"
else
echo "[INFO]cpu_ratio:$cpu_ratio" >> $logfile
fi
slave_count=$(redis-cli -p $redisport info replication | awk -F : '/connected_slaves:/{print $2}' | sed 's/\r//g')
if [ $slave_count -ne $slave_target ] ; then
echo "[ERROR]slave:$slave_count" >> $logfile
error_msg=$error_msg"+slave_target#$slave_target"
error_msg=$error_msg"+slave#$slave_count"
else
echo "[INFO]slave:$slave_count" >> $logfile
fi
fi
if [ "$error_msg" != '' ] ; then
curl $alert_url$error_msg
fi
它还居然没有浮点运算
有两个方式可以实现浮点运算。
1.$(awk 'BEGIN {printf("%.2f",'$used_memory'/'$maxmemory')}')
2.$(echo "scale=2;$mem_ratio>$mem_target" | bc)
另外需要注意的是,top命令的结果默认是乱码,不能使用awk运算
使用top -b 参数就可以解决这个问题了
将这个脚本添加到crontab以一个间隔运行。
这样就实现了简易的Redis监控自动短信告警功能。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1203311/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29254281/viewspace-1203311/