Ad Widget

Collapse

Как вычислить корень из выражения?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • DIMMETAL
    Junior Member
    • Mar 2017
    • 13

    #1

    Как вычислить корень из выражения?

    Коллеги, у меня вопрос. Хочу извлечь корень из выражения
    Code:
    max("net.if.in[Intel(R) Wireless-N 7260,packets]",#1500)
    Может кто из вас сталкивался с проблемой извлечения корня? Потому что встроенной функции как я понимаю нет
  • DIMMETAL
    Junior Member
    • Mar 2017
    • 13

    #2
    частично решил проблему но все равно не р&#107

    Здравствуйте. Написал простейший скрипт, лежащий в папке внешней проверки на сервере, который получает значение и вычисляет из него корень.

    Скрипт bash называется test.sh
    Code:
    Koren=$1 echo "scale=5;sqrt($Koren) | bc"
    Внешняя проверка с ключем test.sh[81] выдает в результате 9. Т.е скрипт работает.
    Но когда я в скрипт передаю test.sh["net.if.in[192.168.1.40,packets"], функцию снятия трафика с хоста, которая у меня работает, появляется такая вот ошибка:
    Code:
    Received value [(standard_in) 1: syntax error(standard_in) 1: illegal character: I(standard_in) 1: illegal character: R(standard_in) 1: illegal character: W(standard_in) 1: syntax error(standard_in) 1: illegal character: N(standard_in) 1: syntax error] is not suitable for value type [Numeric (float)]
    Так же у меня есть вычисляемая функция, её ключ "v_minutu" а сама функция:sum("net.if.in[192.168.1.40,packets]",#1). Так вот если внешняя проверка выглядит так test.sh["v_minutu"], то мне передается "0". А если так "test.sh[$v_minutu]", то выдает ошибку
    Code:
    Received value [(standard_in) 1: syntax error] is not suitable for value type [Numeric (float)]
    .

    Помогите) Как мне передать значение трафика в функцию извлечения корня, что я делаю не так? Причем во всех настройках если что стоит число с плавающей точкой. Может кто то сталкивался с такой ошибкой?[/QUOTE]

    Comment

    • Viewer
      Senior Member
      • Oct 2012
      • 131

      #3
      Не понял зачем вообще извлекать корень.

      Comment

      • DIMMETAL
        Junior Member
        • Mar 2017
        • 13

        #4
        Originally posted by viewer
        Не понял зачем вообще извлекать корень.
        Мне нужно реализовать функцию стандартного отклонения, для которой нужно извлечение корня

        Comment

        • yukra
          Senior Member
          • Apr 2013
          • 1359

          #5
          Originally posted by dimmetal
          Но когда я в скрипт передаю test.sh["net.if.in[192.168.1.40,packets"], функцию снятия трафика с хоста, которая у меня работает, появляется такая вот ошибка
          А вы, простите, чем руководствовались, когда это выражение писали?

          Comment

          • DIMMETAL
            Junior Member
            • Mar 2017
            • 13

            #6
            Originally posted by yukra
            А вы, простите, чем руководствовались, когда это выражение писали?
            Тем что нет в интернете примеров как реализовывать такие механизмы. Я эксперементирую и у меня множество вариантов, но я не пойму в чем заключается ошибка и как сделать так, что бы в мою внешнюю проверку передавалось просто число.

            Comment

            • sadman
              Senior Member
              • Dec 2010
              • 1611

              #7
              В заббиксе невозможно в имя ключа включить _значение_ другого ключа.

              Comment

              • DIMMETAL
                Junior Member
                • Mar 2017
                • 13

                #8
                Originally posted by sadman
                В заббиксе невозможно в имя ключа включить _значение_ другого ключа.
                Если это так, то это действительно печально

                Comment

                • yukra
                  Senior Member
                  • Apr 2013
                  • 1359

                  #9
                  Originally posted by DIMMETAL
                  Тем что нет в интернете примеров как реализовывать такие механизмы. Я эксперементирую и у меня множество вариантов, но я не пойму в чем заключается ошибка и как сделать так, что бы в мою внешнюю проверку передавалось просто число.
                  Во первых: https://support.zabbix.com/browse/ZBXNEXT-552 - проголосуйте.

                  Дальше я вижу 2 возможных на данный момент направления:
                  1) Реализовать external check, который будет решать вашу проблему. Но вы не "передаете значение, из которого нужно вычислить корень", а передаете "имя параметра, из которого нужно вычислить корень.

                  Например у вас на свиче sw1 есть айтем "ifHCInOctets.[23]" с типом snmp-агент.
                  Вы делаете некий sw-sqrt.sh и передаете в него что-то типа {HOSTNAME},'ifHCInOctets.[23]' (то есть айтем получается "sw-sqrt.sh[{HOSTNAME},'ifHCInOctets.[23]']", тип - external check). Этот sw-sqrt.sh на основании ностнейма и параметра делает запрос к API (в данном случае https://www.zabbix.com/documentation...ce/history/get ), получает последнее значение, извлекает корень и возвращает в заббикс.

                  2) Реализовать функции, о которых идет речь в вышеуказанном тикете самостоятельно в исходном коде заббикса (ну или только нужные из них) ... и конечно же прислать пул реквест Тут вам помогут знания C (ведь именно сервер считает функции если я не путаю), и использовать их так же, как основные функции (но я думаю вы бы уже пошли этим путем, если бы могли бы).

                  В первом случае стоит обратит внимание, что значения могут "слегка уплывать по времени". Во первых как мы значем "период опроса" в айтеме лишь добавляет айтем в очередь на опрос через заданный интервал, а не гарантирует его (айтема) опрос. А во вторых у вас вполне может быть ситуация когда "фактический айтем снялся в 00:00 и 00:10, а вычисляеммый в 00:09 (корень от значения в 00:00) и в 00:19 (корень от 00:10).

                  Ну и еще, если вы пойдете первым путем, но у вас изначальный айтем не "дельта", а какое-то константное число, которое прям в таком виде уезжает в базу без преоброзования, то можно не морочиться с апи, а брать значение для извлечения корня оттуда же, откуда это делает zabbix штатным методом (например вам нужен корень от числа, число лежит в файлике /var/count и "какой-то софт его туда записывает каждую минуту стирая старое число". Вы делаете "обычный айтем" как "vfs.file.contents[/var/count]" и тогда значения для скрипта корня можно хоть zabbix-get'ом дернуть с того же самого агента (только не забывайте про невозможность выполнить 2 связанные проверки в одно время без костылей).

                  Зы надеюсь не очень вас запутал, буду признателен, если расскажите далекому от матана человеку как корень от трафика поможет вам жить, вдруг мне тоже нужно, а я до сих пор не знаю.

                  Comment

                  • DIMMETAL
                    Junior Member
                    • Mar 2017
                    • 13

                    #10
                    Спасибо спасибо спасибо

                    Originally posted by yukra
                    Во первых: https://support.zabbix.com/browse/ZBXNEXT-552 - проголосуйте.

                    Дальше я вижу 2 возможных на данный момент направления:
                    1) Реализовать external check, который будет решать вашу проблему. Но вы не "передаете значение, из которого нужно вычислить корень", а передаете "имя параметра, из которого нужно вычислить корень.

                    Например у вас на свиче sw1 есть айтем "ifHCInOctets.[23]" с типом snmp-агент.
                    Вы делаете некий sw-sqrt.sh и передаете в него что-то типа {HOSTNAME},'ifHCInOctets.[23]' (то есть айтем получается "sw-sqrt.sh[{HOSTNAME},'ifHCInOctets.[23]']", тип - external check). Этот sw-sqrt.sh на основании ностнейма и параметра делает запрос к API (в данном случае https://www.zabbix.com/documentation...ce/history/get ), получает последнее значение, извлекает корень и возвращает в заббикс.

                    2) Реализовать функции, о которых идет речь в вышеуказанном тикете самостоятельно в исходном коде заббикса (ну или только нужные из них) ... и конечно же прислать пул реквест Тут вам помогут знания C (ведь именно сервер считает функции если я не путаю), и использовать их так же, как основные функции (но я думаю вы бы уже пошли этим путем, если бы могли бы).

                    В первом случае стоит обратит внимание, что значения могут "слегка уплывать по времени". Во первых как мы значем "период опроса" в айтеме лишь добавляет айтем в очередь на опрос через заданный интервал, а не гарантирует его (айтема) опрос. А во вторых у вас вполне может быть ситуация когда "фактический айтем снялся в 00:00 и 00:10, а вычисляеммый в 00:09 (корень от значения в 00:00) и в 00:19 (корень от 00:10).

                    Ну и еще, если вы пойдете первым путем, но у вас изначальный айтем не "дельта", а какое-то константное число, которое прям в таком виде уезжает в базу без преоброзования, то можно не морочиться с апи, а брать значение для извлечения корня оттуда же, откуда это делает zabbix штатным методом (например вам нужен корень от числа, число лежит в файлике /var/count и "какой-то софт его туда записывает каждую минуту стирая старое число". Вы делаете "обычный айтем" как "vfs.file.contents[/var/count]" и тогда значения для скрипта корня можно хоть zabbix-get'ом дернуть с того же самого агента (только не забывайте про невозможность выполнить 2 связанные проверки в одно время без костылей).

                    Зы надеюсь не очень вас запутал, буду признателен, если расскажите далекому от матана человеку как корень от трафика поможет вам жить, вдруг мне тоже нужно, а я до сих пор не знаю.
                    Спасибо большое за такую огромную помощь! Буду сейчас переваривать все выше сказанное и решать что делать

                    Корень же мне нужна для того что бы реализовать функцию стандартного отклонения. Собирая значение о трафике в течении определенного количества времени, мы можем, на основании этих данных, найти пороговое значение трафика. При резком скачке трафика, не являющегося нормальным, для данного устройства будет выдаваться предупреждение.

                    Практическим использованием является разработка алгоритма, который на ранних стадиях детектирует DDoS атаку, когда она ещё не набрала полную силу.

                    Comment

                    • yukra
                      Senior Member
                      • Apr 2013
                      • 1359

                      #11
                      Originally posted by DIMMETAL
                      Практическим использованием является разработка алгоритма, который на ранних стадиях детектирует DDoS атаку, когда она ещё не набрала полную силу.
                      Я не знаю ваших условий, возможно они несколько отличаются от моих, но у себя я вижу след. картину - DDoS по http запросами - там атака на http-сервер, а не на канал. 1-2 Мбит "правильных" запросов (при скачках в 10-15Мбит туда-сюда) достаточно что бы свалить "неподготовленных" сервер, а "атака на канал" в моих реалиях выглядит как резкий рост до гигабитов меньше чем минуту, и единственное что помогает - автоматический выброс "проблемного" адреса в блекхол.

                      Comment

                      Working...