Ad Widget

Collapse

Экспорт данных в Excel

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • zverek06
    Member
    • Oct 2016
    • 51

    #1

    Экспорт данных в Excel

    Добрый день.
    Перерыл гугл и не нашел ответа.
    Можно ли выгружать данные из заббикса в Excel.
    Допустим у меня есть группа узлов с МФУ. Необходимо раз в месяц выгружать данные по количеству отпечатков + S/N аппарата. Открывать в последних данных всю группу и от туда копировать не очень удобно.
  • spanjokus
    Junior Member
    • Sep 2020
    • 4

    #2
    То же подпишусь на этот вопрос, то же интересно

    Comment

    • Victor Sklyarov
      Senior Member
      • Apr 2016
      • 184

      #3
      Можно через API. Писал такое приложение на Python. Сделал его в виде WEB приложения прямо на сервере zabbix на движке apache. В простейшем случае можно ограничиться выполнением программы формирования отчёта на личном компьютере, передав параметры в неё тем или иным способом. Да, самое главное, во всех шаблонах метрики, обрабатываемые в отчёте должны иметь одинаковые имена (имя принтера, серийный номер, счётчик ч/б страниц, счётчик цв/стр.) Идея отчёта - просматривать исторические данные по каждому отсчёту каждого принтера. Если замены принтера не было, то просто взять две крайние цифры и получить дельту. Однако отчёт должен обрабатывать ситуации замены принтера. Самое простое отслеживать изменение серийного номера, но это только в идеальном мире так происходит. Поменяли HP на Kyocera и забыли сменить шаблон, серийники исчезли. Могут исчезнуть и серийники и имена принтеров. Тогда нужно искать резкие изменения в счётчиках исторических данных. В общем совсем не тривиальный получился отчёт, больше двухсот строчек кода. Ниже показаны какие графы отчёта формируются. Если за период отчёта принтер менялся несколько раз, то в отчёте будет столько же строчек по этому принтеру.
      Имя принтера Модель Серийный номер Ч/Б нач. сч. Ч/Б конечн. сч. Ч/Б количество Цвет. нач. сч. Цвет. кон. сч. Цвет. количество Дата установки Дата демонтажа
      Last edited by Victor Sklyarov; 24-11-2021, 19:30.

      Comment

      • zverek06
        Member
        • Oct 2016
        • 51

        #4
        Originally posted by Victor Sklyarov
        Можно через API. Писал такое приложение на Python. Сделал его в виде WEB приложения прямо на сервере zabbix на движке apache. В простейшем случае можно ограничиться выполнением программы формирования отчёта на личном компьютере, передав параметры в неё тем или иным способом. Да, самое главное, во всех шаблонах метрики, обрабатываемые в отчёте должны иметь одинаковые имена (имя принтера, серийный номер, счётчик ч/б страниц, счётчик цв/стр.) Идея отчёта - просматривать исторические данные по каждому отсчёту каждого принтера. Если замены принтера не было, то просто взять две крайние цифры и получить дельту. Однако отчёт должен обрабатывать ситуации замены принтера. Самое простое отслеживать изменение серийного номера, но это только в идеальном мире так происходит. Поменяли HP на Kyocera и забыли сменить шаблон, серийники исчезли. Могут исчезнуть и серийники и имена принтеров. Тогда нужно искать резкие изменения в счётчиках исторических данных. В общем совсем не тривиальный получился отчёт, больше двухсот строчек кода. Ниже показаны какие графы отчёта формируются. Если за период отчёта принтер менялся несколько раз, то в отчёте будет столько же строчек по этому принтеру.
        Имя принтера Модель Серийный номер Ч/Б нач. сч. Ч/Б конечн. сч. Ч/Б количество Цвет. нач. сч. Цвет. кон. сч. Цвет. количество Дата установки Дата демонтажа
        Спасибо за такой ёмкий ответ!
        Так, придется изучать API и как от туда что то дергать.

        Comment

        • Victor Sklyarov
          Senior Member
          • Apr 2016
          • 184

          #5
          1. Подключаете библиотеки Используется Python модуль для zabbix https://github.com/adubkov/py-zabbix
          from pyzabbix.api import ZabbixAPI
          import xlsxwriter

          2. Подключаетесь к серверу.
          zapi = ZabbixAPI(url='http://хх.хх.хх.хх/zabbix', user='zabbixapi', password='ХХХХХХХХХ')
          3. Получаете ID нужной вам группы принтеров по названию
          groupsid = zapi.hostgroup.get(filter={'name': [ИМЯ ГРУППЫ в zabbix]}, output=['groupid'])
          4. Получаете список хостов в группе
          hosts = zapi.host.get(groupids=groupsid[0]['groupid'], output=['hostid', 'name'])
          5. Создаёте таблицу excel
          workbook = xlsxwriter.Workbook(repname)
          worksheet = workbook.add_worksheet()
          row = 0
          merge_format = workbook.add_format({'align': 'center', 'bg_color': 'yellow'})
          worksheet.merge_range(row, 0, row, 10, 'Отчёт за период с '+dataprev+' по '+datanew+' для '+<Имя руппы>, merge_format)
          row += 1
          worksheet.write(row, 0, 'Расположение')
          worksheet.write(row, 1, 'Модель')
          worksheet.write(row, 2, 'Серийный номер')
          worksheet.write(row, 3, 'Ч/Б нач. сч.')
          worksheet.write(row, 4, 'Ч/Б конечн. сч.')
          worksheet.write(row, 5, 'Ч/Б количество')
          worksheet.write(row, 6, 'Цвет. нач. сч.')
          worksheet.write(row, 7, 'Цвет. кон. сч.')
          worksheet.write(row, 8, 'Цвет. количество')
          worksheet.write(row, 9, 'Дата установки')
          worksheet.write(row, 10, 'Дата демонтажа')
          num_format = workbook.add_format({'num_format': '0'})
          date_format = workbook.add_format({'num_format': 'dd/mm/yyyy hh:mm'})
          worksheet.set_column('A:A', 30)
          worksheet.set_column('B:B', 30)
          worksheet.set_column('C:C', 16)
          worksheet.set_column('D:I', 16, num_format)
          worksheet.set_column('J:K', 16, date_format)

          5. Перебираете в цикле данные по каждому принтеру
          for host in hosts:
          current_host += 1
          itemsb = zapi.item.get(hostids=host['hostid'], filter={'key_': 'pages.black'}, output=['itemid', 'value_type'])
          itemsc = zapi.item.get(hostids=host['hostid'], filter={'key_': 'pages.color'}, output=['itemid', 'value_type'])
          itemssn = zapi.item.get(hostids=host['hostid'], filter={'key_': 'printer.sn'}, output=['itemid', 'value_type'])
          itemstype = zapi.item.get(hostids=host['hostid'], filter={'key_': 'printer.model'}, output=['itemid', 'value_type'])
          worksheet.write(row, 0, host['name']) # имя узла

          6. Читаете исторические данные с проверкой на их существование. timestamps -время старта, timestampe -время окончания отчёта
          hist_exist = 0
          if itemsb:
          histb = zapi.history.get(history=itemsb[0]['value_type'], itemids=itemsb[0]['itemid'], time_from=timestamps,
          time_till=timestampe, output='extend')
          if histb:
          hist_exist += 1
          if itemsc:
          histc = zapi.history.get(history=itemsc[0]['value_type'], itemids=itemsc[0]['itemid'], time_from=timestamps,
          time_till=timestampe, output='extend')
          if histc:
          hist_exist += 1
          if itemssn: # читаем серийные номера если есть
          histsn = zapi.history.get(history=itemssn[0]['value_type'], itemids=itemssn[0]['itemid'],
          time_from=timestamps, time_till=timestampe, output='extend')
          if histsn:
          hist_exist += 1
          if itemstype: # Читаем типы принтера если есть тип принтера
          histtype = zapi.history.get(history=itemstype[0]['value_type'], itemids=itemstype[0]['itemid'],
          time_from=timestamps, time_till=timestampe, output='extend')
          if histtype:
          hist_exist += 1
          if hist_exist == 0: # нет никакой истории, читаем следующий узел
          row += 1
          continue
          7. Проверяете смену серийного номера, если их нет, смену названия, если и названия нет, скачки счётчик страниц. Последнее работает условно в предположении того, что разница между двумя отсчётами превышает некий средний темп печати, например 300 листов в час.
          # Попадаем сюда если есть хоть какие-то данные #################
          time_chng.clear()
          numchng = 1
          time_chngbw.clear()
          numchngbw = 1
          if itemssn: # Если есть серийники
          if histsn:
          current = histsn[0]['value']
          time_chng.append(int(histsn[0]['clock']))
          for value in histsn:
          if value['value'] and value['value'] != current: # поменялся номер
          time_chng.append(int(value['clock'])) # Запомним время изменения номера
          current = value['value'] # меняем текущий
          numchng += 1 # увеличим счётчик
          time_chng.append(int(histsn[len(histsn)-1]['clock']))
          if len(time_chng) == 0: # Нет серийников
          if itemstype: # нет серийников, но есть тип принтера
          if histtype:...............
          Не забываем, что могут быть только цветные и только ЧБ счётчики

          8. Наконец пишем полученные данные в таблицу, примерно так
          if itemsb:
          histb = zapi.history.get(history=itemsb[0]['value_type'], itemids=itemsb[0]['itemid'],
          time_from=time_chng[i], time_till=time_chng[i+1] , output='extend')
          if histb:
          if i != 0:
          worksheet.write(row, 9, datetime.fromtimestamp(time_chng[i]))
          worksheet.write(row, 10, datetime.fromtimestamp(int(histb[len(histb)-1]['clock'])))
          worksheet.write(row, 3, float(histb[0]['value']))
          worksheet.write(row, 4, float(histb[len(histb) - 1]['value']))
          worksheet.write(row, 5, float(histb[len(histb) - 1]['value'])-float(histb[0]['value']))
          if itemsc:
          histc = zapi.history.get(history=itemsc[0]['value_type'], itemids=itemsc[0]['itemid'],
          time_from=time_chng[i], time_till=time_chng[i+1], output='extend')
          if histc:
          # if i != 0:
          # worksheet.write(row, 9, datetime.fromtimestamp(time_chng[i]))
          worksheet.write(row, 6, float(histc[0]['value']))
          worksheet.write(row, 7, float(histc[len(histc) - 1]['value']))
          worksheet.write(row, 8, float(histc[len(histc) - 1]['value'])-float(histc[0]['value']))
          row += 1
          Last edited by Victor Sklyarov; 29-11-2021, 10:05.

          Comment

          • Alex_UUU
            Senior Member
            • Dec 2018
            • 541

            #6
            Как заметил предыдущий оратор :-) Через АПИ.
            В задаче, где нужные данные есть в последнем значении (они нарастающим итогом) лучше работать не через Хистори, а через Итем. Там есть ластвалюе.

            Comment

            • Victor Sklyarov
              Senior Member
              • Apr 2016
              • 184

              #7
              Я уже писал, что необходимо отслеживать замены принтеров. Last Value не годится для этого, необходимо просматривать History и искать моменты замены принтеров, в противном случае вы получите абракадабру. Ранее уже было обсуждение этой темы с формированием месячных отчётов через пользовательские интервалы. Ваше предложение аналогичное.





              Comment

              Working...