簡易實現Redis監控自動簡訊告警

壹頁書發表於2014-07-02
如果沒有企業簡訊閘道器,如何實現監控的自動簡訊告警呢?

1.開通QQ郵箱,並且繫結手機號。
設定之後,一旦QQ郵箱接收到新郵件,就會自動傳送簡訊提醒。
http://jingyan.baidu.com/article/90808022a318b2fd91c80f9a.html

2.製作一個JAVA程式,可以接收請求,並將請求內容作為郵件傳送到QQ郵箱。
   
3.在Redis伺服器上進行指令碼監控。如果監控超過閾值,則請求JAVA程式代發郵件。

  1. #! /bin/bash
  2. logfile=/home/redis/redisdata/redis_monitor.log
  3. serverip='127.0.0.1'
  4. redisport=6379
  5. slave_target=1
  6. mem_target=0.5
  7. cpu_target=0.5
  8. alert_url='http://IP:port/servlet?to=dba&title=RedisError('$serverip')&content='
  9. error_msg=''
  10. echo $(date) >> $logfile
  11. pid=$(ps -ef | grep redis-server | grep -v grep | awk '{print $2}')
  12. if [ "$pid" = '' ] ; then
  13.     echo "[ERROR]Redis is shutdown" >>$logfile
  14.     error_msg=$error_msg"+Redis_is_shutdown"
  15. else
  16.     echo "[INFO]pid:$pid" >>$logfile

  17.     maxmemory=$(redis-cli -p $redisport config get maxmemory | awk 'NR==2 {print $1}')
  18.     used_memory=$(redis-cli -p $redisport info memory | grep used_memory: | awk -F : '{print $2}' | sed 's/\r//g')
  19.     mem_ratio=$(awk 'BEGIN {printf("%.2f",'$used_memory'/'$maxmemory')}')
  20.     if [ $(echo "scale=2;$mem_ratio>$mem_target" | bc) -eq 1 ] ; then
  21.         echo "[ERROR]used_memory:$used_memory" >>$logfile
  22.         echo "[ERROR]mem_used_ratio:$mem_ratio" >> $logfile
  23.         error_msg=$error_msg"+mem_target#$mem_target"
  24.         error_msg=$error_msg"+used_memory#$used_memory"
  25.         error_msg=$error_msg"+mem_used_ratio#$mem_ratio"
  26.     else
  27.         echo "[INFO]used_memory:$used_memory" >>$logfile
  28.         echo "[INFO]mem_used_ratio:$mem_ratio" >> $logfile
  29.     fi

  30.     
  31.     cpu_ratio=$(top -b -p $pid -n 1 | grep $pid | awk '/redis-server/{print $9}' | sed 's/\r//g')
  32.     if [ $(echo "scale=2;($cpu_ratio/100)>$cpu_target" |bc) -eq 1 ] ; then
  33.         echo "[ERROR]cpu_ratio:$cpu_ratio" >> $logfile
  34.         error_msg=$error_msg"+cpu_target#$(echo "$cpu_target*100" | bc)"
  35.         error_msg=$error_msg"+cpu_ratio#$cpu_ratio"
  36.     else
  37.         echo "[INFO]cpu_ratio:$cpu_ratio" >> $logfile
  38.     fi

  39.     slave_count=$(redis-cli -p $redisport info replication | awk -F : '/connected_slaves:/{print $2}' | sed 's/\r//g')
  40.     if [ $slave_count -ne $slave_target ] ; then
  41.         echo "[ERROR]slave:$slave_count" >> $logfile
  42.         error_msg=$error_msg"+slave_target#$slave_target"
  43.         error_msg=$error_msg"+slave#$slave_count"
  44.     else
  45.         echo "[INFO]slave:$slave_count" >> $logfile
  46.     fi
  47. fi

  48. if [ "$error_msg" != '' ] ; then
  49.     curl $alert_url$error_msg
  50. fi
Shell指令碼確實寫著費勁
它還居然沒有浮點運算
有兩個方式可以實現浮點運算。
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章