Ad Widget

Collapse

Генерация отчета о количестве сбоев и их l

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • maltf0
    Junior Member
    • Mar 2015
    • 1

    #1

    Генерация отчета о количестве сбоев и их l

    Добрый день!

    Данная тема уже неоднократно поднималась, однако какого-то универсального и внятного решения я не нашел. Например, вот тут https://www.zabbix.com/forum/showthread.php?t=21135 советуют воспользоваться IT-услугами, либо написать свою страничку для формирования отчетов. Собственно второе мне и было поручено сделать.

    Ввиду того, что с самим Zabbix'ом моя работа не связана, в дальнейшем описании вопроса я, возможно, буду путаться в установленной терминологии.

    Итак, передо мной стоит задача сформировать два отчета в виде графика: количество сбоев (штук) и продолжительность сбоев (часов) для выбранной группы узлов.

    Входные данные:
    * Список узлов, по которым требуется построение отчета.
    * Промежуток данных для отчета.
    * Элемент данных и его значение, которые распознаются как проблемная ситуация. Иными словами, это триггер, активация которого означает проблемную ситуацию. В 90% случаев подобный отчет строится по триггеру «Объект недоступен», означающему, что ICMP пакеты (ping) до объекта не доходят.


    Как я вижу решение поставленной задачи (прошу меня поправить, если в чем-то я не прав):
    1). Получить все хосты, находящиеся в заданной группе.
    2). Задать искомый item (в моем случае это icmppingloss_big_packet)
    3). Получить items по заданному имени item'а (icmppingloss_big_packet) и найденным хостам.
    4). Далее по найденным данным из таблицы trends (данные 7 дней хранятся в чистом виде, а потом в тенденциях - минимальное, среднее и максимальное значение за каждый час) вытащить "сбойные" часы. Под "сбойными" часами я понимаю часы, у которых максимальное значение потери пакетов за час > 50% (т.е. хоть раз за час потеря скакнула >50%). Может быть, можно и из таблицы с триггерами вытащить эти данные, но я не уверен, что информация по сработавшим триггерам хранится долгое время.
    Так же отдельно надо вытащить те же данные из истории (history).


    С виду вроде все понятно,но есть затыки в простых местах - например, я так и не нашел как вытащить все узлы, находящиеся в заданной группе, так что я бы хотел при помощи сообщества создать более-менее рабочий инструмент для генерации подобных отчетов в виде странички на PHP (вдруг кому пригодится).
  • sersad
    Senior Member
    • May 2009
    • 518

    #2
    забикс имеет api
    через питон можно достать все
    Начало кода
    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #Usage script.py <gropids> <period in second 1 day 86400> <send_to1> <send_to2> <send_to3>
    
    from getpass import getpass
    from pyzabbix import ZabbixAPI #https://github.com/lukecyca/pyzabbix/wiki
    import datetime
    from datetime import date, timedelta
    import time
    import xlsxwriter #https://pypi.python.org/pypi/XlsxWriter sudo pip install xlsxwriter
    import sys
    import os
    import smtplib
    import re
    
    r=re.compile("(?P<name>\w+)\W+(?P<number>\d+)?\W*(?P<hardware>.+)")
    
    minseverity = 1
    group = sys.argv[1]
    period = int(sys.argv[2])
    url = 'https://localhost'
    login = 'api'
    password = 'xxxxxxxxxxxx'
    
    now_date = datetime.datetime.now().strftime("%d.%m.%Y %H-%M")
    today = datetime.datetime.now()-timedelta(days=1)
    today = today.strftime("%d.%m.%Y %H-%M")
    1. достаем хосты по id группы
    Code:
    # The hostname at which the Zabbix web interface is available
    ZABBIX_SERVER = url
    zapi = ZabbixAPI(ZABBIX_SERVER)
    # Disable SSL certificate verification
    zapi.session.verify = False
    # Login to the Zabbix API
    zapi.login(login, password)
    # now time unix timestamp
    unix_time = time.mktime(datetime.datetime.now().timetuple())
    
    #create dic priority
    prior={5:u'Чрезвычайная', 4:u'Высокая', 3:u'Средняя', 2:u'Предупреждение', 1:u'Информация', 0:u'Не классифицировано',}
    
    #create blank dic h(hostid)=name
    h={}
    
    #fill dic
    for i in zapi.host.get(output='extend',
                           groupids=group,
                           monitored_hosts=True, #Return only monitored hosts
                           with_triggers=True #Return only hosts that have triggers
                           ):
        h[i['hostid']]=i['name']
    2. Ищем все триггеры, по итему искать смысла нет.
    Code:
    #create blank dic t(triggerid)=description
    t={}
    #fill dic
    for i in zapi.trigger.get(output=['triggerid',
                'description',
                'priority'],
                groupids=group,
                active=True, #Return only enabled triggers that belong to monitored hosts
                expandDescription=True, #Expand macros in the name of the trigger
                monitored=True, #Return only enabled triggers that belong to monitored hosts and contain only enabled items
                min_severity=minseverity #Return only triggers with severity greater or equal than the given severity.
                ):
        t[i['triggerid']]=[i['description'], int(i['priority'])]

    дальше к примеру можно дернуть события вот так
    Code:
    for k,v in h.items():
        events = zapi.event.get(output='extend',
            #select_acknowledges='extend',
            #acknowledged=True,
            hostids=k,
            source=0, #Type of the event.  0 - event created by a trigger; 1 - event created by a discovery rule;2 - event created by active agent auto-registration;3 - internal event. 
            value=1, #Possible values for trigger events 0 - OK; 1 - problem. 
            groupids=group,
            sortfield='eventid',
            time_from=unix_time - period,
            time_till=unix_time)
        for e in events:
            try:
                print r.match(v).group("name")
                print r.match(v).group("number")
                print r.match(v).group("hardware")
                print t[e['objectid']][0]
                print prior[t[e['objectid']][1]]
                row += 1
            except:
                print "Oops!  That was no valid number.  Try again..."

    Думаю ход мыслей понятен?

    Comment

    Working...