Добрый день, уважаемые.
Задался вопросом посчитать sla за период у 2.5к itservice и создать на этой основе отчет, высылаемый по почте. Нашел подходящую тему поиском https://www.zabbix.com/forum/showthread.php?t=40931 , но ответа в ней нет.
Как на sql посчитать sla?
service_alerts содержит кучу значений (например value={0,4,5}) и мне не понятно как из них формировать sla.
То есть, в идеале хотелось бы иметь на входе - serviceid, from, to а на выходе sla.
В api запрос выглядит так:
$query = DBselect(
'SELECT *'.
' FROM service_alarms sa'.
' WHERE '.dbConditionInt('sa.serviceid', $usedSeviceIds).
' AND ('.implode(' OR ', $intervalConditions).')'.
' ORDER BY sa.clock,sa.servicealarmid'
);
UPD.
Чем дальше в лес, тем толще партизаны:
SELECT * FROM SERVICE_ALARMS sa
WHERE sa.SERVICEID = '442'
and sa.CLOCK between '1400432400' and '1400518800'
....
557094 442 1400497162 0
557251 442 1400498600 5
557279 442 1400498960 0
16 rows returned in 0.00 seconds
Теперь через API те же самые данные (насколько я понял)
&srv_getsla('442','1400432400','1400518800'); ## find sla
sub srv_getsla { ## serviceid,from,to
$json = {
jsonrpc=> '2.0',
method => 'service.getsla',
id => 1,
auth => "$AuthID",
params => {
serviceid => $_[0],
intervals => {
from => $_[1],
to => $_[2],
},
},
};
#print Dumper($json)."\n";
$response = $client->call($url, $json);
#print Dumper($response)."\n";
sleep 10;
my $sla_count = 0;
my $sla_res = 0;
#print "\n ref result: ".ref($response->content->{result})."\n";
while (my @Res = each $response->content->{result}){
while (my @Res2 = each $Res[1]) {
if ($Res2[0] eq "sla") {
while (my @Res3 = each $Res2[1]) {
if (!defined($Res3[1]->{sla})) { print "$Res[1]".Dumper($Res3[1])."\n";};
#print "\n+".Dumper($Res3[1])."+";
#print "\n--".$Res3[1]->{sla}."--";
$sla_res = $sla_res + ($Res3[1]->{sla});
$sla_count = $sla_count + 1;
};
};
};
};
print "\n\tsla_cnt: $sla_count\n";
print "\n\tsla_res: $sla_res\n";
print "\n\tsla_avg: ".$sla_res / $sla_count."\n";
};
sla_cnt: 4232
sla_res: 411895.760771074
sla_avg: 97.3288659667
То есть, количество записей в таблице SERVICE_ALARMS по данному serviceid за заданный интервал - 16
а количество записей из API service.getsla - 4232 за тот же период, тот же serviceid
Опять возникает вопрос - как считать SLA?
Задался вопросом посчитать sla за период у 2.5к itservice и создать на этой основе отчет, высылаемый по почте. Нашел подходящую тему поиском https://www.zabbix.com/forum/showthread.php?t=40931 , но ответа в ней нет.
Как на sql посчитать sla?
service_alerts содержит кучу значений (например value={0,4,5}) и мне не понятно как из них формировать sla.
То есть, в идеале хотелось бы иметь на входе - serviceid, from, to а на выходе sla.
В api запрос выглядит так:
$query = DBselect(
'SELECT *'.
' FROM service_alarms sa'.
' WHERE '.dbConditionInt('sa.serviceid', $usedSeviceIds).
' AND ('.implode(' OR ', $intervalConditions).')'.
' ORDER BY sa.clock,sa.servicealarmid'
);
UPD.
Чем дальше в лес, тем толще партизаны:
SELECT * FROM SERVICE_ALARMS sa
WHERE sa.SERVICEID = '442'
and sa.CLOCK between '1400432400' and '1400518800'
....
557094 442 1400497162 0
557251 442 1400498600 5
557279 442 1400498960 0
16 rows returned in 0.00 seconds
Теперь через API те же самые данные (насколько я понял)
&srv_getsla('442','1400432400','1400518800'); ## find sla
sub srv_getsla { ## serviceid,from,to
$json = {
jsonrpc=> '2.0',
method => 'service.getsla',
id => 1,
auth => "$AuthID",
params => {
serviceid => $_[0],
intervals => {
from => $_[1],
to => $_[2],
},
},
};
#print Dumper($json)."\n";
$response = $client->call($url, $json);
#print Dumper($response)."\n";
sleep 10;
my $sla_count = 0;
my $sla_res = 0;
#print "\n ref result: ".ref($response->content->{result})."\n";
while (my @Res = each $response->content->{result}){
while (my @Res2 = each $Res[1]) {
if ($Res2[0] eq "sla") {
while (my @Res3 = each $Res2[1]) {
if (!defined($Res3[1]->{sla})) { print "$Res[1]".Dumper($Res3[1])."\n";};
#print "\n+".Dumper($Res3[1])."+";
#print "\n--".$Res3[1]->{sla}."--";
$sla_res = $sla_res + ($Res3[1]->{sla});
$sla_count = $sla_count + 1;
};
};
};
};
print "\n\tsla_cnt: $sla_count\n";
print "\n\tsla_res: $sla_res\n";
print "\n\tsla_avg: ".$sla_res / $sla_count."\n";
};
sla_cnt: 4232
sla_res: 411895.760771074
sla_avg: 97.3288659667
То есть, количество записей в таблице SERVICE_ALARMS по данному serviceid за заданный интервал - 16
а количество записей из API service.getsla - 4232 за тот же период, тот же serviceid
Опять возникает вопрос - как считать SLA?