目錄
前言:
1、線上業務使用了幾十上百台haproxy服務,需要針對這些服務做監控(包含haproxy端口對應的TCP連接數監控,haproxy服務監控等)。
2、普通的在zabbix_agentd.conf里面配置"UserParameter"的方式太繁瑣,這里使用建表(收集數據,匯總數據)的方式。
3、將數據匯總到表里面,通過第三方腳本對數據做一個處理,拿到處理結果並監控。
創建數據表(收集haproxy服務的信息)
-
在zabbix_DB上創建表:t_3party_server
create table t_3party_server(
app varchar(64) NOT NULL,
server varchar(64) NOT NULL,
division varchar(64) NOT NULL,
node varchar(64) NOT NULL,
port varchar(64) NOT NULL,
remark int(10) unsigned NOT NULL,
PRIMARY KEY (app,server,division,node,port)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注釋:
app #這里寫的是項目名稱(MM項目)
server #服務名稱(haproxy服務)
division #由於起了多個haproxy實例,名稱也不一樣,所以這里做了區分
node #haproxy服務IP地址
port #haproxy服務端口,多個實例端口不同
remark #備注作用(由於線上某些haproxy服務安裝路徑不一致,所以此處用來區分路徑,也可以區分其他)
PRIMARY KEY (app,server,division,node,port) #添加主鍵
-
執行完畢之后查看表結構
-
然后往數據表里面插入數據:
insert into t_3party_server(app,server,division,node,port,remark) values('MM','haproxy','haproxy-login','192.168.32.128','30000','0');
-
最終表格效果
針對生成的數據表做監控
監控腳本:放在zabbix_server下 "/install_path/zabbix_server/share/zabbix/externalscripts"
<?php
if ($_SERVER["argc"] != 2) {
echo "Usage: " . $_SERVER["argv"][0] . " host\n";
return;
}
$host = $_SERVER["argv"][1];
$mysqlconn = new mysqli("localhost", "root", "123", "zabbix", 3306);
if (mysqli_connect_errno()) {
echo "fail to connect mysql: " . mysqli_connect_error() . "\n";
return;
}
$result = $mysqlconn->query("SELECT * FROM t_3party_server WHERE node=\"" . $mysqlconn->real_escape_string($host) . "\"");
$hostvalue = array(
"data" => array()
);
while ($row = $result->fetch_assoc()) {
$app = $row["app"];
$server = $row["server"];
$division = $row["division"];
$node = $row["node"];
$port = $row["port"];
$remark = $row["remark"];
if ($remark == "/usr/local")
{
$hostvalue["data"][] = array(
"{#APP}" => $app,
"{#SERVER}" => $server,
"{#DIVISION}" => $division,
"{#PORT}" => $port,
"{#PATH}" => "/usr/local/" . $division . "/sbin",
);
continue;
}
$server = substr($server, 0, 15);
$hostvalue["data"][] = array(
"{#APP}" => $app,
"{#SERVER}" => $server,
"{#DIVISION}" => $division,
"{#PORT}" => $port,
"{#PATH}" => "/data/app/" . $division . "/sbin",
#"{#MFW_PATH}" => "/data/app/" . $division . "/" . ($division ? $division . "/" : "") . $server,
);
}
echo json_encode($hostvalue);
echo "\n";
腳本生成的數據:
[root@localhost externalscripts]# ./haproxy_discovery.php 192.168.32.128
{"data":[{"{#APP}":"MM","{#SERVER}":"haproxy","{#DIVISION}":"haproxy-login","{#PORT}":"30000","{#PATH}":"\/data\/app\/haproxy-login\/sbin"}]}
轉換的json格式如下:
{
"data":[
{
"{#APP}":"MM",
"{#SERVER}":"haproxy",
"{#DIVISION}":"haproxy-login",
"{#PORT}":"30000",
"{#PATH}":"/data/app/haproxy-login/sbin"
}
]
}
在haproxy服務機器上配置
1、配置:zabbix_agentd.conf
#用來監控TCP連接數
UserParameter=haproxy.tcp.[*],/usr/sbin/ss -ant sport eq :"$1" | awk 'NR>1{++s[$$1]} END {for(k in s){print k,s[k]}}' |grep -w "ESTAB" |awk '{print $$2}'
配置完成后重啟zabbix_agentd
在zabbix上添加監控
創建模板-->自動發現規則
定義宏變量:宏的值為json導出后的值
Item1:檢查haproxy進程是否存在
Key:proc.num["{#SERVER}",,,"{#PATH}"]
Trigger1:對應Item1
{customize template:proc.num["{#SERVER}",,,"{#PATH}"].last()}<1
Item2:檢查haproxy端口對應的TCP連接數
Key:haproxy.tcp.[{#PORT}]
Trigger2:對應Item2
{Template moba server:haproxy.tcp.[{#PORT}].last()}>40000
之后新增haproxy服務添加到監控的流程如下
1、在zabbixDB上的t_3party_server表里添加數據:
INSERT INTO `zabbix`.`t_3party_server` (`app`, `server`, `division`, `node`, `port`, `remark`) VALUES ('MM', 'haproxy', 'haproxy', '192.168.32.128', '30000', '0');
2、在機器上添加配置參數:
vim /data/app/zabbix_agent/etc/zabbix_agentd.conf
#Haproxy
UserParameter=haproxy.tcp.[*],/usr/sbin/ss -ant sport eq :"$1" | awk 'NR>1{++s[$$1]} END {for(k in s){print k,s[k]}}' |grep -w "ESTAB" |awk '{print $$2}'
3、配置完畢后重啟 zabbix_agentd
pkill zabbix_agentd
/data/app/zabbix_agent/sbin/zabbix_agentd
4、到zabbix上監控haproxy服務是否被監控