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