Ad Widget

Collapse

Сложный прототип триггеров

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Alex1987
    Member
    • Nov 2015
    • 55

    #1

    Сложный прототип триггеров

    Товарищи, взываю к вашей помощи!
    Есть устройство для мониторинга: шасси медиа-конвертеров с конвертерами, 16 слотов, в каждом слоте МК с одним оптическим и одним медным портом.
    Создал LLD шаблон. В шаблоне 4 эл-та данных:
    1. статус медного порта (1-up, -1-down, -2-извлечен),
    2. статус оптического порта (1-up, -1-down, -2-извлечен),
    3. ifAlias,
    4. description на слоте.

    Нужно создать прототип триггеров, чтобы при изменении состояния порта с "1" на "-1" была проблема, которая уходила бы только в случае возвращения к "1".
    Я сделал так:
    ({TRIGGER.VALUE}=0 and ({CCT:TX.ifOperStatus[{#SNMPINDEX}].diff()}=1 and {CCT:TX.ifOperStatus[{#SNMPINDEX}].last()}=-1)) or
    ({TRIGGER.VALUE}=1 and {CCT:TX.ifOperStatus[{#SNMPINDEX}].last()}=1)
    но после повторного опроса устройства (в моём случае через 30 сек.), проблема исчезает (потому что отрабатывает условие с diff()).
    Помогите советом!
    Спасибо.
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    В чем идея с diff()?

    Comment

    • yukra
      Senior Member
      • Apr 2013
      • 1359

      #3
      Originally posted by Alex1987
      Товарищи, взываю к вашей помощи!
      Есть устройство для мониторинга: шасси медиа-конвертеров с конвертерами, 16 слотов, в каждом слоте МК с одним оптическим и одним медным портом.
      Создал LLD шаблон. В шаблоне 4 эл-та данных:
      1. статус медного порта (1-up, -1-down, -2-извлечен),
      2. статус оптического порта (1-up, -1-down, -2-извлечен),
      3. ifAlias,
      4. description на слоте.

      Нужно создать прототип триггеров, чтобы при изменении состояния порта с "1" на "-1" была проблема, которая уходила бы только в случае возвращения к "1".
      Я сделал так:
      ({TRIGGER.VALUE}=0 and ({CCT:TX.ifOperStatus[{#SNMPINDEX}].diff()}=1 and {CCT:TX.ifOperStatus[{#SNMPINDEX}].last()}=-1)) or
      ({TRIGGER.VALUE}=1 and {CCT:TX.ifOperStatus[{#SNMPINDEX}].last()}=1)
      но после повторного опроса устройства (в моём случае через 30 сек.), проблема исчезает (потому что отрабатывает условие с diff()).
      Помогите советом!
      Спасибо.
      "{CCT:TX.ifOperStatus[{#SNMPINDEX}].diff()}<>1" чем не устраивает?

      Comment

      • Alex1987
        Member
        • Nov 2015
        • 55

        #4
        Originally posted by sadman
        В чем идея с diff()?
        Смысл в том, что надо, чтобы триггер отрабатывал тогда, когда:
        последнее состояние порта изменилось и изменилось на состояние"-1". Если написать триггер, типа:
        {CCT:TX.ifOperStatus[{#SNMPINDEX}].last()}=-1, то тогда в алярмы высыпят все порты с таким состоянием, а мне не это нужно. Нужны только те, которые изменили состояние. Вот.

        Comment

        • Alex1987
          Member
          • Nov 2015
          • 55

          #5
          Originally posted by yukra
          "{cct:tx.ifoperstatus[{#snmpindex}].diff()}<>1" чем не устраивает?
          Если так сделать, то в алярмы выкидывает ВСЕ порты. Это не то, что надо.

          Comment

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

            #6
            У Вас в самом конце опечатка: должно сравниваться с единицей не на равенство, а на неравенство.

            Первая фраза Вашего выражения верная: "Если триггер был в статусе OK, то перевести его в статус PROBLEM, если значение метрики изменилось, причём на "-1" (down)". Разве что условие diff() здесь избыточно, но оно и мешать не должно.

            А вот смысл второй фразы должен быть: "Если триггер уже в статусе PROBLEM, то оставаться в этом состоянии, пока текущее значение будет не равно единице (т.е. up)".

            Comment

            • Alex1987
              Member
              • Nov 2015
              • 55

              #7
              Originally posted by kos
              У Вас в самом конце опечатка: должно сравниваться с единицей не на равенство, а на неравенство.

              Первая фраза Вашего выражения верная: "Если триггер был в статусе ok, то перевести его в статус problem, если значение метрики изменилось, причём на "-1" (down)". Разве что условие diff() здесь избыточно, но оно и мешать не должно.

              А вот смысл второй фразы должен быть: "Если триггер уже в статусе problem, то оставаться в этом состоянии, пока текущее значение будет не равно единице (т.е. Up)".
              Спасибо, так заработало!
              Я, видимо, неправильно понял логику применения гистерезиса.

              Comment

              Working...