Zabbix监控Haproxy的状态

生产环境中有HAproxy服务器,虽然HAproxy可以通过配置statas页面监控HAproxy的状态,但还是希望能集中在Zabbix中监控。因为Zabbix并没有自带的HAproxy监控模板,所以只能自定义监控项去监控HAproxy。

zabbix客户端

HAproxy提供了另一种方法——通过socket来显示HAproxy的状态。通过修改配置文件haproxy.cfg开启socket文件并开放权限为666,如下所示。

# vim /etc/haproxy/haproxy.cfg

global
    log        127.0.0.1 local0
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     30000
    user        haproxy
    group       haproxy
    daemon
    tune.bufsize 128000
    stats socket /var/run/haproxy/info.sock mode 666 level user
    tune.ssl.default-dh-param 2048
...

# systemctl restart Haproxy

除之外,还要为/var/tmp/haproxy_stats.cache.lock、/var/tmp/haproxy_stats.cache开放zabbix用户的rwx权限

  setfacl -m u:zabbix:rwx /var/tmp/haproxy_stats.cache.lock
  setfacl -m u:zabbix:rwx /var/tmp/haproxy_stats.cache

首先我们看下通过socket文件我们能看到什么信息

echo "show stat"|socat /var/run/haproxy/info.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,

以下是部分属性的解释

pxname 组名
svname 服务器名
qcur 当前队列
qmax 最大队列
scur当前会话用户
smax最大会话用户
slim会话限制
stot会话总量
bin入口流量
bout出口流量
dreq拒绝的请求
dresp拒绝的响应
ereq错误请求
econ错误链接
eresp错误响应
wretr警告重试次数
wredis
status服务器状态
weight权重
act是否活动Y/N
bck备用
chkfail检查宕机0
chkdown检查宕机0
lastchg最后检查
downtime宕机时间
qlimit队列限制

通过socket的输出,我们可以很清晰地看出每个属性都用" , "隔开了,我们只需要通过awk就能提取出我们想要的数据。
HAproxy中有frontend、backend、server三种角色,我们可以通过socket看到这三种角色的状态信息,可以通过以下脚本获得每个这三种角色的名称

# vim /usr/local/bin/haproxy_discovery.sh 

HAPROXY_SOCK="/var/run/haproxy/info.sock"
[ -n "$1" ] && echo $1 | grep -q ^/ && HAPROXY_SOCK="$(echo $1 | tr -d '\040\011\012\015')"

then
    HAPROXY_STATS_IP="$1"
    QUERYING_METHOD="TCP"
fi

QUERYING_METHOD="${QUERYING_METHOD:-SOCKET}"

query_stats() {
    if [[ ${QUERYING_METHOD} == "SOCKET" ]]; then
        echo "show stat" | socat ${HAPROXY_SOCK} stdio 2>/dev/null
    elif [[ ${QUERYING_METHOD} == "TCP" ]]; then
        echo "show stat" | nc ${HAPROXY_STATS_IP//:/ } 2>/dev/null
    fi
}

get_stats() {
        echo "$(query_stats)" | grep -v "^#"
}

[ -n "$2" ] && shift 1
case $1 in
        B*) END="BACKEND" ;;
        F*) END="FRONTEND" ;;
        S*)
                for backend in $(get_stats | grep BACKEND | cut -d, -f1 | uniq); do
                        for server in $(get_stats | grep "^${backend}," | grep -v BACKEND | cut -d, -f2); do
                                serverlist="$serverlist,\n"'\t\t{\n\t\t\t"{#BACKEND_NAME}":"'$backend'",\n\t\t\t"{#SERVER_NAME}":"'$server'"}'
                        done
                done
                echo -e '{\n\t"data":[\n'${serverlist#,}']}'
                exit 0
        ;;
        *) END="FRONTEND" ;;
esac

for frontend in $(get_stats | grep "$END" | cut -d, -f1 | uniq); do
    felist="$felist,\n"'\t\t{\n\t\t\t"{#'${END}'_NAME}":"'$frontend'"}'
done
echo -e '{\n\t"data":[\n'${felist#,}']}'

编写提取数据的脚本,以下脚本我只提取了backend和server的部分状态信息

# vim  /usr/local/bin/zabbix_haproxy.sh 
#!/bin/bash
sock="/var/run/haproxy/info.sock"
case $2 in
#backend入口流量
backendbin)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $9}';;
#backend出口流量
backendbout)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $10}';;
#backend当前队列
backendqcur)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $3}';;
#backend最大当前队列
backendqmax)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $4}';;
#backend当前会话用户
backendscur)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $5}';;
#backend最大当前会话用户
backendsmax)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $6}';;
#backend最大当前会话用户限制
backendslimit)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $7}';;
#backend会话总数
backendstotal)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $8}';;
#backend状态
backendstatus)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$1==var && $2=="BACKEND"{print $18}';;


#server入口流量
serverbin)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $9}';;
#server出口流量
serverbout)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $10}';;
#server当前队列
serverqcur)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $3}';;
#server最大当前队列
serverqmax)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $4}';;
#server当前会话用户
serverscur)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $5}';;
#server最大当前会话用户
serversmax)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $6}';;
#server最大当前会话用户限制
serverslimit)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $7}';;
#server会话总数
serverstotal)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $8}';;
#server状态
serverstatus)
    echo "show stat"|socat $sock stdio| awk -F, -v var=$1 '$2==var{print $18}'

这两个脚本放到/usr/local/bin/下,并赋予执行权限

-rwxr-xr-x. 1 root root    1920 Apr 19 18:14 haproxy_discovery.sh
-rwxr-xr-x. 1 root root    2281 Apr 21 11:28 zabbix_haproxy.sh

在/etc/zabbix/zabbix_agent.d/目录下创建一个自定义key文件userparameter_haproxy.conf,然后重启zabbix-agent服务

# vim /etc/zabbix/zabbix_agentd.d/userparameter_haproxy.conf 
...
# HAProxy Frontend, Backend and Server Discovery rules
UserParameter=haproxy.list.discovery[*],/usr/local/bin/haproxy_discovery.sh $1 $2
# support legacy way
UserParameter=haproxy.stat.qcur[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.qmax[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.scur[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.smax[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.slim[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.bin[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.bout[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.status[*],/usr/local/bin/zabbix_haproxy.sh $1 $2
UserParameter=haproxy.stat.stotal[*],/usr/local/bin/zabbix_haproxy.sh $1 $2

# systemctl restart zabbix-agent

zabbix服务端

创建模板

定义模板

定义模板宏

创建应用集

创建server自动发现规则

创建backend自动发现规则

创建backend监控项原型

创建server监控项原型

创建触发器

创建完监控模板,在主机上直接调用这个模板就可以了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336