zabbix haproxy 監控


摘自:

http://www.tuicool.com/articles/JrYNNrm

寫的非常好,步步緊逼,環環相扣。直到成功!

文章首發站點:OpensGalaxy

這是一個HAProxy的zabbix監控模板,HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy本身提供一個web頁面可以顯示haproxy的各種信息,方便管理員查看系統狀態等。此次我采用socat(socat是netcat的擴展實現)這款開源軟件通過haproxy的socks配合zabbix實現haproxy系統的狀態監控。

一、安裝socat

[root@haproxy01 ~]# wget http://www.dest-unreach.org/socat/download/socat-1.7.3.0.tar.bz2
[root@haproxy01 ~]# tar xzf socat-1.7.3.0.tar.gz [root@haproxy01 ~]# cd socat-1.7.3.0 [root@haproxy01 ~]# ./configure [root@haproxy01 ~]# make [root@haproxy01 ~]# make install [root@haproxy01 ~]# which socat ###安裝完自動會在/usr/local/bin 創建執行程序。 /usr/local/bin/socat

二、開啟haproxy sock

編輯haproxy配置文件在global下添加如下:

global
    stats socket    /usr/local/haproxy/haproxy.sock # 重啟haproxy

Haproxy 信息

[root@haproxy01 ~]# echo "show info" |socat /usr/local/haproxy/haproxy.sock stdio
Name: HAProxy Version: 1.4.24 Release_date: 2013/06/17 Nbproc: 1 Process_num: 1 Pid: 3499 Uptime: 2d 1h00m47s Uptime_sec: 176447 Memmax_MB: 0 Ulimit-n: 131102 Maxsock: 131102 Maxconn: 65535 Maxpipes: 0 CurrConns: 18 PipesUsed: 0 PipesFree: 0 Tasks: 34 Run_queue: 1 node: HAProxy01 description: haproxy server 01

Haproxy 狀態

[root@CMHAProxy01 ~]# echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio
# pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,admin_stats,FRONTEND,,,0,1,2000,2918,1779980,133971311,0,0,0,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,1,,,,0,2918,0,0,0,0,,0,1,2918,,, admin_stats,BACKEND,0,0,0,0,2000,0,1779980,133971311,0,0,,0,0,0,0,UP,0,0,0,,0,176433,0,,1,1,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0, test,FRONTEND,,,0,2,2000,5402,1267880,26563174,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,3,,,,0,5402,0,0,0,0,,0,3,5402,,, test,test1,0,0,0,1,,2701,632860,13110551,,0,,0,0,0,0,UP,3,1,0,1,0,176433,0,,1,2,1,,2701,,2,0,,2,L7OK,200,3,0,2701,0,0,0,0,0,,,,0,1, test,test2,0,0,0,1,,2701,635020,13452623,,0,,0,0,0,0,UP,3,1,0,0,0,176433,0,,1,2,2,,2700,,2,0,,2,L7OK,200,3,0,2701,0,0,0,0,0,,,,0,0, test,BACKEND,0,0,0,2,2000,5402,1267880,26563174,0,0,,0,0,0,0,UP,6,2,0,,0,176433,0,,1,2,0,,5401,,1,0,,3,,,,0,5402,0,0,0,0,,,,,0,1,

看到這里大家都明白了,我們可以通過“show stat”返回的信息,過濾出我們想要得到的監控字段數據。這里我們主要取qcur(queue數量)、scur(session數量)、bin(入站流量)、bout(出站流量)、status(后端服務器狀態)、downtime(宕機總時長)、check_status(健康檢測狀態),自定義key收集這些數據制作相應的item,如果你想監控更多信息可以取更多的字段數據。

大家看到這些字段數據使用”,”分隔,非常方便我們用awk來過濾數據,具體自定義key見代碼。首先,我們需要建立一個HAProxy模版,然后建立發現規則,來發現這些后端服務器,這樣每次haproxy添加服務的時候,zabbix就會自動發現這些后端服務器、自動建立item、自動建立Graph、自動建立Trigger,一切全部自動完成。

三、Step by Step

1、建立一個haproxy模版

2、建立發現規則

key shell如下:(這里有一點需要注意,就是haproxy.sock這個文件的權限問題,默認是644,單純執行這個shell沒問題,但如果需要zabbix用戶去獲取返回值的時候就會提示權限不足,所以我直接將haproxy.sock設置成了666,也可以設置visudo,我為了方便直接修改了這個文件權限)

[root@haproxy01 ~]# cat /usr/bin/has.discovery.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin printf '{\n' printf '\t"data":[\n' export LINE=$(echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep -v "^#"|grep -v "^admin_stats"|awk -F "," '{print $2}'|grep -v "^FRONTEND"|grep -v "^BACKEND"|grep -v "^$"|wc -l) ##(這里我過濾調admin_stats web管理台、FRONTEND前端、BACKEND后端 得到的是所有后端服務器的列表) export N=0 #printf '\t\t{\n' for i in $(echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep -v "^#"|grep -v "^admin_stats"|awk -F "," '{print $2}'|grep -v "^FRONTEND"|grep -v "^BACKEND"); do printf "\t\t\t{\"{#SNAME}\":\"$i\"}"; N=$(($N+1)) if [ $N -eq $LINE ]; ## 最后一行是不能加","的,所以需要if判斷一下是否到了最后一行。 then printf '\n' else printf ',\n' fi done; printf ']}\n'

執行結果如下:(zabbix的發現規則就是要返回json格式的數據)

[root@haproxy01 haproxy]# sh /usr/bin/has.discovery.sh 
{
    "data":[ {"{#SNAME}":"test1"}, {"{#SNAME}":"test2"}, {"{#SNAME}":"testapi1"}, {"{#SNAME}":"test51"}, {"{#SNAME}":"test52"}, {"{#SNAME}":"testclient1"}, {"{#SNAME}":"testclient2"}, {"{#SNAME}":"testmobile1"}, {"{#SNAME}":"testmobile2"} ]}

3、建立自定義key

+ Queue數量[qcur]

key shell如下:

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.queue.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $3}' ## 重點就是通過awk取哪個字段的數據

+ Session數量[scur]

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.session.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $5}'

+ 虛擬服務器入站流量[bin]

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.bin.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $9}'

+ 虛擬服務器出站流量[bout]

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.bout.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $10}'

+ 后端服務器狀態[status]

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.status.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $18}'

+ 宕機總時長[downtime]

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.downtime.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $25}'

+ 健康檢測狀態[check_status]

[root@haproxy01 haproxy]# cat /usr/bin/ckey.ha.lastchk.sh 
#!/bin/bash export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin echo "show stat" |socat /usr/local/haproxy/haproxy.sock stdio|grep "\<$1\>"|grep -v "^FRONTEND"|grep -v "^BACKEND"|awk -F "," '{print $38}'

+ 定義key

[root@haproxy01 haproxy]# cat /etc/zabbix/zabbix_agentd.d/HaProxy_status.conf UserParameter=has.discovery,/usr/bin/has.discovery.sh UserParameter=ckey.ha.bin[*],/usr/bin/ckey.ha.bin.sh $1 UserParameter=ckey.ha.bout[*],/usr/bin/ckey.ha.bout.sh $1 UserParameter=ckey.ha.downtime[*],/usr/bin/ckey.ha.downtime.sh $1 UserParameter=ckey.ha.lastchk[*],/usr/bin/ckey.ha.lastchk.sh $1 UserParameter=ckey.ha.queue[*],/usr/bin/ckey.ha.queue.sh $1 UserParameter=ckey.ha.session[*],/usr/bin/ckey.ha.session.sh $1 UserParameter=ckey.ha.status[*],/usr/bin/ckey.ha.status.sh $1

重啟zabbix-agent

+ 驗證一下:

[root@zabbixproxy01 ~]# zabbix_get -s 192.168.1.100 -k has.discovery
{
    "data":[ {"{#SNAME}":"test1"}, {"{#SNAME}":"test2"}, {"{#SNAME}":"testapi1"}, {"{#SNAME}":"test51"}, {"{#SNAME}":"test52"}, {"{#SNAME}":"testclient1"}, {"{#SNAME}":"testclient2"}, {"{#SNAME}":"testmobile1"}, {"{#SNAME}":"testmobile2"} ]} [root@zabbixproxy01 ~]# zabbix_get -s 192.168.1.100 -k ckey.ha.status[test1] UP

其余的key驗證效果大同小異,這里就不浪費篇幅一一列舉了。

4、創建Graph prototypes

+ 網絡流量圖

+ Session

+ 健康檢測狀態

+ 宕機總時間

生成的Graphs效果圖

5、創建Trigger prototypes

+ inbound網絡流量最近5分鍾內超過2Mbps

+ outbound網絡流量最近5分鍾內超過2Mbps

+ 后端服務器健康檢測異常

+ 后端服務器宕機

這里設置一下依賴,因為服務器是否宕機依賴於健康檢測狀態

到此為止,全套的Haproxy監控模版就設置完成了,你可以根據你實際的需求做調整,總之這只是一個實現思路。

key shell和導出的模版下載地址如下:

自定義key shell

導出的haproxy模版

大家也可以訪問我的github https://github.com/EdisonWujr/zabbix-templates


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM