zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

 

 

 

 

说明:

zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,这里介绍一种自定义监控项的方式。

 

背景:

postgresql有表的死亡元组一旦过高就会导致表膨胀影响使用,需要监控这值然后清理

 

1、首先编写自定义监控脚本

  脚本名字:stations_hyz.sh

  脚本目录(这个目录可以自定义):/etc/zabbix/zabbix_agentd.d/autovacuum_zabbix/

  脚本内容:

cat stations_hyz.sh
?
?
#!/bin/bash
stations_hyz=`sudo -u postgres psql -U postgres -d hdsc_db -a -f /etc/zabbix/zabbix_agentd.d/autovacuum_zabbix/autovacuum.sql | grep stations_info_cache | awk -F ‘|‘ ‘{print $4}‘ | awk ‘{print $1}‘`
?
if [ $stations_hyz -gt 100000 ];then   ##将sql查询的值比对是否大于阈值10w
  echo ‘1‘                             ###也就是大于10w返回1给zabbix服务端告警
else                                     ###正常返回0给zabbix服务端
  echo ‘0‘
fi
?

 脚本说明:通过指定加载命令文件查询过滤筛选指定值并判断阈值,如果大于阈值则脚本反馈1,如果小于则返回0。你们有需要可以针对性修改获取的值,懂得原理即可。

 

下面这个是数据库查询死亡元组的命令,上面已经命名autovacuum.sql

cat autovacuum.sql
?
?
?
SELECT
  c.relname 表名,
  (current_setting(‘autovacuum_analyze_threshold‘)::NUMERIC(12,4))+(current_setting(‘autovacuum_analyze_scale_factor‘)::NUMERIC(12,4))*reltuples AS 自动分析阈
值,
  (current_setting(‘autovacuum_vacuum_threshold‘)::NUMERIC(12,4))+(current_setting(‘autovacuum_vacuum_scale_factor‘)::NUMERIC(12,4))*reltuples AS 自动清理阈值
,
  reltuples::DECIMAL(19,0) 活元组数,
  n_dead_tup::DECIMAL(19,0) 死元组数
FROM
  pg_class c
LEFT JOIN pg_stat_all_tables d
  ON C.relname = d.relname
WHERE
              reltuples > 0
  AND n_dead_tup > (current_setting(‘autovacuum_analyze_threshold‘)::NUMERIC(12,4))+(current_setting(‘autovacuum_analyze_scale_factor‘)::NUMERIC(12,4))*reltuples;

 

以下是使用Navicat Premium查询的截图

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

2、修改zabbix_agentd.conf配置文件

  第一个:默认为0,此处我们将它改为1,改为1以后,表示用户自定义的脚本中可以包含特殊字符。

  第二个:为我们自定义监控项,格式为:UserParameter=<键值>,<命令>。这里我们自定义键值为:=stations_hyz,要执行的命令为执行=stations_hyz.sh这个脚本。

  说明:添加完成以后,重启zabbix_agentd才会生效。我这里添加了多个监控项,你们看需求添加。

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

3、zabbix服务端选择要增加监控项的主机

(1)创建模板以及应用集

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

(2)创建监控项

根据自定义键值填写监控项,自定义的键值只能手动输入,不能通过选择。

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

以下为具体的监控项配置内容:

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

 

(3) 创建触发器

 

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

以下是触发器具体内容:

在表达式里面选择监控项,并设置监控值为0还是1报警,

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

(4)添加成功后,在最新数据中查看是否获取到数据

正常获取

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

手机短信模拟测试截图:

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

 

至此,自定义监控项和自定义告警已添加完成,如果有其他监控需求,自己写监控脚本即可。

 

 

 

4、shell脚本小数计算,shell脚本统计执行时间

 

其中一个脚本是需要统计时间的,比如执行一个sql语句超过2s代表为异常,自定义的监控值啊不要杠。

间接的使用脚本执行启动和结束时间相减得出这个执行sql语句话费的时间。

因为需要经确到毫秒,所以需要比对大小,大于2秒返回值:

 

#!/bin/bash
?
?
startTime_s=`date +%S.%N | cut -b 1-5`   ###sql语句查询启动时间,筛选小数点后两位
?
stations_info=`sudo -u postgres psql -U postgres -d hdsc_db -a -f /etc/zabbix/zabbix_agentd.d/autovacuum_zabbix/connector_time.sql | tail -3 | head -1 | awk ‘{print $1}‘`   ###调用sql语句查询命令
?

endTime_s=`date +%S.%N | cut -b 1-5`   ###sql语句查询结束时间,筛选小数点后两位
sumTime=`awk ‘BEGIN{print "‘$endTime_s‘" - "‘$startTime_s‘"}‘`
####得出花费sql语句查耗时
expr $sumTime \> 2.00   ###sql语句查询耗时大于2.00s返回1,否则返回0
?

 

具体对应的zabbix和服务端配置都已经和上面类似一致,不再赘述,以及不详解zabbix对接短信配置。

zabbix自定义监控postgresql死亡元组,shell脚本比较小数位,shell脚本统计时间精确毫秒

上一篇:node+mysql8.0的报错问题


下一篇:记一次postgresql的归档日志爆仓磁盘处理