Zabbix经验总结(有心得会再更新)
一直在用nagios做服务器异常报警,现在客户要求每月出设备运行状况的图表,如果使用nagios+第三方的web前端也能做好,但现在zabbix似乎很流行,顺便学习一下就用zabbix替换nagios了.写这篇博文主要是为了做备忘录,所以显得没什么章法.
监控项(Item)获取客户端的资源值,触发器(Trigger)发现资源值超过定义的
阀值,就产生一个事件(Event),触发一个报警动作(Action),并按预先设置的步骤逐步执行,例如报警开始的前5分钟每分钟发一封邮件(短信),5分钟以后每小时发一封邮件(短信).
-
创建报警的介质(create media type),例如使用脚本通过邮件和短信报警.
-
配置用户使用的报警介质.
-
配置触发器触发以后的动作.
-
然后再配置组-->模板-->添加要监控的机器.
利用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.
记住以下配置都是在"Configuration"里进行.
-
新建Template :Template Oracle Generic
-
在"Template"菜单里,点击进到"Template Oracle Generic",再点击"Discovery rules"进去.
-
点击"Create Discovery rules"按钮,Name:Discovery rules Key:orainfo[ORATSP_REC,0] 其它不动,点击"Add"即可创建.
-
进入 "Template" --> "Template Oracle Generic" --> "Discovery rules" --> "Tablespace discover",点击上面的"Item prototypes"进去.
-
点击"Create item prototypes"按钮, Name:Tablespace $2 Key:orainfo[ORATSP_VOL,{#TABLESPACE}] Type of information:Numeric(float) Units:% 其它不动点击"Add"创建一个item模板.
-
按上面建自动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"里进行.
-
进入"Media types" 创建两个报警的介质"sendmail"和"sendsms",type都为script, Script name就是你上面发短信的脚本,注意脚本要放在"/usr/lib/zabbix/alertscripts/"目录下,权限755就行了.
-
进入"Users" --> "Admin (Zabbix Administrator)" -->"Media" 新增加两个"Media",Send to填邮件或手机号码.
记住以下配置都是在"Configuration"里进行.
-
进入"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.
有几件事情需要注意:
-
Trigger里的"Multiple PROBLEM events generation"千成不要打勾,有些朋友要重复发报警把这个打勾,是理解错误了,这是代表触发器触发以后会生成多个事件和多个Action,而且间隔时间不好控制.记住只要一次Action就行了,因为一次Action可以包含n多步.
-
Action里的"Conditions" "Maintenance status not in maintenance"和"Trigger value = PROBLEM"之间要用and,意思是说"不是在维护状态并且触发器的值是PROBLEM"的情况下才执行Action,明显不能是or.
阅读(1808) | 评论(0) | 转发(0) |