Ad Widget

Collapse

Как узнать минимальное значение элемента данных без хранения всей истории.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Lurker
    Member
    • Nov 2016
    • 83

    #1

    Как узнать минимальное значение элемента данных без хранения всей истории.

    по snmp опрашивается 1 элемент данных. Нужно получить минимальное значение за всё время без хранения всей истории.
    Пробовал через вычисляемый элемент, создав по сути функцию нахождения минимума от последнего значения самого вычисляемого элемента и последнего значения опрашиваемого элемента, но она не заработала т.к. при первом вычислении ругается на то, что в вычисляемом элементе ещё нет значений.
    Через предобработку javascript тоже не получилось, т.к. нельзя получить доступ к предыдущему значению элемента данных.
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    С вычисляемым элементом данных, как раз, вопрос технически решаемый (если таких айтемов не надо сандалить много), хотя и муторный.
    Например:
    • копипастим куда-нибудь нужную формулу вычисляемого элемента данных;
    • меняем тип элемента данных с "Вычисляемый" на, например, "Zabbix траппер" (не меняя тип самих данных - если было число, то пускай и остаётся число);
    • спустя минуту после сохранения изменений - засылаем желаемое первое значение утилитой zabbix_sender;
    • убедившись, что значение пришло (видим его на экране Latest data), меняем обратно тип на "Вычисляемый", восстанавливая нужные формулу и расписание.

    Comment

    • Lurker
      Member
      • Nov 2016
      • 83

      #3

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

      Comment

      • Semiadmin
        Senior Member
        • Oct 2014
        • 1625

        #4
        А как выглядит та самая неработающая функция? Думаю, комьюнити научит ее работать

        Comment

        • Lurker
          Member
          • Nov 2016
          • 83

          #5
          (last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[{#SNMPINDEX}])<last(/temperature by ciscoEnvMonMib/temp.sensor.min.[{#SNMPINDEX}]))*last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[{#SNMPINDEX}])+(last(/temperature by ciscoEnvMonMib/temp.sensor.min.[{#SNMPINDEX}])<=last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[{#SNMPINDEX}]))*last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[{#SNMPINDEX}])

          Для понимания логики. Результат работы операции сравнения 0 или 1. соответственно значение меньшего элемента умножится на 1, а большего на ноль. После сложения получим значение меньшего элемента.

          Comment

          • Alex_UUU
            Senior Member
            • Dec 2018
            • 541

            #6
            А если вместо того, что написал KOS сделать предобработку на неподдерживаемое?
            первое вычисление: значений last нет, элемент переходит в неподдерживаемые. Если нужна минимальное значение, то в предобработке при неподдерживаемом выставляем заведомо большое значение, например 9999
            Второе вычисление: last уже есть, равное 9999, получаем текущее 37.7
            Третье и т.д - все идет по плану.

            Comment

            • Lurker
              Member
              • Nov 2016
              • 83

              #7
              Не помогает. Всё равно ругается
              Cannot evaluate function: item "/temperature by ciscoEnvMonMib/temp.sensor.temp.[3]" does not exist at "last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[3])<last(/temperature by ciscoEnvMonMib/temp.sensor.min.[3]))*last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[3])+(last(/temperature by ciscoEnvMonMib/temp.sensor.min.[3])<=last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[3]))*last(/temperature by ciscoEnvMonMib/temp.sensor.temp.[3])".

              Понимаете в чём тонкость. Проблема не в том, что функция выдаёт неверное значение, а в том, что функция НЕ выдаёт значение. А раз значения нет, то нет и предобработки. Ну я так это понял.​

              Comment

              • Alex_UUU
                Senior Member
                • Dec 2018
                • 541

                #8
                Хм, странно себя ведет ЭД.
                Сделал ЭД test_test. в Формулу написал last(zabbix[trigger])+last(test_test)
                Время обновления - минута.
                Первый элемент - существует и значения есть.
                В предобработке поставил "неподдерживаемые - задавать значение в -999".
                Проверяю тестом - все Ок. Делаю выполднить сейчас - в хистори появляется -999 - это первый опрос, что логично, значения у test_test нет. Потом появляется правильное значение. Делаю тест - ошибок уже нет. Элементы активные. Но...
                Ощущение, что в вычисляемых элементах есть проблема с получением данных у самого себя.
                Надо попробовать через промежуточный.. Или... кстати, для твоего случая:
                вычисляемый элемент, а формула min(реальный ЭД,#2) - вроде всегда будет выдавать минималку.

                Comment


                • Semiadmin
                  Semiadmin commented
                  Editing a comment
                  Есть несложный трюк, дабы в современных версиях получить "данные у самого себя", когда там их нет. Вместо last() можно использвать sum(#1), что то же самое, что и last(), но при отсутствии данных даст 0 без обработки неподдерживаемости.
              • Lurker
                Member
                • Nov 2016
                • 83

                #9
                Originally posted by Alex_UUU
                Делаю тест - ошибок уже нет. Элементы активные. Но...
                Ощущение, что в вычисляемых элементах есть проблема с получением данных у самого себя.
                Надо попробовать через промежуточный.. Или... кстати, для твоего случая:
                вычисляемый элемент, а формула min(реальный ЭД,#2) - вроде всегда будет выдавать минималку.
                1)Не понял, почему ощещение что проблема с получением данных у самого себя, если у тебя всё заработало?
                2)не понял. оно же вернёт минималку из последних двух значений. а мне нужно минималку за всё время существования элемента данных(что может быть больше, чем время хранения истории)

                Comment

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

                  #10
                  Lurker, а какая версия Zabbix у вас используется?
                  В современных версиях есть штатная функция min() (ссылка, также см. примеры в самом конце - где примеры корректного/некорректного синтаксиса).
                  Это позволяет просто перечислить нужные элементы данных в качестве параметров данной функции, упрощая выражение (избавляясь от необходимости трюка с умножением на 0 или 1).
                  А проверять, есть ли данные в истории (за какой-то разумный срок - например, двукратный период обновления элемента данных) можно функцией count() (ссылка). И тут, как раз, этот трюк может пригодиться Хотя вряд ли это поможет, т.к. умножение нуля на "неизвестно" всё равно даст "неизвестно" (ссылка).

                  А вот, кстати, вполне вероятно, что функция min() и выдаст сразу правильный результат - даже если один из операндов отсутствует.​

                  Comment

                  • Lurker
                    Member
                    • Nov 2016
                    • 83

                    #11
                    6.2 я пошёл другим путём, где мне не нужно считать минимум. Если не прокатит, то вернусь к функциям агрегации.Кстати спасибо за наводку на них, они мне уже пригодились.

                    Comment

                    Working...