agent上起了多了 mysql實例,占用不同的端口,agent 僅在初始狀況下,塞入腳本和 鍵配置,然后重啟。 以后維護的時候(mysql端口變動),要做到 不能 動agent,力爭 只在 web端 或者server端做修改 就能自動監控到對應端口。 |
主機宏格式:$MACRO (直接就可以 填 值) 自動發現宏:#MACRO (需要配合 創建的 key 取值)
1.agent主機 -- agent 主機創建 宏變量 $MYSQLPORT ,宏變量的值為 Discovery rules的 自動發現腳本參數
2.模板 -- 模板里創建自動發現規則,靠的是自動發現腳本,得到自動發現宏變量。
3.監控項-- 在Discovery rules 里創建監控項,監控項名稱和key值里都有自動發現宏變量,會自動生成相關端口的監控項
4.客戶端 腳本和鍵創建,來支持整個架構運行

因為這個模板是 克隆 的默認 mysql監控模板,可以忽略 items,triggers。 監控項都在 Discovery rules 里。

上圖 里的 mysql.discovery 就是獲取 自動發現宏的 腳本,腳本是放在 agent端。
后面的 $MYSQLPORT 為此腳本執行時帶的參數,$MYSQLPORT 是主機宏。
discovery rule 右邊的 filters 是過濾規則的意思,比方你 只想取腳本里的 某某 自動發現宏,就可以在里面設置。 這里就只有一個自動發現宏,所有不做 配置。


點開主機,添加主機宏,宏名稱是 自動發現腳本里的 參數, 宏的值就是 此 主機上需要監控的端口。
這樣就實現了 只要改動主機宏的 值,就可以改變主機宏的監控項。
res=`echo $1| sed "s/_/\n/g"`; port=($res) printf '{\n' printf '\t"data":[\n' for key in ${!port[@]} do if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]]; then printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n" else [[ "${key}" -eq "((${#port[@]}-1))" ]] printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n" fi done printf '\t ]\n' printf '}\n'
執行實例: 以_ 為分隔符,格式化輸出 自動發現宏
./discovery_mysql.sh 3306_3307_3308
{
"data":[
{
"{#MYSQLPORT}":"3306"}, { "{#MYSQLPORT}":"3307"}, { "{#MYSQLPORT}":"3308"} ] }
var=$1
MYSQL_PORT=$2 MYSQL_NAME=`ps -ef |grep '/mysql/app/bin/mysqld'| grep "$MYSQL_PORT" |grep -v grep | awk -F" " '{print $11}' |awk -F"/" '{print $2}'` ; MYSQL_SOCk_DIR="/$MYSQL_NAME/" ; df -h "${MYSQL_SOCk_DIR}${var}" |grep -v Filesystem |awk -F" " '{print $5}' | awk -F"%" '{print $1}' ;
MYSQL_PORT=$1;
[ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxxx mysqladmin=/mysql/app/bin/mysqladmin ; MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; ${mysqladmin} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} ping 2> /dev/null |grep 'alive'|wc -l ;
注意: 這邊連接實例 都是 mysql -u -p -S /xxx/mysql.sock
但是后來發現部分客戶端總是無法正確顯示值,而且就是這條 語句報錯, 感覺是環境變量的問題
所以拿 --socket=/xxx/mysql.sock 來代替 -S/xxx/mysql.sock 。 這里的變量${MYSQL_SOCk_DIR} 就是--socket=/xxx/mysql.sock 。
var=$1
MYSQL_PORT=$2 MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; mysql=/mysql/app/bin/mysql [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxx ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "show slave status\G;" 2> /dev/null |grep "\b${var}\b"|awk -F" " '{print $2}' ;
主從狀態 有幾個端口的值是 空的, 這個得 具體問題具體設置
mysql=/mysql/app/bin/mysql
var=$1
MYSQL_PORT=$2 [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxxx MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "show global status;" 2> /dev/null |grep -v Variable_name|grep "\b${var}\b"|awk '{print $2}' ;
發現有些監控項 或因為數字過長而無法顯示,待解決
MYSQL_PORT=$1;
MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; mysql=/mysql/app/bin/mysql ; [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxx ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "select version();" 2> /dev/null |awk 'END {print}'
UserParameter=mysql.discovery[*],/patrol/zabbix/bin/duoshili_discovery/discovery_mysql.sh $1 UserParameter=mysql.status_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_status2 $1 $2 UserParameter=mysql.ping_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_ping.sh $1 UserParameter=mysql.version_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_version.sh $1 UserParameter=mysqlcheck_repl[*],/patrol/zabbix/bin/duoshili_discovery/mysql_repl.sh $1 $2 UserParameter=mysql.filestyle_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_filestype