Итак, руководство поставило задачу:
- Твоя система мониторинга - это хорошо, но нужны отчеты, красивые, с блэк-джеком и ... кхм.
- Ок, какой отчет нужен?
- Ну, мы, эээ...
- IT Services?
- Да.
Отлично, теперь осталось понять, как это достать из zabbix.
Есть два варианта: через прямое обращение к БД MySQL (этот путь предлагает нам JasperReports) и через Zabbix API - это тот путь, которым пошел я.
После долгого раскуривания zabbix api (не очень внятно документированного, не хватает реально боевых примеров) был написан следующий скрипт (ниже по тексту). Я не программист Perl, моя стихия -VBScript, поэтому прошу не пинать за говнокод.
Для отправки на почту буду использовать ssmtp. Пример настройки ssmtp найдете в гугле.
Вызывать этого дьявола с помощью perl myscript.pl | ssmtp [email protected]
Удачного всем дня!
- Твоя система мониторинга - это хорошо, но нужны отчеты, красивые, с блэк-джеком и ... кхм.
- Ок, какой отчет нужен?
- Ну, мы, эээ...
- IT Services?
- Да.
Отлично, теперь осталось понять, как это достать из zabbix.
Есть два варианта: через прямое обращение к БД MySQL (этот путь предлагает нам JasperReports) и через Zabbix API - это тот путь, которым пошел я.
После долгого раскуривания zabbix api (не очень внятно документированного, не хватает реально боевых примеров) был написан следующий скрипт (ниже по тексту). Я не программист Perl, моя стихия -VBScript, поэтому прошу не пинать за говнокод.
Для отправки на почту буду использовать ssmtp. Пример настройки ssmtp найдете в гугле.
Вызывать этого дьявола с помощью perl myscript.pl | ssmtp [email protected]
Удачного всем дня!
Code:
#!/usr/bin/perl
use 5.010;
use strict;
#use warnings;
use utf8;
use JSON::RPC::Client;
use Data::Dumper;
binmode(STDOUT,':utf8');
my $client = new JSON::RPC::Client;
my $url = 'http://192.168.1.180/zabbix/api_jsonrpc.php';
my $authID;
my $response;
my $result;
my $gsbid;
my $gsb_response;
my $serviceup;
my $gsla;
my $dt;
my $srv_id;
my $get_sla;
my $sla;
my $dt2;
my $okTime;
my $problemTime;
my $downTime;
my $val;
my $num;
my $goodsla_color;
my $badsla_color;
my $sla_color;
my $font_color;
$goodsla_color="#00c000";
$badsla_color="red";
$num=0;
$dt=time();
$val=86400;
$dt2=int($dt-$val);
login();
getservices();
print "Content-Type: text/html; charset=\"UTF-8\"\n";
print "Content-Transfer-Encoding: 8bit\n";
print "Subject: Daily Avaiability Report of IT Services\n";
print "<html lang='en'><head><title>Daily Availability Report of IT Services</title></head>";
print "<body bgcolor='#ffffff'>\n";
print "<center>Daily Availability Report of IT Services<br>\n";
print "<font color=white><br>";
print "<table bgcolor=#00c000 border=1><tr bgcolor=blue align=center><td>Number</td><td>Service Name</td><td>Subservice</td><td>Target SLA</td><td>Current SLA</td><td>OK Time</td><td>Problem Time</td><td>Down Time</td></tr>\n";
foreach my $service (@{$response->content->{'result'}}) {
$serviceup=0;
if (ref(@{$service->{'dependencies'}}), 'ARRAY') {
foreach my $depend (@{$service->{'dependencies'}}) {
$serviceup = $depend->{'serviceupid'};
}
if ($serviceup > 0) {
$srv_id = $service->{'serviceid'};
getslaofservice();
$num +=1;
if ($sla >= ($service->{'goodsla'})) { $sla_color=$goodsla_color; $font_color="black"; } else { $sla_color = $badsla_color; $font_color="white";}
print "<font color=" .$font_color ."><tr bgcolor=" . $sla_color ."><td align=center>" .$num ."</td>";
print "<td>" . $service->{'name'} ."</td><td> </td>";
print "<td>" . $service->{'goodsla'} ."</td><td>";
printf "%03.4f",$sla;
print "</td><td>" .$okTime ."</td><td>" .$problemTime ."</td><td>" .$downTime ."</td></tr></font>\n";
}
foreach my $depend (@{$service->{'dependencies'}}) {
if ($depend->{'servicedownid'} > 0) {
$gsbid = $depend->{'servicedownid'};
getservicebyid ();
foreach my $gsb_service (@{$gsb_response->content->{'result'}}) {
$num +=1;
$srv_id=$gsb_service->{'serviceid'};
getslaofservice();
if ($sla >= ($service->{'goodsla'})) { $sla_color=$goodsla_color; $font_color="black"; } else { $sla_color = $badsla_color; $font_color="white";}
print "<font color=" .$font_color ."><tr bgcolor=" .$sla_color ."><td align=center>" . $num ."</td><td> </td><td>" . $gsb_service->{'name'} . "</td><td>" . $gsb_service->{'goodsla'} ."</td><td>";
printf "%03.4f",$sla;
print "</td><td>" .$okTime ."</td><td>" .$problemTime ."</td><td>" .$downTime ."</td></tr>\n";
}
}
}
}
}
print "</font></table></body></html>\n";
logout();
sub login{
my $login = {
jsonrpc => "2.0",
method => "user.login",
params => {
user => "admin",
password => "zabbix"
},
id => 1
};
$response = $client->call($url, $login);
die "Authentication failure\n" unless $response->content->{'result'};
$authID = $response->content->{'result'};
}
sub logout{
my $logout = {
jsonrpc => "2.0",
method => "user.logout",
params => { },
id => 1,
auth => $authID
};
$response = $client->call($url, $logout);
die "Cann't logout" unless $response->content->{'result'};
$result = $response->content->{'result'};
#print "Logout " . $result . "\n";
}
sub getservices{
my $get_services = {
jsonrpc => "2.0",
method => "service.get",
params => {
output => "extend",
selectDependencies => "extend",
},
auth => $authID,
id => 1
};
$response = $client->call($url, $get_services);
die "Error get_services" unless $response->content->{'result'};
}
sub getservicebyid{
my $get_service_by_id = {
jsonrpc => "2.0",
method => "service.get",
params => {
serviceids => $gsbid,
output => "extend",
selectDependencies => "extend",
},
auth => $authID,
id => 1
};
$gsb_response = $client->call($url, $get_service_by_id);
die "Error" unless $gsb_response->content->{'result'};
}
sub getslaofservice{
$sla=0;
$okTime=0;
$problemTime=0;
$downTime=0;
my $get_sla = {
jsonrpc => "2.0",
method => "service.getsla",
params => {
serviceids => $srv_id,
intervals => {
from => $dt2,
to => $dt
}
},
auth => $authID,
id => 1
};
$gsla = $client->call($url, $get_sla);
die "Error getting sla" unless $gsla->content->{'result'};
foreach my $item (@{$gsla->content->{'result'}->{$srv_id}->{'sla'}}) {
$sla= $item->{'sla'};
$okTime= $item->{'okTime'};
$problemTime= $item->{'problemTime'};
$downTime= $item->{'downTime'};
}
Comment