Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57575
  • 博文数量: 8
  • 博客积分: 447
  • 博客等级: 一等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 10:02
个人简介

不以物喜,不以己悲.

文章分类

全部博文(8)

文章存档

2015年(1)

2013年(2)

2012年(1)

2011年(3)

2010年(1)

我的朋友

分类: 系统运维

2015-07-16 17:41:49

Zabbix经验总结(有心得会再更新)
   
     一直在用nagios做服务器异常报警,现在客户要求每月出设备运行状况的图表,如果使用nagios+第三方的web前端也能做好,但现在zabbix似乎很流行,顺便学习一下就用zabbix替换nagios了.写这篇博文主要是为了做备忘录,所以显得没什么章法.
  • zabbix报警流程:
    监控项(Item)获取客户端的资源值,触发器(Trigger)发现资源值超过定义的阀值,就产生一个事件(Event),触发一个报警动作(Action),并按预先设置的步骤逐步执行,例如报警开始的前5分钟每分钟发一封邮件(短信),5分钟以后每小时发一封邮件(短信).
  • 配置zabbix的大概顺序:
  1. 创建报警的介质(create media type),例如使用脚本通过邮件和短信报警.
  2. 配置用户使用的报警介质.
  3. 配置触发器触发以后的动作.
  4. 然后再配置组-->模板-->添加要监控的机器.
  • 举例:
    利用Discovery来自动添加Oracle表空间使用率监控项,触发器如果发现表空间的使用率超过90%就报警,前5分钟每分钟发一封邮件(短信),5分钟以后每小时发一封邮件(短信).

准备脚本:

一: 使用GSM猫发短信,利用perl的Device::SerialPort模块可以做到:
#=======================================
use Device::SerialPort;
my $ob = Device::SerialPort->new('/dev/ttyS0') or die "Can't open COM1\n";
my $phone_nu=&to_hexstr(shift);
my $msg_send=&to_hexstr(shift);
my $at_cmgf = "\x41\x54\x2B\x43\x4D\x47\x46\x3D\x31\x0D";
my $at_cmgs="\x41\x54\x2B\x43\x4D\x47\x53\x3D\x22$phone_nu\x22\x0D";
my $com="/dev/ttyS0";
my $ob = Device::SerialPort->new($com) or die "Can't open COM1\n";
sub to_hexstr{
        my $hex_str;
        for (split //,shift){
                $hex_str .= sprintf("%x",ord);
        }
        return my $p_str = pack "H*",$hex_str;
}
sub write_com{
        $ob->write(shift);
        $ob->lookclear;
        sleep 1;
        $ob->read(100);
        $ob->purge_rx;
        $ob->purge_tx;
}
eval{
        $ob->baudrate(57600);
        $ob->parity('none');
        $ob->databits(8);
        $ob->stopbits(1);
        $ob->handshake('none');
};
die "Setting COM failed.\n" if $@;
$ob->write_settings or die "Writing COM failed.\n";
&write_com($at_cmgf);
&write_com($at_cmgs);
$ob->write("$msg_send\x1A");
$ob->lookclear;
sleep 2;
$ob->close;
#=======================================
        脚本如果没运行得注意一下:zabbix是没有权限打开ttyS0的,看一下/dev/ttyS0的用户组,把zabbix加入到这个用户组中,重启一下zabbix服务就行了.如果还是不行,就在上面代码中加日志或把这个脚本套入到bash脚本中重定向错误输出到日志文件再跟踪.

        二:使用bash获取oracle所有表空间的使用率输出到/tmp目录下的一个文件(用crond做成一个任务).
#=======================================
#!/bin/bash
ORACLE_HOME="/u01/app/oracle/product/11.2.0/db_1"
ORACLE_SID="ORASID"
LD_LIBRARY_PATH=$ORACLE_HOME/lib
PATH=/bin:/sbin:/usr/bin:/usr/sbin:$ORACLE_HOME/bin
export ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH PATH
sql='SELECT UPPER(F.TABLESPACE_NAME) "TAB_NAME",D.TOT_GROOTTE_MB "SIZE(M)",D.TOT_GROOTTE_MB - F.TOTAL_BYTES "USED(M)",TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "USED(%)",F.TOTAL_BYTES "FREE(M)",F.MAX_BYTES "MAXBLOCK(M)" FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY 1'
sqlplus -s sys/password as sysdba < set head off;
set feedback off;
col TAB_NAME format a20;
$sql;
EOF
echo $?
#=========================================
        三:再用一个perl脚本从脚本输出的文件中抽取内容响应zabbix的key:
#=========================================
#!/usr/bin/perl -w
use strict;
chomp (my $p1 = shift);
chomp (my $p2 = shift);
sub ora_ts{
        my $file = "/tmp/ORAinfo";
        my $line_count = 0;
        my $r_postion = 0;
        my @ts;
        my %ts_used;
        my $mark = " " x 4;
        open FH,"$file";
        while(){
                $line_count++;
                chomp;
                do{$r_postion = $line_count;next} if /^0\s*$/;    
                next if /^\s*$/ or /^(SYSAUX|SYSTEM|UNDOTBS1)/;    #这三个表空间不统计
                my @array = (split);
                push @ts,$array[0];
                $ts_used{$array[0]} = $array[3];
        }
        close FH;
        do{print "0";return} if $line_count != $r_postion;    #sqlplus运行失败返回0给zabbix.
        if ("$p1" eq "ORATSP_REC"){        #JSON格式
                print "\{\n$mark\"data\":\[\n";
                my $i = 0;
                for (@ts){
                        $i++;
                        if ($i == scalar(@ts)){
                                print "$mark$mark\{ \"{#TABLESPACE}\":\"$_\" \}\n";
                        }else{
                                print "$mark$mark\{ \"{#TABLESPACE}\":\"$_\" \},\n";
                        }
                }
                print "$mark\]\n\}\n";
        }else{
                print "$ts_used{$p2}";
        }
}
ora_ts;
#=========================================
  • 客户端配置
在客户端zabbix配置文件里添加:UserParameter=orainfo[*],orainfo "$1" "$2"    重启zabbix-agent.

  • WEB配置
记住以下配置都是在"Configuration"里进行.
  1. 新建Template :Template Oracle Generic
  2. 在"Template"菜单里,点击进到"Template Oracle Generic",再点击"Discovery rules"进去.
  3. 点击"Create Discovery rules"按钮,Name:Discovery rules  Key:orainfo[ORATSP_REC,0] 其它不动,点击"Add"即可创建.
  4. 进入 "Template" --> "Template Oracle Generic" --> "Discovery rules" --> "Tablespace discover",点击上面的"Item prototypes"进去.
  5. 点击"Create item prototypes"按钮, Name:Tablespace $2 Key:orainfo[ORATSP_VOL,{#TABLESPACE}] Type of information:Numeric(float) Units:% 其它不动点击"Add"创建一个item模板.
  6. 按上面建自动item的方法建Trigger:Name:Tablespace {#TABLESPACE} status Expression:{Template Oracle Generic:orainfo[ORATSP_VOL,{#TABLESPACE}].last()}=0 or {Template Oracle Generic:orainfo[ORATSP_VOL,{#TABLESPACE}].last()}>90 Severity:Warning.

记住以下配置都是在"Administration"里进行.
  1. 进入"Media types" 创建两个报警的介质"sendmail"和"sendsms",type都为script, Script name就是你上面发短信的脚本,注意脚本要放在"/usr/lib/zabbix/alertscripts/"目录下,权限755就行了.
  2. 进入"Users" --> "Admin (Zabbix Administrator)" -->"Media" 新增加两个"Media",Send to填邮件或手机号码.

记住以下配置都是在"Configuration"里进行.
  1. 进入"Actions" --> "Report problems to Zabbix administrators", "Action"里的"Recovery message"打勾,"Conditions"里的不变.主要工作在"Operations"里:点击"new"按钮,From:1 To:5 Step duration:60 Send to User groups:(没有就add)Zabbix administrators Send only to:-All- ,其它不动点击"Update",完成前5分钟每分钟报警一次.再用同样的方法增加每1小时报警一次,From:6 To:0(无限次) duration:3600.

有几件事情需要注意:
  1. Trigger里的"Multiple PROBLEM events generation"千成不要打勾,有些朋友要重复发报警把这个打勾,是理解错误了,这是代表触发器触发以后会生成多个事件和多个Action,而且间隔时间不好控制.记住只要一次Action就行了,因为一次Action可以包含n多步.
  2. Action里的"Conditions" "Maintenance status not in maintenance"和"Trigger value = PROBLEM"之间要用and,意思是说"不是在维护状态并且触发器的值是PROBLEM"的情况下才执行Action,明显不能是or.
阅读(1759) | 评论(0) | 转发(0) |
0

上一篇:Linux下的策略路由。

下一篇:没有了

给主人留下些什么吧!~~