作者: yangzhj 原文来源:https://tidb.net/blog/70f2d854
文章背景
客户有自定义 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-certificatewget 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.rpmrpm -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/sqlcd /etc/zabbix/mysql/sql#创建 测试自定义sqlvi 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 agent2systemctl 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 执行结果, 符合预期
图示如下:
查看触发器状态,告警已经恢复。
图示如下:
评论