Ad Widget

Collapse

Оповещение по проценту Отчета SLA

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • IkarusKam
    Member
    • Dec 2023
    • 40

    #1

    Оповещение по проценту Отчета SLA

    Имеется SLA, который формирует отчет за Месяц. Возможно ли сделать так, чтобы оповещение отрабатывало если, по какой-либо услуге было меньше 99.3? Или Zabbix не поддерживает данный функционал?
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Начиная с версии Zabbix 6.0, есть действия на услуги (ссылка). Можно настроить оповещение, когда услуга меняет своё состояние (т.е. SLI падает ниже SLO).

    Comment

    • IkarusKam
      Member
      • Dec 2023
      • 40

      #3
      Originally posted by Kos
      Начиная с версии Zabbix 6.0, есть действия на услуги (ссылка). Можно настроить оповещение, когда услуга меняет своё состояние (т.е. SLI падает ниже SLO).
      Извините. Немного не понимаю... Данный вариант оповещение будет отрабатывать если "Любая" Услуга будет с Ошибкой.
      Вопрос какой - SLA за месяц Click image for larger version

Name:	image.png
Views:	145
Size:	14.1 KB
ID:	477290
      И если Месяц меньше - 99.3, то отрабатывает оповещение.
      А тот функционал, который предлагает сам Zabbix, там можно указать на "Main Услугу", но все услуги, которые включены в ней и если в "Main Услуге" будет ошибка, то триггер сработает, а так к сожалению не надо(

      Comment

      • Kos
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • Aug 2015
        • 3404

        #4
        Кажется, я был неправ; и услуга меняет своё состояние не когда "SLI падает ниже SLO" (как я писал), а сразу как срабатывает соответствующий триггер. В этом случае отослать сообщение при падении ниже определённого уровне не получится.

        Нужно будет это проверить.​

        (Добавлено)
        Проверил, действительно - так и есть: оповещения по услуге приходят, когда срабатывает или закрывается исходный триггер, сгенерировавший проблему. Никакие проценты при этом не учитываются
        Last edited by Kos; 17-01-2024, 16:10.

        Comment

        • IkarusKam
          Member
          • Dec 2023
          • 40

          #5
          А можно ли следить за цифрами из SLA с помощь "скрипта". Например тот же самый webhook? Есть какие-нибудь предложения?

          Comment

          • Kos
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • Aug 2015
            • 3404

            #6
            Originally posted by IkarusKam
            А можно ли следить за цифрами из SLA с помощь "скрипта". Например тот же самый webhook? Есть какие-нибудь предложения?
            Ну, скрипт-то написать можно, API для этого есть. Правда, занятие это не очень благодарное; но технически - да, можно (ссылка).​

            Comment

            • IkarusKam
              Member
              • Dec 2023
              • 40

              #7
              Code:
              from pyzabbix import ZabbixAPI
              import numpy as np
              
              # Указываем адрес, логин и пароль для подключения к Zabbix серверу
              
              ZABBIX_SERVER = 'Адрес Сервера'
              
              zapi = ZabbixAPI(ZABBIX_SERVER)
              zapi.login('Логин', 'Пароль')
              
              serviceids2 = zapi.sla.getsli(
                  slaid = "6", #Айди услугу, которая требовалась
              )
              
              serviceid = serviceids2.get('serviceids') #ID Всех сервисов по SLA № 6
              
              lol = serviceids2['sli'] #Берет ключ под наименование "sli"
              lol2 = lol[1] # Берет именно второй номер масива, так как их два
              sli = [sub['sli'] for sub in lol2] #Проценты sli в полном формате
              
              nameservice = zapi.service.get(
                  output="extend", #Тут он берет все парамметры в сервисах
              )
              massivnumber = []
              massivname = []
              massivall = []
              
              data = nameservice
              for item in data:
                  nameitem = item.get("name") #Берет имя услуги
                  nameserviceid = item.get("serviceid") #Берет ID услуги
                  massivname.append(((nameitem)))
                  massivnumber.append(((nameserviceid)))
                  massivall.append(((nameitem,nameserviceid))) #
              
              main3 = []
              
              for item2 in massivall:
                  id = int(item2[1])
                  if id in serviceid:
                      main3.append(item2)
              
              #n = len(main3) Сравнивал кол-во значений в массиве
              #m = len(sli)
              
              nn = [ '%.1f' % elem for elem in sli ]  #Делает одно число после запятой
              
              mainall = main3 + nn
              
              mainzero = [pair[0] for pair in main3]
              
              massivclear = []
              
              for name4, number5 in zip(nn, mainzero):              #Объединяет цифарки
                  massivclear.append(((name4,number5)))
              
              result = list(filter(lambda x: float(x[0]) < 99.3, massivclear)) #Присваивает все значение меньше 99.3 переменной - result
              
              print(result)
              ​
              Вот написал скрипт на питоне, теперь осталось его запускать с помощью заббикса и делать оповещения)
              Last edited by IkarusKam; 22-01-2024, 11:10.

              Comment

              • Kos
                Senior Member
                Zabbix Certified SpecialistZabbix Certified Professional
                • Aug 2015
                • 3404

                #8
                Originally posted by IkarusKam
                Вот написал скрипт на питоне, теперь осталось его запускать с помощью заббикса и делать оповещения)
                1) на этом форуме есть фозможность форматирования, в частности - символ # в панели инструментов включает тег "CODE" (а не "HTML", как у вас) - тогда можно корректно отформатировать с учётом отступов, которые в языке Python критичны (например, сейчас непонятно, где у вас границы циклов).

                2) при обращении к API можно указывать параметры, чтобы получить либо ограничить только нужные данные. Так, при вызове метода sla.getsli() можно указать, за какие именно периоды возвращать данные (в документации даже есть отдельная табличка с примерами использования различных комбинаций параметров period_from, period_to и periods), потому как по умолчанию возвращаются данные за последние 20 периодов. А при вызове service.get() можно передать массив serviceids, а в параметре output указать интересующие вас поля, чтобы не обрабатывать каждый раз полный список всех услуг со всеми их атрибутами.

                Comment

                • IkarusKam
                  Member
                  • Dec 2023
                  • 40

                  #9
                  Originally posted by Kos
                  1) на этом форуме есть фозможность форматирования, в частности - символ # в панели инструментов включает тег "CODE" (а не "HTML", как у вас) - тогда можно корректно отформатировать с учётом отступов, которые в языке Python критичны (например, сейчас непонятно, где у вас границы циклов).

                  2) при обращении к API можно указывать параметры, чтобы получить либо ограничить только нужные данные. Так, при вызове метода sla.getsli() можно указать, за какие именно периоды возвращать данные (в документации даже есть отдельная табличка с примерами использования различных комбинаций параметров period_from, period_to и periods), потому как по умолчанию возвращаются данные за последние 20 периодов. А при вызове service.get() можно передать массив serviceids, а в параметре output указать интересующие вас поля, чтобы не обрабатывать каждый раз полный список всех услуг со всеми их атрибутами.

                  Отредактировал сообщение выше. К сожалению параметры такие как period_from, period_to и period. Вывод у них не понятный, например - 1562626 (Такое число может выйти, как я понимаю это дата в секунда.)

                  А вот проблема с запуском из под Zabbix не получается решить в
                  python: can't open file '/home/support/Script.py': [Errno 13] Permission denied

                  Довольно странно, что не запускается, так как на файл такие права -
                  -rwxrwxrwx. 1 support support 2027 Jan 22 11:22 Script.py

                  Есть ли какие-нибудь предложения по решению данной проблемы?

                  UDP - Выдал права на папку - support и скрипт запустился.

                  Но теперь новая проблема - ModuleNotFoundError: No module named 'pyzabbix'. Его можно запустить из под системы без каких-либо проблем. Запуск с помощью zabbix_get -s 127.0.0.1 -p 10050 -k "Skript" не получает результата, так как не видит библиотеку.
                  pip install pyzabbix был произведен на всей системе.

                  Данная проблема решает установкой модуля в папку с самим скриптом. - pip install --target /home/support/ "Имя модуля"
                  Last edited by IkarusKam; 22-01-2024, 11:31.

                  Comment

                  • IkarusKam
                    Member
                    • Dec 2023
                    • 40

                    #10
                    Вопрос. Как можно создать Триггер, чтобы если вывод скрипта не - "Сообщение", то Триггер срабатывает?
                    Например - Вывод скрипта [('42.3', 'Тест'), ('60.4', 'Тест')] - И требуется, чтобы эти данные отправлялись с помощью Telegram.
                    Last edited by IkarusKam; 22-01-2024, 11:41.

                    Comment

                    • Kos
                      Senior Member
                      Zabbix Certified SpecialistZabbix Certified Professional
                      • Aug 2015
                      • 3404

                      #11
                      Originally posted by IkarusKam
                      Отредактировал сообщение выше. К сожалению параметры такие как period_from, period_to и period. Вывод у них не понятный, например - 1562626 (Такое число может выйти, как я понимаю это дата в секунда.
                      Спасибо. Теперь понятнее, но всё равно - не полностью. Так, например:
                      Code:
                       slaid = "6", #Айди услугу, которая требовалась
                      Услуга - это service; slaid - это айди не услуги, а объекта "SLA".

                      Или:
                      Code:
                      lol2 = lol[1] # Берет именно второй номер масива, так как их два
                      ​
                      Почему? Почему массивов два, и почему надо брать именно второй из них?

                      Ну это ладно, придирки; главное - чтобы оно работало так, как вам нужно.

                      Отметки времени (period_from и period_to) - да, это числа в формате unixtime (т.е. количество секунд, прошедших с 1 января 1970 года по Гринвичу). Параметр period - просто число (количество периодов; продолжительность периода задаётся при создании объекта SLA - сутки/неделя/месяц/год).
                      Вопрос. Как можно создать Триггер, чтобы если вывод скрипта не - "Сообщение", то Триггер срабатывает?
                      Например, так:
                      Code:
                      last(/ВашХост/Skript)<>"Сообщение"

                      Comment

                      • IkarusKam
                        Member
                        • Dec 2023
                        • 40

                        #12
                        Originally posted by Kos
                        Спасибо. Теперь понятнее, но всё равно - не полностью. Так, например:

                        Услуга - это service; slaid - это айди не услуги, а объекта "SLA".

                        Или:
                        Почему? Почему массивов два, и почему надо брать именно второй из них?

                        Ну это ладно, придирки; главное - чтобы оно работало так, как вам нужно.

                        Отметки времени (period_from и period_to) - да, это числа в формате unixtime (т.е. количество секунд, прошедших с 1 января 1970 года по Гринвичу). Параметр period - просто число (количество периодов; продолжительность периода задаётся при создании объекта SLA - сутки/неделя/месяц/год).
                        Например, так:
                        Code:
                        last(/ВашХост/Skript)<>"Сообщение"
                        Почему я беру второй массив, так как мне требуется второй месяц... Да глупо сделано и придаться менять скрипт каждый месяц, но попробую разобрать по глубже в API, чтобы брать за текущий месяц...

                        Вопрос, а как указать в имени Триггера значение вывода Элемента Данных. Например, чтобы в Алерте писало вывод скрипта.
                        Пример сообщения - В SLA [('42.5', 'Тест1'), ('60.5', 'Тест2')]. И он должен отрабатывать каждый день и писать вывод скрипта.​ - Это я реализовал обычным оповещением. Извиняюсь за глупый вопрос!)

                        Last edited by IkarusKam; 22-01-2024, 13:25.

                        Comment

                        • IkarusKam
                          Member
                          • Dec 2023
                          • 40

                          #13

                          Можно ли реализовать если в выводе скрипта изменяются данные, то триггер отрабатывает? Например -
                          [('42.5', 'Тест1'), ('60.5', 'Тест2')] в течение суток так, но проблема активна весит в Zabbix и к данной проблеме добавился [('42.5', 'Тест1'), ('60.5', 'Тест2'), ('62', 'Тест3')] и Триггер должен был сработать еще раз и отправить уведомление.

                          Comment

                          • Kos
                            Senior Member
                            Zabbix Certified SpecialistZabbix Certified Professional
                            • Aug 2015
                            • 3404

                            #14
                            Originally posted by IkarusKam
                            Вопрос, а как указать в имени Триггера значение вывода Элемента Данных. Например, чтобы в Алерте писало вывод скрипта.
                            Пример сообщения - В SLA [('42.5', 'Тест1'), ('60.5', 'Тест2')]. И он должен отрабатывать каждый день и писать вывод скрипта.​ - Это я реализовал обычным оповещением.
                            Ну, ответ "в лоб" на заданный вопрос - использовать в имени триггера макросы {ITEM.VALUE} или {ITEM.LASTVALUE} (ссылка). Макрос будет раскрываться в значение первого элемента данных из триггерного выражения на момент возникновения проблемы.
                            Но раз уж они нужны только в оповещениях, лучше бы эти макросы использовать в шаблоне оповещений в теле письма - тогда они будут корректно работать даже в случае многострочных значений.

                            Comment

                            • Kos
                              Senior Member
                              Zabbix Certified SpecialistZabbix Certified Professional
                              • Aug 2015
                              • 3404

                              #15
                              Originally posted by IkarusKam
                              Можно ли реализовать если в выводе скрипта изменяются данные, то триггер отрабатывает? Например -
                              [('42.5', 'Тест1'), ('60.5', 'Тест2')] в течение суток так, но проблема активна весит в Zabbix и к данной проблеме добавился [('42.5', 'Тест1'), ('60.5', 'Тест2'), ('62', 'Тест3')] и Триггер должен был сработать еще раз и отправить уведомление.
                              Можно сравнивать последнее значение с предыдущим. Например, такой триггер будет срабатывать в случае, когда последнее значение не пустое и при этом отличается от предыдущего:
                              Code:
                              length(last(/ВашХост/Skript))>0 and last(/ВашХост/Skript,#1)<>last(/ВашХост/Skript,#2)

                              Comment

                              Working...