Ad Widget

Collapse

How to get current SLA of IT Service by time period via SQL

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • miketa
    Junior Member
    • Jun 2014
    • 1

    #1

    How to get current SLA of IT Service by time period via SQL

    Добрый день, уважаемые.

    Задался вопросом посчитать 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?
    Last edited by miketa; 02-06-2014, 10:30.
Working...