Ad Widget

Collapse

пользовательский макрос равен вычисляе&a

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • tjma
    Junior Member
    • Apr 2016
    • 9

    #1

    пользовательский макрос равен вычисляе&a

    Добрый день.
    Подскажите, возможно ли такое организовать. zabbix 3.0
    Я создал вычисляемый элемент sum1, он вычисляется по формуле sum("server:eventid16",600).
    дальше мне надо подставить значение sum1 в макрос. То есть чтобы {$macro1}=sum1.
    но при попытке вывести {$macro1} в оповещение я получаю просто sum1, вместо числа.
    Я также пробовал сделать {$macro1}= {server:eventid16.sum(60m)}, но в оповещении также получаю просто строку {server:eventid16.sum(60m)} вместо числа.

    что-то подобное нагуглить или найти на форуме, к сожалению, не удалось
  • karik-himik
    Senior Member
    • Oct 2015
    • 116

    #2
    А Вам принципиально нужен именно Пользовательский макрос в оповещении ? Или просто для красоты и удобства ?

    Ведь если у Вас уже есть элемент sum1, то в оповещении его значение можно получить через {ITEM.LASTVALUE<1-9>} или {ITEM.VALUE<1-9>}

    Comment

    • tjma
      Junior Member
      • Apr 2016
      • 9

      #3
      Мне нужно было чтобы у некоторых хостов был макрос с формулой, и я мог выводить значение в оповещение, а в случае хостов у которых нет макроса с таким названием получал бы обычное "unknown".
      Но вопрос уже не актуален. Я понял, что моя задумка так не решается, поэтому пошел в сторону создание элементов и отдельных оповещений.

      Comment

      • glebs.ivanovskis
        Senior Member
        • Jul 2015
        • 237

        #4
        Попробуйте просто в тексте оповещения написать {server:eventid16.sum(60m)}. Zabbix поддерживает макросы вида {host:item.func(params)} в каких-то местах. Вместо конкретного host можно использовать {HOST.HOST}. И даже вычисляемый элемент не нужен, мне кажется.

        Comment

        • tjma
          Junior Member
          • Apr 2016
          • 9

          #5
          glebs.ivanovskis
          Да, этот способ я знаю, но это жестко привязывает данное выражение к конкретному узлу, хотелось бы иметь больше возможностей, чтобы оповещение можно было использовать с разными узлами. А это получается невозможным.
          Просто чтобы другие тоже были в курсе:
          1) можно в оповещение использовать {host:item.func(params)} (zabbix 3.0) мы получим результат выражения.
          2) можно использовать {host:item.func({$MACRO})} мы получим аналогично предыдущему результат.

          3) написать {$macro} в оповещении, и при этом {$macro}={host:item.func(params)} работать не будет и выведет как простой текст "{host:item.func(params)}"
          4) написать {$macro} в оповещении, и при этом {$macro}=a+b работать не будет и выведет как простой текст "a+b".
          мне хотелось использовать вариант 3, тогда достаточно было бы создавать пользовательский макрос, и не создавать оповещения для отдельных узлов.

          я решил использовать вариант 2, и создал для группы узлов лишь один дополнительный вид оповещений.

          Comment

          • glebs.ivanovskis
            Senior Member
            • Jul 2015
            • 237

            #6
            Originally posted by tjma
            2) можно использовать {host:item.func({$MACRO})} мы получим аналогично предыдущему результат.
            Аналогично какому? Мне казалось, это должно работать.

            В плане общего оповещения для всех хостов, можно использовать {{HOST.HOST}:item.func(param)}. (Просто так, к сведению, по-моему, немногие об этой возможности знают.)

            Comment

            • tjma
              Junior Member
              • Apr 2016
              • 9

              #7
              Originally posted by glebs.ivanovskis
              Аналогично какому? Мне казалось, это должно работать.

              В плане общего оповещения для всех хостов, можно использовать {{HOST.HOST}:item.func(param)}. (Просто так, к сведению, по-моему, немногие об этой возможности знают.)
              Если использовать использовать {host:item.func({$MACRO})} и пользовательский макрос равен para, то мы получим результат, как и в примере если использовать {host:item.func(params)}.

              Про использование глобальных макросов, это я в курсе, спасибо.

              Comment

              • kapitan.tumanov
                Junior Member
                • Aug 2019
                • 5

                #8
                Добрый день!

                Стоит не совсем стандартная задача:
                Существует группа устройств(контроллеры судовых VSAT антенн) которые опрашиваются по SNMP.
                Сформирован шаблон со следующими Items:
                RelativeAzimuth - относительный азимут в направлении на спутник;
                VesselHeading - курс судна (показания гирокомпаса судна).
                Необходимо на основе получаемых данных RelativeAzimuth и VesselHeading вычислять абсолютный азимут. Т.к. Zabbix умеет только лишь складывать значения (без всяких условий) есть необходимость во внешних проверках (External Check).

                Написан простой скрипт AbsAz.sh:
                #!/bin/sh
                sum=`echo "$1+$2" | bc -l`
                if [ $(echo "$sum >= 360" | bc -l) -eq 1 ];
                then
                AbsAz=`echo "$sum-360" | bc -l`
                else
                AbsAz=$sum
                fi
                echo $AbsAz

                Добавлен новый Item External Check с ключем AbsAz.sh[71.5,128.5] (ради теста) - все работает и вычисляется.
                Но вот как запихнуть в параметры отдаваемые скрипту последние значения других Items неясно, каков синтаксис. Есть ли вообще такая возможность?
                Если через пользовательские макросы, то все-таки можно их формировать на основе последних значений других Items?
                Данная задача критична, т.к. далее предстоит другая более сложная внешняя проверка. Заранее спасибо!
                -----------------------------------------------

                P.S. от безысходности перепробовал даже то,что по идее и работать не должно:
                AbsAz.sh[{Maritime_SAILOR900_ACU_SNMP:RelativeAzimuth.last( )},{Maritime_SAILOR900_ACU_SNMP:VesselHeading.last ()}]
                AbsAz.sh["{Maritime_SAILOR900_ACU_SNMP:RelativeAzimuth.last ()}","{Maritime_SAILOR900_ACU_SNMP:VesselHeading.l ast()}"]
                AbsAz.sh[{{HOST.NAME}:RelativeAzimuth.last()}",{{HOST.NAME} :VesselHeading.last()}]
                AbsAz.sh["{{HOST.NAME}:RelativeAzimuth.last()}","{{HOST.NAM E}:VesselHeading.last()}"]
                AbsAz.sh[{RelativeAzimuth.last()}",{VesselHeading.last()}]
                AbsAz.sh["{RelativeAzimuth.last()}","{VesselHeading.last()} "]

                Comment

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

                  #9
                  kapitan.tumanov, боюсь, что так это не работает.

                  External Check-и придуманы для получения каких-то новых значений нестандартными способами, а не для обработки уже полученных предыдущих значений.
                  Т.е. передать предыдущие значения в этот скрипт не получится; но можно (если вы этого хотите) передать туда какие-то статичные параметры (скажем, IP устройства и OID-ы), чтобы из этого скрипта по SNMP (скажем, snmpget-ом) получать нужные значения, преобразовывать их как вам надо и возвращать итоговый результат.

                  В Zabbix v4.2 в предобработку добавлена возможность строить свои функции на JavaScript-е; но для вашей задачи это тоже мало помогает, т.к. препроцессинг работает для каждой метрики отдельно и нет возможности обратиться к последнему значению другой метрики.

                  Могу предложить, разве что, использовать вычисляемые элементы данных. Там можно обращаться к последним данным других элементов данных, к тому же можно использовать тот факт, что логические выражения (скажем, сравнения на больше/меньше) возвращают арифметический ноль или единицу. Т.е. можно написать что-то вроде следующего:
                  Code:
                  (last(RelativeAzimuth) + last(VesselHeading)) - 360 * ((last(RelativeAzimuth) + last(VesselHeading))>360)
                  Только нужно тщательно спланировать интервалы обновлений (лучше даже использовать расписания вместо интервалов) для каждого элемента данных, чтобы вычисляемый считался после того как обновлены оба исходных элемента данных.

                  Comment

                  • kapitan.tumanov
                    Junior Member
                    • Aug 2019
                    • 5

                    #10
                    Kos, спасибо за развернутый ответ - в общем-то это все решило

                    Попробую вычисляемые элементы данных.

                    Еще есть идея обращаться в БД Zabbix внешним скриптом и брать посл значения item'ов - потому как следующую задачу вычисляемыми элементами уже не решить (Zabbix не знает тригонометрию).

                    Comment

                    • kapitan.tumanov
                      Junior Member
                      • Aug 2019
                      • 5

                      #11
                      Доброго времени суток.

                      Update:
                      Вычисляемый Item работает на ура!
                      Для следующей задачи с расчетом азимута, исходя из координат:
                      Написал скрипт в который отправляю нужные OID'ы (предварительно создав пользовательские макросы), Community, {HOST.CONN}, и, как вы советовали, в скрипте получаю snmp get'ом, обрабатываю и считаю как мне нужно.

                      Спасибо большое. Все отлично работает.

                      P.S. Кстати интересно, в каких случаях ExternalChecks начинают снижать производительность Zabbix? Т.к. у себя я ничего подобного не заметил.

                      Comment

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

                        #12
                        Спасибо, что отписались о результатах.
                        Originally posted by kapitan.tumanov
                        Кстати интересно, в каких случаях ExternalChecks начинают снижать производительность Zabbix? Т.к. у себя я ничего подобного не заметил.
                        Полагаю, это может становиться заметным либо когда таких проверок много (поскольку на каждую создаётся отдельный дочерний процесс), либо когда они долгие (и начинают превышать тайм-аут сервера).

                        Comment

                        • kapitan.tumanov
                          Junior Member
                          • Aug 2019
                          • 5

                          #13
                          Доброго времени суток!

                          Все-таки возник еще вопрос по вычисляемым Items:
                          Использую формулу, как ранее вы и предлагали (только немного модифицированную):
                          Code:
                          ((last(RelativeAzimuth,60) + last(VesselHeading,60)) - 360 * ((last(RelativeAzimuth,60) + last(VesselHeading,60))>360))*(count(VesselHeading,60)>0)
                          Т.е. при непоступлении значения элемента VesselHeading значение вычисляемого элемента обращается в "0".

                          Но я так и не понял, как сделать так, чтобы вычисляемый элемент не выводил ничего, если нет данных VesselHeading?

                          Comment

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

                            #14
                            Я не совсем понял, какого результата вы пытаетесь добиться, передавая значение 60 в функцию last() (которое там всё равно игнорируется).

                            Вычисляемый элемент будет выдавать какое-то значение в соответствии со своим собственным расписанием.
                            Другое дело, что можно при желании явно выдавать в качестве результата что-то некорректное (скажем, отрицательное число для типа "Integer (unsigned)"), что будет приводить к ошибке и, как следствие, пропуску такого значения. Начиная с версии 4.2 можно в предобработке явно предусмотреть это и обрабатывать более корректно, без возникновения ошибок.

                            Comment

                            • kapitan.tumanov
                              Junior Member
                              • Aug 2019
                              • 5

                              #15
                              Прошу прощения. Я видимо хотел добиться того, чтобы указать <сдвиг_времени>, оно ведь не игнорируется как я понял, и все равно это не решает ничего. Так что, согласен, бред.

                              Comment

                              Working...