check_postgres.pl 的缺陷

babyyellow發表於2012-02-14
Nagios 系統監控pg 資料庫的元件 check_postgres.pl



對資料庫的監控的返回值中,存在一個缺陷。分析如下

如果 pg 資料庫已經宕掉,監控程式碼無法連線到資料庫時,應用程式碼不會發出critical 的告警

check_postgres.pl  返回的程式碼為3 對應於nagios 告警系統的 UNKNOW ,這個時候就有可能導致資料庫管理人員的誤判。

具體的函式為run_command()  中對資料庫返回的錯誤資訊的判斷有問題。

對於設定的檢查指令碼中連線pg 的連線使用者,如果許可權不夠,或者不能登入pg資料庫,返回的程式碼為 FATAL

程式碼對此返回的值為3 這個時候其實從側面是可以確認資料庫應該還是ok 的,

對於檢查的sql 程式碼超時 , 返回的結果狀態也為3  , 這個時候應該是資料庫忙了,這種情況,dba是需要檢查系統的。

而對於 PG 資料庫損壞,或者已經關機 檢查程式碼連線不到資料庫,監控程式碼並沒有做專門的處理而是僅僅返回了狀態3  UNKONW 這個時候dba 是需要優先檢查資料庫的,資料庫可能已經處於故障狀態了。

我們的修改:

在run_command 函式中增加一個錯誤判斷:

  if ($db->{error} =~ /FATAL/) {
                                if (exists $arg->{fatalregex} and $db->{error} =~ /$arg->{fatalregex}/) {
                                        $info->{fatalregex} = $db->{error};
                                        next;
                                }
                                else {
                                        ndie "$db->{error}";
                                }
                        }

                        elsif ($db->{error} =~ /statement timeout/) {
                                ndie msg('runcommand-timeout', $timeout);
                        }
                        #### lsl
                        ##  if  run check_postgres.pl  on local host
                        ##  when  pg is down  we can recieve  MSG: psql: could not connect to server: No such file or directory
                        ##  AND  check_postgres.pl  return code = 3  Nagios  means Uknow 
                        ##  We  need this  return  Critical  Status
                        ##  So  we modified  this here  and add  sub fide 
                        ##  lsliang  
                        elsif ($db->{error} =~ /could not connect to server/) {
                                fdie  "$db->{error}"

                        }
                        if (!$db->{ok} and !$arg->{failok} and !$arg->{noverify}) {

                                ## Check if problem is due to backend being too old for this check
                                verify_version();

                                if (exists $db->{error}) {
                                        ndie $db->{error};
                                                           

同事配套的 定義了一個fdie 函式 返回狀態碼為2  對應於Nagios 的critical 告警,要求dba 立即處理。

fdie 函式的定義跟ndie 函式的定義是一致的,只是返回值為2 。

##### some times  we want  ndie return 2  and raise  Nagios 's  CRITICAL 
## lsl
sub fdie  {
        eval { FILE::Temp::cleanup();};
        my $msg= shift;
        chomp $msg;
        print "FATAL!!: $msg\n";
        exit 2 ;
}

經過測試可以很好的處理,pg掛掉時的告警。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-716221/,如需轉載,請註明出處,否則將追究法律責任。

相關文章