自定義key解決zabbix埠監聽取值不準確的問題

That's_it發表於2016-07-13
     今天有一個朋友問到我一個關於zabbix監控tcp埠的問題,明明埠在監聽,但是通過net.tcp,listen取值取到的卻是0。
  經過簡單的goole發現這已經是一個歷史悠久的問題:
  問題的根本原因是zabbix的這個key(net.tcp,listen)是通過讀取 /proc/net/tcp這個檔案來進行資料採集的,而/proc/下的檔案並不是執行緒安全的,因此會出現取值不準確的問題。
另外這種機制還存在另外一個隱患:當/proc/net/tcp檔案的條目非常多的話,就會造成取值慢的情況,因此就有可能造成取值失敗的問題。
 
     那我們該如果解決這個問題呢,網上也找到了解決辦法,我在這裡當一次大自然的搬運工~哈哈
解決方法就是新新增一個使用者自定義key來代替zabbix自己提供的監控方式,具體操作步驟如下:
 

#1,新增自定義key --> net.tcp.listen.grep[*]

新增方式,在zabbix客戶端的agentd的配置檔案中,或者在zabbix agentd所宣告的Include配置檔案目錄下新增如下配置:
UserParameter=net.tcp.listen.grep[*],grep -q $$(printf '%04X.00000000:0000.0A' $1) /proc/net/tcp && echo 1 || echo 0

  例如我的選在就是在/etc/zabbix/zabbix-agentd.conf.d目錄下,建立了一個檔案net_tcp_listen.conf,將上述key的宣告寫到檔案裡,因為我的zabbix_agentd.conf中已經做了配置檔案目錄包含的宣告:

thatsit:~ # grep ^Include /etc/zabbix/zabbix-agentd.conf
Include=/etc/zabbix/zabbix-agentd.conf.d/
thatsit:~ #
thatsit:~ # cat  /etc/zabbix/zabbix-agentd.conf.d/net_tcp_listen.conf
UserParameter=net.tcp.listen.grep[*],grep -q $$(printf '%04X.00000000:0000.0A' $1) /proc/net/tcp && echo 1 || echo 0
thatsit:~ #

#2,重啟zabbix-agentd,使配置生效 

shipeng:~ # /etc/init.d/zabbix-agentd restart
Shutting down zabbix agentd                                              done
Starting zabbix agentd                                                   done
shipeng:~ #

#3,使用zabbix_get進行測試

thatsit:~ # zabbix_get -s 192.168.3.154 -k "net.tcp.listen.grep[22]"
1
thatsit:~ # zabbix_get -s 192.168.3.154 -k "net.tcp.listen.grep[23]"
0
thatsit:~ #

#4,在web端,給指點的主機新增此監控項。

監控項的key即是:net.tcp.listen.grep[要監控的埠號]

#5,配置完成,排錯思路

至此配置已經完成,如果有問題,可以按照以下思路進行排查,一般的問題在日誌中都可以找到端倪。

# 排錯思路:
在新增在定義key的時候需要注意一下事項:
注意配置檔案或者自定義指令碼的屬主、屬組配置
如果用到了自定義的指令碼,注意新增執行許可權
如果需要執行自定義指令碼,還需要在zabbix_agentd.conf中開啟如下引數:
thatsit:~ # grep ^Unsafe /etc/zabbix/zabbix-agentd.conf
UnsafeUserParameters=1
thatsit:~ #
 
參考連結:

相關文章