Имеется SLA, который формирует отчет за Месяц. Возможно ли сделать так, чтобы оповещение отрабатывало если, по какой-либо услуге было меньше 99.3? Или Zabbix не поддерживает данный функционал?
Ad Widget
Collapse
Оповещение по проценту Отчета SLA
Collapse
X
-
Извините. Немного не понимаю... Данный вариант оповещение будет отрабатывать если "Любая" Услуга будет с Ошибкой.Начиная с версии Zabbix 6.0, есть действия на услуги (ссылка). Можно настроить оповещение, когда услуга меняет своё состояние (т.е. SLI падает ниже SLO).
Вопрос какой - SLA за месяц
И если Месяц меньше - 99.3, то отрабатывает оповещение.
А тот функционал, который предлагает сам Zabbix, там можно указать на "Main Услугу", но все услуги, которые включены в ней и если в "Main Услуге" будет ошибка, то триггер сработает, а так к сожалению не надо(Comment
-
Кажется, я был неправ; и услуга меняет своё состояние не когда "SLI падает ниже SLO" (как я писал), а сразу как срабатывает соответствующий триггер. В этом случае отослать сообщение при падении ниже определённого уровне не получится.
Нужно будет это проверить.
(Добавлено)
Проверил, действительно - так и есть: оповещения по услуге приходят, когда срабатывает или закрывается исходный триггер, сгенерировавший проблему. Никакие проценты при этом не учитываются
Last edited by Kos; 17-01-2024, 16:10.Comment
-
-
Вот написал скрипт на питоне, теперь осталось его запускать с помощью заббикса и делать оповещения)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
-
1) на этом форуме есть фозможность форматирования, в частности - символ # в панели инструментов включает тег "CODE" (а не "HTML", как у вас) - тогда можно корректно отформатировать с учётом отступов, которые в языке Python критичны (например, сейчас непонятно, где у вас границы циклов).
2) при обращении к API можно указывать параметры, чтобы получить либо ограничить только нужные данные. Так, при вызове метода sla.getsli() можно указать, за какие именно периоды возвращать данные (в документации даже есть отдельная табличка с примерами использования различных комбинаций параметров period_from, period_to и periods), потому как по умолчанию возвращаются данные за последние 20 периодов. А при вызове service.get() можно передать массив serviceids, а в параметре output указать интересующие вас поля, чтобы не обрабатывать каждый раз полный список всех услуг со всеми их атрибутами.
Comment
-
Отредактировал сообщение выше. К сожалению параметры такие как period_from, period_to и period. Вывод у них не понятный, например - 1562626 (Такое число может выйти, как я понимаю это дата в секунда.)1) на этом форуме есть фозможность форматирования, в частности - символ # в панели инструментов включает тег "CODE" (а не "HTML", как у вас) - тогда можно корректно отформатировать с учётом отступов, которые в языке Python критичны (например, сейчас непонятно, где у вас границы циклов).
2) при обращении к API можно указывать параметры, чтобы получить либо ограничить только нужные данные. Так, при вызове метода sla.getsli() можно указать, за какие именно периоды возвращать данные (в документации даже есть отдельная табличка с примерами использования различных комбинаций параметров period_from, period_to и periods), потому как по умолчанию возвращаются данные за последние 20 периодов. А при вызове service.get() можно передать массив serviceids, а в параметре output указать интересующие вас поля, чтобы не обрабатывать каждый раз полный список всех услуг со всеми их атрибутами.
А вот проблема с запуском из под 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
-
-
Спасибо. Теперь понятнее, но всё равно - не полностью. Так, например:
Услуга - это service; slaid - это айди не услуги, а объекта "SLA".Code:slaid = "6", #Айди услугу, которая требовалась
Или:
Почему? Почему массивов два, и почему надо брать именно второй из них?Code:lol2 = lol[1] # Берет именно второй номер масива, так как их два
Ну это ладно, придирки; главное - чтобы оно работало так, как вам нужно.
Отметки времени (period_from и period_to) - да, это числа в формате unixtime (т.е. количество секунд, прошедших с 1 января 1970 года по Гринвичу). Параметр period - просто число (количество периодов; продолжительность периода задаётся при создании объекта SLA - сутки/неделя/месяц/год).
Например, так:Вопрос. Как можно создать Триггер, чтобы если вывод скрипта не - "Сообщение", то Триггер срабатывает?
Code:last(/ВашХост/Skript)<>"Сообщение"
Comment
-
Почему я беру второй массив, так как мне требуется второй месяц... Да глупо сделано и придаться менять скрипт каждый месяц, но попробую разобрать по глубже в API, чтобы брать за текущий месяц...Спасибо. Теперь понятнее, но всё равно - не полностью. Так, например:
Услуга - это service; slaid - это айди не услуги, а объекта "SLA".
Или:
Почему? Почему массивов два, и почему надо брать именно второй из них?
Ну это ладно, придирки; главное - чтобы оно работало так, как вам нужно.
Отметки времени (period_from и period_to) - да, это числа в формате unixtime (т.е. количество секунд, прошедших с 1 января 1970 года по Гринвичу). Параметр period - просто число (количество периодов; продолжительность периода задаётся при создании объекта SLA - сутки/неделя/месяц/год).
Например, так:
Code:last(/ВашХост/Skript)<>"Сообщение"

Вопрос, а как указать в имени Триггера значение вывода Элемента Данных. Например, чтобы в Алерте писало вывод скрипта.
Пример сообщения - В SLA [('42.5', 'Тест1'), ('60.5', 'Тест2')]. И он должен отрабатывать каждый день и писать вывод скрипта. - Это я реализовал обычным оповещением. Извиняюсь за глупый вопрос!)
Last edited by IkarusKam; 22-01-2024, 13:25.Comment
-
Можно ли реализовать если в выводе скрипта изменяются данные, то триггер отрабатывает? Например -
[('42.5', 'Тест1'), ('60.5', 'Тест2')] в течение суток так, но проблема активна весит в Zabbix и к данной проблеме добавился [('42.5', 'Тест1'), ('60.5', 'Тест2'), ('62', 'Тест3')] и Триггер должен был сработать еще раз и отправить уведомление.
Comment
-
Ну, ответ "в лоб" на заданный вопрос - использовать в имени триггера макросы {ITEM.VALUE} или {ITEM.LASTVALUE} (ссылка). Макрос будет раскрываться в значение первого элемента данных из триггерного выражения на момент возникновения проблемы.Вопрос, а как указать в имени Триггера значение вывода Элемента Данных. Например, чтобы в Алерте писало вывод скрипта.
Пример сообщения - В SLA [('42.5', 'Тест1'), ('60.5', 'Тест2')]. И он должен отрабатывать каждый день и писать вывод скрипта. - Это я реализовал обычным оповещением.
Но раз уж они нужны только в оповещениях, лучше бы эти макросы использовать в шаблоне оповещений в теле письма - тогда они будут корректно работать даже в случае многострочных значений.Comment
-
Можно сравнивать последнее значение с предыдущим. Например, такой триггер будет срабатывать в случае, когда последнее значение не пустое и при этом отличается от предыдущего:Можно ли реализовать если в выводе скрипта изменяются данные, то триггер отрабатывает? Например -
[('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
Comment