Ad Widget

Collapse

Триггер не работает из-за операторов "and" и &am

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • longcat
    Junior Member
    • Feb 2015
    • 5

    #1

    Триггер не работает из-за операторов "and" и &am

    версия забикса 2.4.3

    Триггер взял из примера в документации
    ({TRIGGER.VALUE}=0 and {server:vfs.fs.size[/,free].max(5m)}<10G) or
    ({TRIGGER.VALUE}=1 and {server:vfs.fs.size[/,free].min(10m)}<40G)

    подменил в нём выражения на свои
    ({TRIGGER.VALUE}=0 and {hostname.net:asterisk.registry.last()} > {hostname.net:asterisk.registryon.min(900)}) or
    ({TRIGGER.VALUE}=1 and {hostname.net:asterisk.registry.last()} <> {hostname.net:asterisk.registryon.last()})

    итемы работают нормально, тригеры с этими же итемами нормально работоают, если в них нет and или or

    Тот, который не работает, выдает ошибку "Format error or unsupported operator. Exp: [0and120]", 0 это {TRIGGER.VALUE}=0, а 120 это {hostname.net:asterisk.registry.last()} > {hostname.net:asterisk.registryon.min(900)})
    значит оператор сравнения выдает в результате не 1 если ложь или 0 если истина как я думал, а выдает то значение, которое больше

    а мне надо, чтобы если первое выражение истина тогда триггер переходит в состояние проблема и находится в нём 15 минут, а когда второе выражение ложно, тогда тригер переходит в состояние ОК

    смотрел доки на zabbix.com, смотрел и на английском и на русском, и изменения в 2.4, но то ли я дурак, то ли лыжи не едут

    простые сравнения работают как надо, а вот такие составные условия почему то нет

    очень прошу подскажите, как выражение написать, или хотя бы где почитать про то, как операторы заббикса работают
  • aib
    Senior Member
    • Jan 2014
    • 1615

    #2
    смешной вопрос - а у вас, случайно, пробелы вокруг and и or сохранились?

    Нельзя писать без пробелов, даже если есть скобки и прочие знаки.
    Sincerely yours,
    Aleksey

    Comment

    • longcat
      Junior Member
      • Feb 2015
      • 5

      #3
      Originally posted by aib
      смешной вопрос - а у вас, случайно, пробелы вокруг and и or сохранились?

      Нельзя писать без пробелов, даже если есть скобки и прочие знаки.
      конечно, обязательно, я видел это требование в изменениях к 2.4

      Comment

      • aib
        Senior Member
        • Jan 2014
        • 1615

        #4
        В документации пишут
        Code:
        All operators, except unary - and not, have left-to-right associativity.
        И получается, что ваш триггер=0 сравнивается со значением .last(0), вместо сравнения со значением "сравнения"

        попробуйте вторую часть выражения в скобочки поставить
        ({TRIGGER.VALUE}=0 and ({hostname.net:asterisk.registry.last()} > {hostname.net:asterisk.registryon.min(900)})) or
        ({TRIGGER.VALUE}=1 and ({hostname.net:asterisk.registry.last()} <> {hostname.net:asterisk.registryon.last()}))
        Sincerely yours,
        Aleksey

        Comment

        • longcat
          Junior Member
          • Feb 2015
          • 5

          #5
          Originally posted by aib
          В документации пишут
          Code:
          All operators, except unary - and not, have left-to-right associativity.
          И получается, что ваш триггер=0 сравнивается со значением .last(0), вместо сравнения со значением "сравнения"

          попробуйте вторую часть выражения в скобочки поставить
          ({TRIGGER.VALUE}=0 and ({hostname.net:asterisk.registry.last()} > {hostname.net:asterisk.registryon.min(900)})) or
          ({TRIGGER.VALUE}=1 and ({hostname.net:asterisk.registry.last()} <> {hostname.net:asterisk.registryon.last()}))
          спасибо, действительно
          но всё равно триггер выпадает с ошибкой
          Format error or unsupported operator. Exp: [0and1.000000]

          Comment

          • longcat
            Junior Member
            • Feb 2015
            • 5

            #6
            Originally posted by aib
            В документации пишут
            Code:
            all operators, except unary - and not, have left-to-right associativity.
            И получается, что ваш триггер=0 сравнивается со значением .last(0), вместо сравнения со значением "сравнения"

            попробуйте вторую часть выражения в скобочки поставить
            ({trigger.value}=0 and ({hostname.net:asterisk.registry.last()} > {hostname.net:asterisk.registryon.min(900)})) or
            ({trigger.value}=1 and ({hostname.net:asterisk.registry.last()} <> {hostname.net:asterisk.registryon.last()}))
            простите великодушно моё тугодумие, но вообще я правильно составляю выражение?
            есть два целочисленных значения, надо чтобы оба были равны, а если не равны, тогда на 15 минут включается проблема, но если значения снова равны, тригер должен перейти в состояние ок

            Comment

            • rough-84
              Senior Member
              • Oct 2014
              • 198

              #7
              Если честно я не знаю такого, чтобы проблема включалась на определенное время. В данном случае при срабатывании триггера он будет висеть до того момента пока не сработает условие{hostname.net:asterisk.registry.last() } <> {hostname.net:asterisk.registryon.last()}, то есть о по они не станут равны.
              Частота проверок зависит от времени получения новых данных в элементах.
              Если у вас данные обновляются раз в 15 минут, тогда конечно вы правы.

              Comment

              • sadman
                Senior Member
                • Dec 2010
                • 1611

                #8
                Я вижу камень преткновения в "на 15 минут включается проблема". В выражении триггера невозможно узнать его возраст (нет соотв. макроса).

                Поэтому конструкции вида {hostaram_1.last()} > {hostaram_2.min(900)} неприменимы в виду того, что они будут держать взведенный триггер не до тех пор, пока не истечет 900 сек, а пока в этом "отрезке прошлого" не произошло ожидаемых изменений. Т.е., например, если на протяжении 18000 сек в каждом цикле вычисления выражения триггера окажется, что "900 сек. вычислений назад" param_1 > param_2, то триггер будет активен все 18000 сек.

                Comment

                • rough-84
                  Senior Member
                  • Oct 2014
                  • 198

                  #9
                  Originally posted by sadman
                  ЯТ.е., например, если на протяжении 18000 сек в каждом цикле вычисления выражения триггера окажется, что "900 сек. вычислений назад" param_1 > param_2, то триггер будет активен все 18000 сек.
                  Точняк, даже если бы не ругался на синтаксис, такой триггер просто взорвёт вам почту. В момент когда сработавший триггер придёт в норму, то есть :
                  ({trigger.value}=1 and ({hostname.net:asterisk.registry.last()} <> {hostname.net:asterisk.registryon.last()}))
                  В течении 15 минут триггер будет прыгать из состояния в состояние, тем самым генеря вам лишние уведомления.
                  Один раз я в гестериозе случайно во втором условии поставил вместо знака> знак<, триггер конечно же сработал ночью, с утра выгребал 1000+ сообщений.

                  Comment

                  • sadman
                    Senior Member
                    • Dec 2010
                    • 1611

                    #10
                    Так, я погорячился, свернул в сторону вычисления возраста триггера.

                    При использовании некоторых функций можно добиться "держания" триггера определенное время, но в лабораторных условиях, в реальности наверняка же придется использовать трехэтажные зависимости.
                    По вашим условиям я бы изобразил выражение как-то так:

                    (t.val=0 and (a.last()<>b.last()) and (b.delta(900)>0)) or (t.val=1 and (a.last()<>b.last()) and (b.delta (900)=0))

                    Триггер поднимется при расхождении параметров и будет держаться до их совпадения (b вернется к значению a или a достигнет значения b). Так же он деактивируется, когда b перейдет в устоявшееся значение, сохраняющееся не менее 900sec - b.delta()
                    Но, повторюсь, есть немалый шанс на то, что триггер все равно будет мотать в реальных условиях - если b станет дребезжать.

                    Comment

                    • sadman
                      Senior Member
                      • Dec 2010
                      • 1611

                      #11
                      Originally posted by longcat
                      спасибо, действительно
                      но всё равно триггер выпадает с ошибкой
                      Format error or unsupported operator. Exp: [0and1.000000]
                      Кстати, а типы данных совпадают? Вот этот 1.00000 мне напоминает float, а не integer.

                      Comment

                      • longcat
                        Junior Member
                        • Feb 2015
                        • 5

                        #12
                        Originally posted by sadman
                        Кстати, а типы данных совпадают? Вот этот 1.00000 мне напоминает float, а не integer.
                        спасибо большое за ответы, пока перевариваю
                        что касается типа данных оба целые положительные, агенту тоже передаются как целые, вообще не пойму откуда эти 1.00000

                        Comment

                        Working...