低級別自動發現簡稱LLD,使用低級別自動發現可以實現根據Agent的實際情況去自動創建監控項,適用于配置不一的環境。比如A主機有3塊硬盤,B主機有5塊硬盤,如果不使用LLD的話就需要人肉去為每個硬盤創建監控項。而有了LLD就可以實現自動創建每個硬盤的監控。
本文以監控多實例MySQL為例進行Zabbix低級別自動發現配置:
1、創建獲取每個MySQL實例端口的腳本。該腳本返回的數據必須是JSON格式,而且返回值需要設置為低級別發現宏的格式,如{#MYSQLPORT}:
vi /usr/local/shell/discovery_mysql.sh
#!/bin/bash
mysql() {
port=($(sudo netstat -tpln | awk -F "[ :]+" '/[m]ysql/' | awk -F: '{print $4}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
}
$1
#腳本運行結果
{
"data":[
{
"{#MYSQLPORT}":"3306"},
{
"{#MYSQLPORT}":"3307"},
{
"{#MYSQLPORT}":"3310"},
{
"{#MYSQLPORT}":"3311"}
]
}
2、創建兩個自定義key,第一個key就是使用上面的腳本來獲取MySQL多實例的端口信息,并傳給低級別發現宏。另一個腳本是用來獲取數據庫狀態。在后面設置中需要結合2個key來獲取每個實例的數據。
UserParameter=discovery_mysql[*],/usr/local/shell/discovery_mysql.sh $1
UserParameter=mysql_status[*],mysql -uroot -p123456 -P $1 -e "show global status"|grep "\"|cut -f2
3、在模板中創建自動發現規則,點擊Discovery rules-->Create discovery rule
4、在創建規則頁面填寫規則名稱和key,key一欄要寫的名字需要和第2步中UserParameter定義的一致,比如discovery_mysql,這樣Zabbix運行這個腳本時就會把運行結果賦值給宏。filter選項卡如果不需要進行過濾的話不用配置。
5、為低級別發現規則創建Item?prototypes(監控原形)。這里創建出來的key就會對每個發現出來的MySQL實例生效,比如創建了一個監控MySQL服務是否掛掉的key,這個key會生效于第4步中發現出來的所有端口。
6、最后使用2個key的組合來獲取數據。這里的Com_begin就是上面第二個key的$2
7、使用zabbix_get命令查詢是否能正常監控各個端口
zabbix_get -s 192.168.1.100 -k mysql.status[3306,Com_begin] #取3306端口
zabbix_get -s 192.168.1.100 -k mysql.status[3307,Com_begin] #取3307端口