0
0
0
0
专栏/.../

Zabbix agent2 自定义SQL监控和告警实施指南:针对TiDB数据库

 yangzhj  发表于  2025-01-14

文章背景

客户有自定义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 执行结果,符合预期

图示如下:

查看触发器状态,告警已经恢复。

图示如下:

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论