博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
check_postgres.pl 的缺陷
阅读量:2496 次
发布时间:2019-05-11

本文共 1794 字,大约阅读时间需要 5 分钟。

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133735/viewspace-716221/

你可能感兴趣的文章
解决python中不能连接超时的问题
查看>>
正则图
查看>>
C语言return返回值深入理解
查看>>
使用ASM获得JAVA类方法参数名
查看>>
IOS开发之控件篇UINavigationController第二章 - 标题
查看>>
借助linq2db使用Linq访问MySQL
查看>>
如何在 windows 配置 libtorch c++ 前端库?
查看>>
go——类型的本质
查看>>
python发展史
查看>>
.Net Filter原理(使用特性 Attribute)这是一个AOP编程
查看>>
项目2:画幅好画
查看>>
jquery ajax超时设置
查看>>
转化到frame窗口中:browser.swicth_to_frame()
查看>>
select选项改变时获取选中的option的值
查看>>
《Cortex-M0权威指南》之Cortex-M0编程入门
查看>>
实习第八天
查看>>
POJ 1797 Heavy Transportation (dijkstra 最小边最大)
查看>>
第五周学习进度条
查看>>
C#多线程编程
查看>>
T-SQL with关键字 with as 递归循环表
查看>>