文章背景
客户有自定义sql 监控告警的需求,该需求需要在TiDB 数据库内执行 自定义的sql ,然后将sql 执行结果作为告警消息进行推送。因为当前客户采用Zabbix 6.0.28做为统一的告警服务平台,因此需要优先考虑Zabbix 是否有相关的组件或插件满足需求。
经查询官网,Zabbix agent2 插件通过自定义配置 mysql.custom.query来支持上述需求,该配置要求Zabbix 最低版本为 6.0.21。
该插件的相关参考链接如下:
https://www.zabbix.com/documentation/6.0/zh/manual/appendix/config/zabbix_agent2
https://www.zabbix.com/documentation/6.0/en/manual/config/items/itemtypes/zabbix_agent/zabbix_agent2#mysql
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/src/go/plugins/mysql
实施步骤
实施的环境相关信息:Zabbix 6.2 + CentOS Linux release 7.6+TiDB 6.5.7。
以下是整个实施步骤。
Zabbix agent2 端安装配置
下载和安装 Zabbix agent2
使用如下链接下载 Zabbix agent2及相关软件包:
#查看主机操作系统版本
cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
cd /opt
#下载依赖包
wget https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-plugin-postgresql-6.0.28-release1.el7.x86_64.rpm --no-check-certificate
wget https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-plugin-mongodb-6.0.28-release1.el7.x86_64.rpm --no-check-certificate
#下载zabbix-agent2软件包
wget https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.28-release1.el7.x86_64.rpm --no-check-certificate
#安装依赖包
rpm -ivh zabbix-agent2-plugin-mongodb-6.0.28-release1.el7.x86_64.rpm
rpm -ivh zabbix-agent2-plugin-postgresql-6.0.28-release1.el7.x86_64.rpm
#安装缺失依赖包,不同的操作系统,缺失依赖包可能不同
yum install pcre2
#安装zabbix-agent2软件包
rpm -ivh zabbix-agent2-6.0.28-release1.el7.x86_64.rpm
配置Zabbix agent2
修改配置文件 /etc/zabbix/zabbix_agent2.conf 如下内容,并保存:
#以下参数的值为zabbix server地址
Server=xx.x.xxx.230
配置Zabbix agent2 mysql插件
修改配置文件 /etc/zabbix/zabbix_agent2.d/plugins.d/mysql.conf 如下内容,并保存:
Plugins.Mysql.CustomQueriesPath=/etc/zabbix/mysql/sql
配置自定义sql 文件
特殊说明:
因在zabbix server 端配置了预处理,因此所有的自定义sql 文件中的sql语句要求查询中必须带有
GROUP_CONCAT函数,且结果列别名必须为data,具体见示例sql。
#创建保存自定义sql文件的目录
mkdir -p /etc/zabbix/mysql/sql
cd /etc/zabbix/mysql/sql
#创建 测试自定义sql
vi long_sql.sql
#写入如下内容,并保存
SELECT GROUP_CONCAT(CONCAT_WS('_',INSTANCE,ID,USER,DB,COMMAND,DIGEST,TxnStart,TIME) ,'\n')as data FROM information_schema.cluster_processlist where COMMAND <>'Sleep' and TIME > ?
启动Zabbix agent2
#启动Zabbix agent2
systemctl start zabbix-agent2
#查看服务状态
systemctl status zabbix-agent2
● zabbix-agent2.service - Zabbix Agent 2
Loaded: loaded (/usr/lib/systemd/system/zabbix-agent2.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2025-01-13 16:49:50 CST; 7s ago
Main PID: 3522619 (zabbix_agent2)
Tasks: 8
Memory: 3.4M
CGroup: /system.slice/zabbix-agent2.service
└─3522619 /usr/sbin/zabbix_agent2 -c /etc/zabbix/zabbix_agent2.conf
Zabbix服务端配置
添加主机
主机添加监控项
监控项创建时需要按照一定的格式配置监控项的键值,键值格式和内容如下:
mysql.custom.query[tidb主机:端口,只读账户,账户密码,自定义sql文件名(无文件名后缀),SQL变量值]
只读账户需预先创建,并且有自定义sql 的执行权限,用户创建及授权不再赘述。
图例如下:
监控项添加预处理
图例如下:
函数内容如下:
/**
* get_result 函数说明
* 解析输入的 JSON 字符串,并根据解析结果返回特定值。
*
* 如果解析后的数组非空且第一个元素的 data 属性为空字符串,则返回 'ok'。
* 如果解析后的数组非空且第一个元素的 data 属性非空字符串,则返回该 data 属性值。
* 如果解析后的数组为空,则返回 'ok'。
*
* @param {string} input_str - 输入的 JSON 字符串,预期是一个数组的 JSON 表示。
* @returns {string|any} - 根据上述条件返回 'ok' 或数组第一个元素的 data 属性值。
*/
function get_result(input_str) {
var json_output = JSON.parse(input_str);
var result_str = json_output;
var result_value;
if (result_str.length > 0) {
result_value = String(result_str[0].data) === '' ? 'ok' : result_str[0].data;
} else {
result_value = 'ok';
}
return result_value;
}
return get_result(value);
主机添加触发器
图示如下:
验证告警
验证告警触发
登陆数据库,执行验证sql:
mysql> select sleep(200);
查看监控项最新数据,显示sql 执行结果,符合预期
图示如下:
查看触发器状态,已经触发告警。
图示如下:
验证告警恢复
等待select sleep(200)执行完成:
查看监控项最新数据,显示sql 执行结果,符合预期
图示如下:
查看触发器状态,告警已经恢复。
图示如下: