【江楓】用Perl的hash陣列實現個性化監控
對於DBA來說,一個準確穩定的監控系統,不啻於一柄尚方寶劍。幾十上百套系統,如果每天都靠人工來檢查,工作量之大無法想象,而且人工也無法做到實時捕獲錯誤。
但是這麼多資料庫系統,每個庫承載的壓力不一樣,對於整個系統的重要度也不一樣,負責的DBA也不可能是同一個人。如果都按同樣的KPI同樣的門限來做監控,則有些重要的系統可能無法準確的告警,有些不重要的系統卻又會頻繁誤報。
比如系統的load,有些核心庫由於採用了比較高階的硬體,即使一直在20~30左右都是正常的,而一些邊緣的庫則可能超過5就比較危險了,所以對於load,不同的庫必須設定不同的檢查門限。
如果要通過shell指令碼來實現這個需求,可能需要寫一堆的if或者case判斷,一旦要做配置變更就十分的頭疼。不過perl的hash陣列可以很好的解決這個問題。
#!/usr/bin/perl -w
# creator: jiangfeng
############################################################
use strict;
# 配置各主機各KPI的檢查門限
# 這裡配置了兩個門限值,達到第一個值發IM提醒,達到第二個值發手機簡訊
# server, load1 load2
my %cutoff=("db1", [ 30, 40 ],
"db2", [ 20, 35 ],
"db3", [ 10, 18 ]
);
# 配置各個門限值的陣列中的位置,這樣在以後即使修改門限的位置,也不需要修改功能程式碼
# 將配置和功能分開,將極大的簡化後續維護工作
my ($load1,$load2)=(0,1);
############################################################
# 檢查load的函式
sub check_load{
my($server)=@_;
my $load=get_server_load(); #獲得資料庫主機當前load,具體實現這裡就不贅述了
my $cutoff1=$cutoff{$server}[$load1];
my $cutoff2=$cutoff{$server}[$load2];
if ( $load > $cutoff2){
my $mesg=$server." load more than ".$cutoff2.",now is ".$load."\n";
send_mobile($server,$mesg); # 大於load2,傳送手機告警
}
elsif( $load > $cutoff1){
my $mesg=$server." load more than ".$cutoff1.",now is ".$load."\n";
send_wangwang($server,$mesg); # 大於load1,傳送旺旺告警
}
}
############################################################
#迴圈檢查所有主機的load
foreach my $server(keys(%cutoff)){
print "---- ".$server." -----\n";
check_load($server);
}
# creator: jiangfeng
############################################################
use strict;
# 配置各主機各KPI的檢查門限
# 這裡配置了兩個門限值,達到第一個值發IM提醒,達到第二個值發手機簡訊
# server, load1 load2
my %cutoff=("db1", [ 30, 40 ],
"db2", [ 20, 35 ],
"db3", [ 10, 18 ]
);
# 配置各個門限值的陣列中的位置,這樣在以後即使修改門限的位置,也不需要修改功能程式碼
# 將配置和功能分開,將極大的簡化後續維護工作
my ($load1,$load2)=(0,1);
############################################################
# 檢查load的函式
sub check_load{
my($server)=@_;
my $load=get_server_load(); #獲得資料庫主機當前load,具體實現這裡就不贅述了
my $cutoff1=$cutoff{$server}[$load1];
my $cutoff2=$cutoff{$server}[$load2];
if ( $load > $cutoff2){
my $mesg=$server." load more than ".$cutoff2.",now is ".$load."\n";
send_mobile($server,$mesg); # 大於load2,傳送手機告警
}
elsif( $load > $cutoff1){
my $mesg=$server." load more than ".$cutoff1.",now is ".$load."\n";
send_wangwang($server,$mesg); # 大於load1,傳送旺旺告警
}
}
############################################################
#迴圈檢查所有主機的load
foreach my $server(keys(%cutoff)){
print "---- ".$server." -----\n";
check_load($server);
}
在send_mobile和send_wangwang實現告警傳送的函式中,傳入了$server引數,同樣可以使用hash陣列配置傳送給不同的責任人,基本思想和這裡沒有大的差別,就不重複貼程式碼了。
<!----EOF--
Trackback:http://rdc.taobao.com/blog/dba/html/149_using_perl_monitor_database.html/trackback
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-342873/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【NinGoo】用Perl的hash陣列實現個性化監控Go陣列
- perl 陣列的hash表陣列
- Knockout Observable Array(監控陣列)陣列
- [譯]Perl中的陣列陣列
- vue總結:computed屬性實現監控變數變化,watch屬性監控變數變化從而實現其他業務...Vue變數
- vue總結:computed屬性實現監控變數變化,watch屬性監控變數變化從而實現其他業務Vue變數
- 線性表1.0(陣列實現)陣列
- Docker容器的自動化監控實現Docker
- 如何實現MQ佇列訊息監控MQ佇列
- perl操作二維陣列陣列
- [江楓]In Memory Undo與logical standby databaseDatabase
- 如何監聽陣列變化?陣列
- 用陣列實現大數加法陣列
- TiDB監控實現--存活監控TiDB
- 一個hash表的實現
- 手把手教你實現Java監聽器全域性監控Java
- 陣列的七個 API 的簡單實現陣列API
- 陣列排序的實現陣列排序
- DELPHI也可以實現控制元件陣列,用定義陣列變數實現控制元件陣列 (轉)控制元件陣列變數
- vue是如何監聽陣列變化的Vue陣列
- 【江楓 】AIX平臺升級到Oracle10.2.0.4的幾個問題AIOracle
- 基於 IntersectionObserver 實現一個元件的曝光監控Server元件
- Perl 作為命令列實用程式(轉)命令列
- 5種方式實現陣列扁平化陣列
- 【江楓】AIX虛擬記憶體管理機制AI記憶體
- Perl 模組 Hash::Merge
- 陣列中每個陣列元素出現的次數陣列
- 個性化的分頁實現 (轉)
- js如何實現拷貝一個陣列JS陣列
- 教你如何運用golang實現陣列分割Golang陣列
- Java實現ZooKeeper的zNode監控Java
- 學習筆記:vue為什麼不能監聽陣列屬性的變化筆記Vue陣列
- 如何實現一個IOS網路監控元件iOS元件
- 監控 Linux 效能的 18 個命令列工具Linux命令列
- 監控Linux效能的18個命令列工具Linux命令列
- 一致性Hash的原理與實現
- 自己實現一個一致性 Hash 演算法演算法
- OpenTelemetry 實戰:從零實現應用指標監控指標