1. 程式人生 > 其它 >zabbix自定義監控postgresql死亡元組,shell指令碼比較小數位,shell指令碼統計時間精確毫秒

zabbix自定義監控postgresql死亡元組,shell指令碼比較小數位,shell指令碼統計時間精確毫秒

[參考連結] https://www.cnblogs.com/zhenglisai/p/6547402.html

說明:

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

[查詢死亡元組參考連結] https://blog.csdn.net/yang_z_1/article/details/115716901
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查詢的截圖

2、修改zabbix_agentd.conf配置檔案

  第一個:預設為0,此處我們將它改為1,改為1以後,表示使用者自定義的指令碼中可以包含特殊字元。

  第二個:為我們自定義監控項,格式為:UserParameter=<鍵值>,<命令>。這裡我們自定義鍵值為:=stations_hyz,要執行的命令為執行=stations_hyz.sh這個指令碼。

  說明:新增完成以後,重啟zabbix_agentd才會生效。我這裡添加了多個監控項,你們看需求新增。

3、zabbix服務端選擇要增加監控項的主機

(1)建立模板以及應用集

(2)建立監控項

根據自定義鍵值填寫監控項,自定義的鍵值只能手動輸入,不能通過選擇。

以下為具體的監控項配置內容:

(3) 建立觸發器

以下是觸發器具體內容:

在表示式裡面選擇監控項,並設定監控值為0還是1報警,

(4)新增成功後,在最新資料中檢視是否獲取到資料

正常獲取

手機簡訊模擬測試截圖:

至此,自定義監控項和自定義告警已新增完成,如果有其他監控需求,自己寫監控指令碼即可。

4、shell指令碼小數計算,shell指令碼統計執行時間

[小數計算參考連結] https://blog.csdn.net/m0_37549390/article/details/86552116?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&amp;depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control [時間統計計算] https://www.cnblogs.com/hencins/p/12273259.html

其中一個指令碼是需要統計時間的,比如執行一個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對接簡訊配置。