Ad Widget

Collapse

Функция count - помогите разобраться

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • i.kulagin
    Member
    • Aug 2011
    • 35

    #1

    Функция count - помогите разобраться

    Доброго времени суток.
    Итак, мониторится виндовый сервис. По какой-то причине очень часто (раз в несколько часов) заббикс-агент выдает ложную информацию (тоже вопрос почему, кстати), что служба остановлена (т.е. цифру 6). Триггер настроен на last(0)#0, и, соответственно, по каждому чиху действие с уведомлением отправляем мне сообщение. Такое положение дел меня не устроило, триггер был переопределен на следующий: count(#4,0,ne)>3, т.е. срабатывает, если из последних 4х значений более 3х не равны 0 (ну чтоб 100% было понятно, что сервис действительно сдох). Так вот, сообщение о проблеме генерится и приходит как и задумано, а вот рекавери сообщение почему-то приходит сразу же, как только получаем первый 0 от заббикс-агента. Ну, соответственно, и триггер тоже сразу же переходит в состояние ОК, потому и генериться сообщение. Отсюда вопрос - я что-то упустил при настройке триггера, или так и задумано? Хотелось бы чтобы логика работы триггера в обратном направлении, была такой же, как и в прямом, т.е. только получив 4 нуля он переходил в состояние ОК и, соответственно, отправлялось сообщение.
    На всякий случай уточню, что trigger value="PROBLEM" установлено.
    Last edited by i.kulagin; 30-08-2011, 15:13.
  • dima_dm
    Senior Member
    • Dec 2009
    • 2697

    #2
    Вам нужен Гистерезис
    http://www.zabbix.com/documentation/...onfig/triggers
    ({TRIGGER.VALUE}=0&{server:temp.count(#4,0,ne)}>3) |
    ({TRIGGER.VALUE}=1&{server:temp.count(#4,0,eq)}<4)
    Last edited by dima_dm; 01-09-2011, 08:00. Reason: исправлена опечатка в триггере

    Comment

    • i.kulagin
      Member
      • Aug 2011
      • 35

      #3
      Оперативно. Спасибо за наводку, почитаю.

      Comment

      • i.kulagin
        Member
        • Aug 2011
        • 35

        #4
        Что-то пока не особо получается. Триггер переходит из состояния ОК в состояние ПРОБЛЕМА при каждой вновь полученной порции данных. При том, что сервис остановлен и получаю постоянно 6 (Service stopped). Собственно выражение для триггера выглядит так же, как в посте уважаемого dima_dm, только имена хоста (точнее шаблона) и элемента данных заменены на мои.
        Мне кажется, я не совсем понимаю пример из документации:
        ({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|
        ({TRIGGER.VALUE}=1&{server:temp.last(0)}>15)
        Предполагается, что при последнем значении температуры более 20 триггеру задается значение 0 ({TRIGGER.VALUE}=0), что, как я понимаю, эквивалентно состоянию ПРОБЛЕМА, правильно? И тут же, если температура >15, то состояние ОК. Это опечатка, и во втором случае должен был стоять знак "<", или я все же не понимаю логики работы этой конструкции?
        И еще вопросы:
        1.Означает ли, что в выражении {TRIGGER.VALUE}=0&{server:temp.last(0)}>20 значению триггера присваивается 0, если выполняется следующее за & условие?
        2.Эквивалентно ли значение триггера=0 состоянию ПРОБЛЕМА, а 1 - состоянию ОК?

        Comment

        • dima_dm
          Senior Member
          • Dec 2009
          • 2697

          #5
          Всё с точностью до наоборот.
          {TRIGGER.VALUE}=0 - OK
          {TRIGGER.VALUE}=1 - Problem
          {TRIGGER.VALUE} макрос, который возвращает текущее состояние триггера (его числовое значение). Значение макросу присваивает Zabbix в зависимости от текущего состояния триггера.
          Всё выражение, это логическое условие с операторами "и" и "или", никаких присвоений значений тут нет.

          В документации написано
          мы хотим определить триггер, который перейдет в состояние ПРОБЛЕМА если температура в серверной комнате поднимется выше 20 градусов. При этом триггер должен оставаться в состоянии ПРОБЛЕМА, пока температура не опустится ниже 15 градусов.
          ({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|
          ({TRIGGER.VALUE}=1&{server:temp.last(0)}>15)
          Last edited by dima_dm; 31-08-2011, 08:32.

          Comment

          • i.kulagin
            Member
            • Aug 2011
            • 35

            #6
            Не понимаю, блин .
            Если мы ничего не присваиваем, то что тогда означает запись
            ({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)
            Как вообще эту строку "расшифровать"? Если условие {server:temp.last(0)}>20 выполняется, то возвращается 0, как бы вместо этого выражения его подставляем, так? Затем выполняется операция логического И: 0И0=0. И это значение присваивается триггеру, правильно? Конечно неправильно! Но я не въезжаю как по другому всю эту "колбасу" интерпретировать.
            ----
            Кое что получилось вот с таким триггером:
            ({TRIGGER.VALUE}=0&{Template - Testing Item:service_state["Automatic Updates"].count(#4,0,ne)}>3) | ({TRIGGER.VALUE}=1&{Template - Testing Item:service_state["Automatic Updates"].count(#4,0,eq)}<3)
            Не знаю почему при .count(#4,0,eq)=4 во второй части выражения ничего не получилось и триггер скакал туда сюда. Однако, я все равно не понимаю что означает {TRIGGER.VALUE}=0/1. Откуда вообще возьмется значение {TRIGGER.VALUE}, если мы сейчас этот триггер и описываем? По логике вещей, дело должно обстоять так:
            1.Есть две части выражения справа и слева от |. Каждая из них чему то равна - 1 или 0.
            2.Если, для указанного выше примера, оба условия выполняются (более 3х ненулевых значений подряд), то каждая часть выражения равна 1, и в итоге имеем 1|1=1 - триггер в состоянии проблема.
            3.Если выполняется первое, но не выполняется второе условие - такой вариант, кажется, невозможен.
            4.Если выполняется второе условие, но не выполняется первое (т.е. меньше 3х нулей подряд, но и меньше 3х ненулевых значений из последних 4х (например, 6600)), то правая часть равна 0, левая 1, в итоге - 0|1=1 - триггер в состоянии ПРОБЛЕМА.
            5.Если обе часты не выполняются - 0|0=0 - триггер в состоянии ОК.
            Я правильно понимаю логику? Если правильно, то осталось понять как вычисляются правая и левая части выражения. Смущает запись {TRIGGER.VLUE}=0/1. Если это не присвоение, то что?
            Last edited by i.kulagin; 31-08-2011, 10:40. Reason: Кое-что получилось.

            Comment

            • dima_dm
              Senior Member
              • Dec 2009
              • 2697

              #7
              Логика очень простая
              ({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)
              Если триггер не в состоянии проблема и температура больше 20 градусов, то триггер сработает (в состоянии проблема)
              ({TRIGGER.VALUE}=1&{server:temp.last(0)}>15)
              Если триггер уже сработал, и температура больше 15 градусов, то триггер в состоянии проблема.
              А дальше объединяем эти два условия через или.
              ({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|({TRI GGER.VALUE}=1&{server:temp.last(0)}>15)
              Естественно, срабатывает либо правая, либо левая часть выражения, т.к. в один момент времени триггер может находиться либо в состоянии OK либо Problem.
              Last edited by dima_dm; 31-08-2011, 10:56.

              Comment

              • i.kulagin
                Member
                • Aug 2011
                • 35

                #8
                Теперь понял, спасибо.
                Видно затмение нашло .

                Comment

                Working...