zabbix 监控mysql 之low level discovery(自动获取mysql多实例)
Zabbix 监控Mysql 性能 , 默认模版只能监控 默认的3306端口或者个摸个固定端口 , 但是实际用途中 我们可能在一台服务器中启用的mysql 的多实例。 那么这个模板就有点麻烦了, 需要具有不同的mysql模板,然后在管理监控,很是麻烦,为了解决这个问题,我使用lld(low level discovery)方式监控mysql,只需要你在正则表达式里把需要监控的端口标上,就可以监控mysql多实例。
效果如图 :
如何实现:
一、客户端
1、监控内容的json化
在客户端里,需要把监控的内容json化展示,然后服务端可以通过正则来过滤出结果
下面在是我的json监控mysql的json展示
{
“data”:[
{
“{#MYSQLPORT}”:”3306″},
{
“{#MYSQLPORT}”:”3307″},
{
“{#MYSQLPORT}”:”5520″}
]
}
脚本内容如下:
cat mysql_low_discovery.sh
- #!/bin/bash
- #Fucation:mysql low-level discovery
- #Script_name mysql_low_discovery.sh
- mysql() {
- port=($(sudo netstat -tpln | awk -F “[ :]+” ‘/[m]ysql/ && /0.0.0.0/ {print $5}’))
- 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
OR
#Fucation:mysql low-level discovery
#Script_name mysql_low_discovery.sh
discovery() {
port=($(sudo netstat -tpln | awk -F “[ :]+” ‘/[m]ysql/ && /0.0.0.0/ {print $5}’))
#port=($(sudo netstat -tpln | awk -F “[ :]+” ‘/[m]ysql/ {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’
}
discovery
把此文件存放到你Zabbix安装的目录中的指定位置 例如 /etc/zabbix/scripts/ ,然后给与755权限,并修改用户与组为zabbix,同时允许zabbix用户无密码运行netstat
- echo “zabbix ALL=(root) NOPASSWD:/bin/netstat”>>/etc/sudoers#Disable requiretty
- sed -i ‘s/^Defaults.*.requiretty/#Defaults requiretty/’ /etc/sudoers
不关闭的话,会无法获取数据,并且zabbix日志里报
2、修改zabbix_agentd.conf文件
在zabbix_agentd.conf 最后添加以下内容
当然 你可以自定义 , Zabbix 默认加载 /etc/zabbix/zabbix_agentd.d/ 我这是yum 安装的 不管编译还是yum 都会有zabbix_agentd.d 目录这是默认加载的 我把下面的配置单独写了一些文件
- vim /etc/zabbix/zabbix_agentd.d/auto_mysql.conf
- UserParameter=zabbix_low_discovery[*],/bin/bash /etc/zabbix/shell/mysql_low_discovery.sh $1
- #UserParameter=zabbix_low_discovery[*],/bin/bash /etc/zabbix/shell/test_mysql.sh $1
- UserParameter=mysql_stats[*],mysql -h 127.0.0.1 -P $1 -uroot -pnewpass123123 -e “show global status”|grep -w “$2″|cut -f2
测试
如果你能通过 zabbix_get -s 127.0.0.1 -k zabbix_low_discovery[mysql]命令获取数据就代表没问题
{
“data”:[
{
“{#MYSQLPORT}”:”3306″},
{
“{#MYSQLPORT}”:”3307″},
{
“{#MYSQLPORT}”:”5520″}
]
}
3、mysql授权
Flush privileges;
4、重启zabbix服务
二、服务端
1、模板导入
把Template Mysql Auto Discovery导入到zabbix里 ,具体操作不介绍。
导入 Template Mysql Auto Discovery 模板
2、设置正则
在“管理”=》“一般”=》“正则表达式”里,选择“新的正则表达式”
然后设置类似如下
选择新建表达式后设置类似如下
添加完后 测试试试 , 返回真表示测试通过
3、主机关联模板
4 测试 可否取到mysql 值
zabbix_get -s 127.0.0.1 -k mysql_stats[3306,Key_reads]
319260
有返回值且不是报错 则表示可以获取