用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);                     
}

在send_mobile和send_wangwang实现告警发送的函数中,传入了$server参数,同样可以使用hash数组配置发送给不同的责任人,基本思想和这里没有大的差别,就不重复贴代码了。

--EOF--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值