方法一,zabbix監控redis
1、匯入模板
同樣,模板我已上傳到 github項目 上 。直接下載,通過下面的步驟匯入模板:點擊configuration ----> templates ------> import -------> 匯入下載的xml檔案 。
2、用戶端key配置
在被監控的主機上,開啟/etc/zabbix/zabbix_agentd.conf 設定檔,在最後一行加入:
UserParameter=redis_stats[*],redis-cli -h 127.0.0.1 -p $1 info|grep $2|cut -d : -f2
配置完成後通過/etc/init.d/zabbix_agentd restart 重啟服務並應用最新的設定檔。
註:在該檔案中還要確認UnsafeUserParameters=1 。
3、服務端驗證
驗證方式還是通過zabbix_get 程式去擷取資料,能正常得到資料,證明通訊正常。
| 代碼如下 |
複製代碼 |
| # zabbix_get -s 172.20.0.20 -k redis_stats[6379,total_connections_received] |
上面正常從被監控主機上取得了資料,c/s通訊正常 。
4、添加主機關聯模板
通過configuration ------> hosts ------> create host 建立新的主機,並在templates項中,尋找Templates Redis_6379 模板,並link 該模板 。就可以正常擷取資料了。同樣,驗證資料使用 monitoring ----- lastest data ---- 打到剛剛添加的主機,查看是否有資料 。
5、查看監控圖
通過monitoring ----- graphs 可以查看剛剛添加的監控項的監控圖,這裡只截下記憶體使用量情況圖,
方法二,利用zabbix low level discovery 自動探索監控redis
一、伺服器配置
1)配置Regex,在後面添加discovery rules時會用到
#這裡是個坑,我這裡正則匹配的是連接埠號碼,剛開始寫的是”d+”測試也通過了,全部都配置好了,在服務端通過zabbix_get也能正常擷取到client的值,無奈就是不自動上報,檢查了一個中午,後來問了幾個群友,終於找到原因了,正則要用^(8899|10000)$ 類似這種格式,說多了都是淚呀
最後再查閱官方文檔,原來對zabbix的正則沒有理解清楚,它的正則是對上報結果的二次處理,其實如果上報的就是準確的,就不用進行二次過濾,最終採用正則一處留空,不進行二次匹配處理
先看zabbix_agentd.conf設定檔
| 代碼如下 |
複製代碼 |
UnsafeUserParameters=1 #允許zabbix使用者運行root命令 UserParameter=redis.discovery,/usr/local/zabbix/bin/redis_port.py #擷取json格式資料,上報連接埠 UserParameter=redis[*],/usr/local/zabbix/bin/redis_stats.sh $1 $2 #自訂Key值 |
需要兩個指令碼:
| 代碼如下 |
複製代碼 |
ll /usr/local/zabbix/bin/ total 516 -rwxr-xr-x 1 root root 342 Oct 25 16:56 redis_port.py -rwxr-xr-x 1 root root 773 Oct 25 14:59 redis_stats.sh -rwxr-xr-x 1 root root 236737 Jul 23 2012 zabbix_get -rwxr-xr-x 1 root root 278582 Jul 23 2012 zabbix_sender JSON格式指令碼 [root@ ~]# cat /usr/local/zabbix/bin/redis_port.py ##json串 #!/usr/bin/env python import os import json t=os.popen("""netstat -natp|awk -F: '/redis-server/&&/LISTEN/{print $2}'|awk '{print $1}' """) ports = [] for port in t.readlines(): r = os.path.basename(port.strip()) ports += [{'{#REDISPORT}':r}] print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':')) |
擷取連接埠資料狀態指令碼:
| 代碼如下 |
複製代碼 |
| [root@ ~]# cat /usr/local/zabbix/bin/redis_stats.sh ##擷取狀態 #!/bin/bash METRIC="$1" HOSTNAME=127.0.0.1 PORT="${2:-6379}" CACHE_FILE="/tmp/redis_$PORT.cache" (echo -en "INFOrn"; sleep 1;) | nc $HOSTNAME $PORT > $CACHE_FILE 2>/dev/null || exit 1 grep "^$METRIC:" $CACHE_FILE |awk -F':|,' '{print $2}'|sed "s/[^0-9]//g" |
以上是全部配置完成,下來進行測試
在zabbix_server上進行測試,執行以下命令:
| 代碼如下 |
複製代碼 |
| zabbix_get -s 192.168.250.206 -k redis.discovery 得到如下結果: { ”data”:[ { "{#REDISPORT}":"10000" }, { "{#REDISPORT}":"8899" } ] } OK,自動探索連接埠成功! zabbix_get -s 192.168.250.206 -k redis[used_memory,8899] |
4834072
OK,得到所需要的值!
然後將模板添加到所需要監控的機器上,這個就不上圖了
添加完模版以後,查看資料:
在做的過程中遇到以下問題:
1.關於正則的問題
正則匹配不同於普通的正則,多個之間的匹配正則要用^(8899|10000)$ 類似這種格式
或者正則留空
2.許可權問題,zabbix_agentd是zabbix使用者啟動的,預設不能執行netstat -p等命令,導致從伺服器取到的自動探索指令碼為空白
| 代碼如下 |
複製代碼 |
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) 解決方案 : chmod +s /bin/netstat |