羣裏今天有個哥們可能對low-level discovery 理解有點偏差,導致出了個小問題很久沒排查出來。個人覺得這個需求接下來,肯定更多人會去使用,避免大家走些彎路。特此瑪下文檔,文字功底不好,請原諒!!
需求:
基於中小型公司,成本原因,很可能一臺機器上部署多個同一個應用,但是不同端口的應用。比如在一臺機器上部署5 個memcached.但是端口不盡相同,這樣在zabbix 監控時,有點不好辦,有可能需要寫多個不同端口的腳本去監控,也有可能通過宏定義來解決,但是太麻煩了!!!
解決:
Zabbix 有個功能是low-level discovery,自己寫個JSON 格式的小腳本,輸出本機不同端口同一應用。然後弄個模板,結合JSON 腳本,就能實現不同端口同一應用監控。
案例:
這裏列舉我生產案例當中的memcached,而redis 也是一樣,只是利用zabbix 用戶做的時候,有點小麻煩!!!
1.準備json 腳本,我這裏是shell
cat memcached.sh
#!/bin/bash discovery(){ #netstat -nlput|awk -F":" '/memcached/ {print $0}' |grep -v udp |awk -F: '{print $2}'|awk '{print$1}' >/tmp/memcached.log ps -ef | grep memcached | grep -v grep | awk '{print $17}' > /tmp/memcached.log port=($(cat /tmp/memcached.log)) printf '{\n' printf '\t"data":[\n' for((i=0;i<${#port[@]};i++)) { num=$(echo $((${#port[@]}-1))) if [ "$i" != ${num} ]; then printf "\t\t{ \n" printf "\t\t\t\"{#MEMCACHEDPORT}\":\"${port[$i]}\"},\n" else printf "\t\t{ \n" printf "\t\t\t\"{#MEMCACHEDPORT}\":\"${port[$num]}\"}]}\n" fi } } case "$1" in discovery) discovery ;; esac
2.客戶端zabbix_agentd.conf 文件中調用
UnsafeUserParameters=1 UserParameter=redis.discovery,/usr/local/zabbix/bin/redis.sh discovery
3.服務端測試,是否能發現客戶端的memcached 不同端口
4.上述如果都沒問題,那麼可以操作WEB 頁面了。
選擇Administration --> General
右上角選擇正則表達式(Regular expressions)
創建正則表達式
5.強烈建議,做個模板,然後在裏面配discovery 規則,以及items、trigger、graph
創建模板我就不演示了,偷個懶!! 直接選擇Discovery rules 創建規則,如下!!
這裏Macro {#MEMCACHEDPORT},就是我們腳本傳來"{#MEMCACHEPORT}",而Regexp是我們剛剛定義的正則表達式名字。
規則創建好了,我們就可以添加items,trgger,graph 了。
注:一定是在我們的模板Memcached 的Discovery 裏面添加item
這裏面唯一要注意的,畫紅線的地方。這裏使用的key 末尾{#MEMCACHEDPORT}是我剛纔定義的macro。而這裏面key,memcached[accepting_conns,*] 是我定義的採集數據的腳本。這個大家可以根據自己的實際情況進行編寫,偷懶的話,網上也有模板,動動手谷歌下就來了。!!!
Trigger
Graph
通過上述做法,你就可以定義了一個memcached low-level discovery 模板,然後就可以就裝 有memcached 主機與這個模板link 上就OK 啦。
這樣在Monitoring--> Latest data 中就可以看到數據啦。只不過我這裏是沒連接,所以沒數據!
基於這些步驟,大致可以完成你的需求,其他的你就照葫蘆畫瓢。。然後你也可以配個discovery,只要是memcached 機器全部link 這個Memcached low-level discovery 模板。就又
可以偷點懶了。
如果有參照這個,大家細心點,其實照着itnihao 共享的手冊其實已經可以完成這個了。!!
只是大家可能沒仔細看吧!!!
寫的馬馬虎虎,見諒!!!