Ad Widget

Collapse

Работа триггера от разных метрик. "Флап" триггера

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ya.asoloviev
    Junior Member
    • May 2015
    • 25

    #1

    Работа триггера от разных метрик. "Флап" триггера

    Добрый день.
    Прошу подсказать по настройке выражения триггера.
    Работать триггер должен так: прилетел трап UP - триггер загорелся, прилетел трап DOWN - триггер погас, если DOWN не прилетел в течении 5 минут - триггер погас.
    UP и DOWN трапы - это разные метрики.
    Обычно прилетает трап UP и через секунд 30 DOWN, но DOWN может и не прилететь, тогда триггер все равно погасить через 5 минут.
    Проблема: триггер загорается когда прилетает UP и горит примерно 30 секунд (первый 10, последующие 30), потом гаснет и сразу загорается и так на протяжении 5 минут.
    На данный момент моё выражение триггера такое:
    Code:
    (({TRIGGER.VALUE}=0 and {m10-ldr1:snmptrap[SYN-NOTIFICATION-MIB::syn-notification-anomaly-up-backup-portal-cutover].nodata(5m)}=0) or ({TRIGGER.VALUE}=1 and {m10-ldr1:snmptrap[SYN-NOTIFICATION-MIB::syn-notification-anomaly-up-backup-portal-cutover].nodata(5m)}=1)) and not ({TRIGGER.VALUE}=1 and {m10-ldr1:snmptrap[SYN-NOTIFICATION-MIB::syn-notification-anomaly-down-backup-portal-cutover].nodata(10m)}=0)
    (1: {TRIGGER.VALUE}=0 and {UP.nodata(5m)}=0 - зажигать Тригер если он не активен и были данные UP за 5 минут
    or
    2: {TRIGGER.VALUE}=1 and UP.nodata(300)}=1 - удерживать Тригер в 1 если он активен и нет новых данных UP 5 минут )
    and not
    3: {TRIGGER.VALUE}=1 and DOWN.nodata(10m)=0 - гасить тригер если пришел ДАУН и не разрешать зажигать 10 минут (это специально против зацикливания)

    Логическое выражение такое:
    (1or2) and not (3)

    Версия Zabbix 5.0.4
    Знаю, что такое выражение работает на другом сервере версии 3.2, но не понял почему на другом сервере триггер не флапает.
    Пробовал сделать попроще выражение: Выражение str.(UP)=1 Выражение восстановление: str.(DOWN)=1, но при приходе DOWN почему то триггер не гаснет.

    Click image for larger version

Name:	m10.jpg
Views:	216
Size:	102.3 KB
ID:	419965
    Click image for larger version

Name:	image_2021-02-16_15-00-20.png
Views:	180
Size:	60.0 KB
ID:	419966
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Любое триггерное выражение в Zabbix пересчитывается, когда приходит новое значение для любого из элементов данных, входящих в него.
    Кроме того, при наличии временнЫх триггерных функций (nodata(), в частности) дополнительно к этому триггерное выражение пересчитывается каждые 30 секунд. Раньше этот пересчёт выполнялся отдельным процессом timer (на нулевой и 30-й секунде каждой минуты), в версии 4.0 этот пересчёт был переделан: он теперь выполняется процессами history syncer и более "размазан" по времени. Возможно, этим объясняется разница в поведении серверов различных версий.

    Однако, в любом случае, триггерное выражение у Вас составлено не так, чтобы оно вело себя, как Вы ожидаете.
    Code:
    (1: {TRIGGER.VALUE}=0 and {UP.nodata(5m)}=0 - зажигать Тригер если он не активен и были данные UP за 5 минут
    тут согласен, и это срабатывает
    Code:
    2: {TRIGGER.VALUE}=1 and UP.nodata(300)}=1 - удерживать Тригер в 1 если он активен и нет новых данных UP 5 минут )
    Уже ошибка. Сразу же после прихода новых данных выражение "nodata(300)=1" будет ложным, что приведёт к закрыванию триггера при первом же пересчёте (и впоследствии - каждые 30 секунд, вплоть до истечения пяти минут с прихода события UP).
    Code:
    3: {TRIGGER.VALUE}=1 and DOWN.nodata(10m)=0 - гасить тригер если пришел ДАУН и не разрешать зажигать 10 минут (это специально против зацикливания)
    Ещё одна ошибка. После закрытия триггера выражение "{TRIGGER.VALUE}=1" будет ложным; соответственно, и вся эта часть - тоже. Поэтому вся эта конструкция никак не мешает срабатыванию триггера заново, если он закрылся.

    Собственно, именно это у вас и происходит: первое условие зажигает триггер, второе - гасит в течение 30 секунд, третье - не мешает зажигать его снова, а затем триггер срабатывает вновь по первому условию (пока не истекут оговоренные в нём 5 минут).

    Могу ошибаться, но мне кажется, что логика выражения могла бы быть гораздо проще:
    Code:
    {UP.nodata(5m)}=0    //приходило значение метрики UP в течение последних 5 минут
    and
    {DOWN.nodata(10m)}=1 //и в течение 10 минут до этого значения DOWN не было
    Соответственно, гаситься такой триггер будет, когда одно из этих условий перестанет выполняться: либо придёт значение DOWN (и это не даст триггеру зажигаться вновь в течение 10 минут), либо пройдёт 5 минут с прихода UP. Вроде бы, Вы именно такого поведения хотите, если я Вас правильно понял.

    Comment

    • ya.asoloviev
      Junior Member
      • May 2015
      • 25

      #3
      Originally posted by Kos
      Могу ошибаться, но мне кажется, что логика выражения могла бы быть гораздо проще:
      Code:
      {UP.nodata(5m)}=0 //приходило значение метрики UP в течение последних 5 минут
      and
      {DOWN.nodata(10m)}=1 //и в течение 10 минут до этого значения DOWN не было
      Соответственно, гаситься такой триггер будет, когда одно из этих условий перестанет выполняться: либо придёт значение DOWN (и это не даст триггеру зажигаться вновь в течение 10 минут), либо пройдёт 5 минут с прихода UP. Вроде бы, Вы именно такого поведения хотите, если я Вас правильно понял.
      Огромное спасибо, так отрабатывает как было описано.
      Правда я подглядел в соседней теме и применил другую практику, хоть и логика будет отличаться: добавил элемент данных [UP|DOWN] к уже имеющимся метрикам UP и DOWN.
      Триггер: [UP|DOWN].str(UP)=1 and [UP].nodata(5m)=0
      Т.е. почти тоже самое, только тут триггер снова загорится, если после того как погаснет сразу придёт UP (без таймаута в 10 минут).


      Comment

      Working...