Ad Widget

Collapse

Не срабатывает выражение восстановления типа find

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • zabbix777
    Member
    • Nov 2023
    • 70

    #1

    Не срабатывает выражение восстановления типа find

    Здравствуйте
    Есть элемент данных типа траппер с типом информации текст. в него приходят данные в виде "шлюз отключен" "шлюз подключен" (это не обычный шлюз, который по IP можно контролировать. Есть только такой вариант получать инфу). Делаю триггер find(/Signals Metatrader 5/disconnect.gw,1m,"like","отключен")=1, а в выражение восстановление вставляю find(/Signals Metatrader 5/disconnect.gw,1m,"like","подключен")=1. Делаю тест сработки (есть возможность только сделать рестарт шлюзу. просто отключить на на минуту и включить не могу. Особенности ПО). Через мониторинг последних данных видно, что приходят сообщения "шлюз отключен" "шлюз подключен" с интервалом в 4-5 сек. При этом триггер на аварию срабатывает, а на восстановление нет. Восстановление сработает только в том случае, если повторно прийдут данные о подключении после 1 минуты.
    А как сделать так, чтобы исключить ложные сработки, когда шлюз начинает дребезжать (т.е. идут постоянные переконнекты в течении менее 1 минуты.), т.е. надо отловить только 1-ый сигнал об аварии и потом только последний сигнал о восстановлении?
    Attached Files
  • zabbix777
    Member
    • Nov 2023
    • 70

    #2
    Данные выглядят так
    Attached Files

    Comment

    • zabbix777
      Member
      • Nov 2023
      • 70

      #3
      извините, что-то я тут намудрил. я разобрался. Иногда важно мысль в текст превратить, и проблема решается. топик закрываю.

      Comment

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

        #4
        Пункт 1: выражение триггера пересчитывается тогда, когда приходит новое значение для любого из элементов данных, участвующих в выражении триггера.
        В вашем случае оно содержит один элемент данных, т.е. триггер будет пересчитываться каждый раз, когда приходит новое значение. Пришло значение "шлюз отключен" - триггер сработал, перешёл в состояние "Проблема".

        Пункт 2: выражение восстановление триггера проверяется лишь тогда, когда перестаёт выполняться основное выражение триггера.
        В вашем случае: пришло значение "шлюз подключен" менее через минуту после "шлюз отключен" - основное выражение триггера всё ещё выполняется, триггер остаётся в состоянии "Проблема", до вычисления выражения восстановления дело не доходит. Т.е. всё работает "by design".

        Если бы выражение триггера было более простым и проверяло лишь последнее значение, например:
        Code:
        find(/Signals Metatrader 5/disconnect.gw,#1,"like","отключен")=1
        (и без выражения восстановления вообще), то триггер бы срабатывал при получении нового значения, содержащего подстроку "отключен", и закрывался бы сразу же при получении любого значения, которое такую строку не содержит. Но, как вы верно заметили, в случае "дребезга" у вас будут множественные срабатывания/закрытия такого триггера. Если нужно, чтобы триггер закрывался лишь тогда, когда после прихода значения со строкой "подключен" прошло какое-то время (например, прошла минута), то возникает вопрос - как дать повод триггеру пересчитать своё выражение, если никаких новых значений не приходит? И тут мы переходим к пункту 3.

        Пункт 3: если выражение триггера содержит одну из временнЫх функций (date(), time(), now(), dayofweek(), dayofmonth(), а главное - nodata()), то, в дополнение к пункту 1, триггер пересчитывается просто по таймеру каждые 30 секунд.
        Отсюда следует, что, если мы хотим, чтобы триггер срабатывал сразу же после получения первого значения "шлюз отключен", а закрывался бы лишь через минуту после последнего значения "шлюз подключен", то выражение триггера могло бы быть, например, таким:
        Code:
        find(/Signals Metatrader 5/disconnect.gw,#1,"like","отключен")=1 or nodata(/Signals Metatrader 5/disconnect.gw,1m)=0
        Т.е. триггер сработает (и будет удерживать состояние "Проблема") в том случае, когда последнее полученное значение содержит подстроку "отключен" либо когда ещё не прошло минуты с последнего полученного значения. Закроется такой триггер тогда, когда оба этих условия перестанут выполняться, выражение восстановления не требуется.
        Тут, правда, есть один подводный камень: если ваш шлюз будет отключен долго (больше времени хранения истории для этого элемента данных), то условие тоже перестанет выполняться и триггер закроется.

        (добавлено)
        Ну вот, пока писал ответ - автор темы уже сам разобрался
        Last edited by Kos; 15-10-2024, 09:27.

        Comment

        • zabbix777
          Member
          • Nov 2023
          • 70

          #5
          Originally posted by Kos
          Пункт 1: выражение триггера пересчитывается тогда, когда приходит новое значение для любого из элементов данных, участвующих в выражении триггера.
          В вашем случае оно содержит один элемент данных, т.е. триггер будет пересчитываться каждый раз, когда приходит новое значение. Пришло значение "шлюз отключен" - триггер сработал, перешёл в состояние "Проблема".

          Пункт 2: выражение восстановление триггера проверяется лишь тогда, когда перестаёт выполняться основное выражение триггера.
          В вашем случае: пришло значение "шлюз подключен" менее через минуту после "шлюз отключен" - основное выражение триггера всё ещё выполняется, триггер остаётся в состоянии "Проблема", до вычисления выражения восстановления дело не доходит. Т.е. всё работает "by design".

          Если бы выражение триггера было более простым и проверяло лишь последнее значение, например:
          Code:
          find(/Signals Metatrader 5/disconnect.gw,#1,"like","отключен")=1
          (и без выражения восстановления вообще), то триггер бы срабатывал при получении нового значения, содержащего подстроку "отключен", и закрывался бы сразу же при получении любого значения, которое такую строку не содержит. Но, как вы верно заметили, в случае "дребезга" у вас будут множественные срабатывания/закрытия такого триггера. Если нужно, чтобы триггер закрывался лишь тогда, когда после прихода значения со строкой "подключен" прошло какое-то время (например, прошла минута), то возникает вопрос - как дать повод триггеру пересчитать своё выражение, если никаких новых значений не приходит? И тут мы переходим к пункту 3.

          Пункт 3: если выражение триггера содержит одну из временнЫх функций (date(), time(), now(), dayofweek(), dayofmonth(), а главное - nodata()), то, в дополнение к пункту 1, триггер пересчитывается просто по таймеру каждые 30 секунд.
          Отсюда следует, что, если мы хотим, чтобы триггер срабатывал сразу же после получения первого значения "шлюз отключен", а закрывался бы лишь через минуту после последнего значения "шлюз подключен", то выражение триггера могло бы быть, например, таким:
          Code:
          find(/Signals Metatrader 5/disconnect.gw,#1,"like","отключен")=1 or nodata(/Signals Metatrader 5/disconnect.gw,1m)=0
          Т.е. триггер сработает (и будет удерживать состояние "Проблема") в том случае, когда последнее полученное значение содержит подстроку "отключен" либо когда ещё не прошло минуты с последнего полученного значения. Закроется такой триггер тогда, когда оба этих условия перестанут выполняться, выражение восстановления не требуется.
          Тут, правда, есть один подводный камень: если ваш шлюз будет отключен долго (больше времени хранения истории для этого элемента данных), то условие тоже перестанет выполняться и триггер закроется.

          (добавлено)
          Ну вот, пока писал ответ - автор темы уже сам разобрался
          Спасибо. Все равно полезно было почитать, не много не так представлял его работу.

          Comment

          Working...