Ad Widget

Collapse

Из текста "26 c/78 f" получить число

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Alexs
    Junior Member
    • Oct 2014
    • 5

    #1

    Из текста "26 c/78 f" получить число

    Доброго дня.
    Как преобразовать тип Character в Numeric.
    Вопрос элементарный но ответа не нашел.
    Описание.
    Железка по SNMP отдает температуру в текстовом виде.
    Тип данных Character.
    26 C/78 F
    25 C/77 F
    Как это преобразовать в чиловой тип данных.
    Пните пожалуйста в нужном направлении.
    Zabbix 2.2.6
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    Originally posted by Alexs
    Доброго дня.
    Как преобразовать тип Character в Numeric.
    Вопрос элементарный но ответа не нашел.
    Думаю, что до сих пор никак.

    Originally posted by Alexs
    Железка по SNMP отдает температуру в текстовом виде.
    Тип данных Character.
    26 C/78 F
    Знакомая ситуация. QNAP почему-то все еще считает, что температура строкой - это супер для удаленного мониторинга.

    Я делал скрипт, который драл с QNAP через snmpget, рубил AWK-ой строку и слал через zabbix_sender на сервер учета.
    Last edited by sadman; 20-10-2014, 14:59.

    Comment

    • Alexs
      Junior Member
      • Oct 2014
      • 5

      #3
      Понятно, тоже QNAP подключаю.

      У меня было предположение (возможно ошибочное).
      Создать вычисляемый источник данных, его натравить на текстовый источник SNMP и regexp взять необходимое значение.
      Т.е. в вычисляемом источнике получим температуру из текста.

      Странно что-так нельзя. Можно парсить журналы и текст, а готовый источник данных нельзя?

      Comment

      • sadman
        Senior Member
        • Dec 2010
        • 1611

        #4
        Originally posted by Alexs
        Понятно, тоже QNAP подключаю.

        У меня было предположение (возможно ошибочное).
        Создать вычисляемый источник данных, его натравить на текстовый источник SNMP и regexp взять необходимое значение.
        Т.е. в вычисляемом источнике получим температуру из текста.
        Можете взять и создать вычисляемый элемент данных, но проблема в том, что вычислять regexp он будет как для триггера - на предмет совпадения с маской. А вам-то надо получить фрагмент строки, чего не предусмотрено на данный момент.

        Originally posted by Alexs
        Странно что-так нельзя. Можно парсить журналы и текст, а готовый источник данных нельзя?
        Дайте-ка ссылку на парсинг текста, может я что-то пропустил в мануале.

        Тут я вижу ту же логику в работе log[файл,<регулярное выражение>,<кодировка>,<макс. кол-во строк>,<режим>,<вывод>] - делается сравнение с маской, если совпадение есть, то возвращается вся строка. Вычисления в смысле расчленения не производится.

        Вот, кстати, в соседней теме упомянут интересный вариант - загружаемые модули. Если чуете в себе силу, то можете создать ключик, который будет производить полноценное вычисление regexp и отдавать $1 обратно.
        Last edited by sadman; 21-10-2014, 15:35.

        Comment

        • Alexs
          Junior Member
          • Oct 2014
          • 5

          #5
          Originally posted by sadman
          Можете взять и создать вычисляемый элемент данных, но проблема в том, что вычислять regexp он будет как для триггера - на предмет совпадения с маской.
          Как вариант мне подходит. Идея в следующем:
          1. regexp оцифровываем первую цыфру, в первый вычисляемый источник данных. Как полагаю надо в одно выражение запихать 10 regexp, это возможно?
          2. regexp оцифровываем вторую цифру, во второй вычисляемый.
          3. третий вычисляемый элемент итоговый = первый * 10 + второй
          В итоге получим нужное.

          Originally posted by sadman
          Дайте-ка ссылку на парсинг текста, может я что-то пропустил в мануале.
          Такого не нашел, было мое предположение. Зато теперь понятно как работает чтение логов в Заббикс, Спасибо.

          Originally posted by sadman
          Вот, кстати, в соседней теме упомянут интересный вариант - загружаемые модули. Если чуете в себе силу, то можете создать ключик, который будет производить полноценное вычисление regexp и отдавать $1 обратно.
          Знаю С++, думаю смогу написать, но это не подходит. там про агент а у меня SNMP. Следуя логике системы (ИМХО) надо создавать новый тип данных например "конвертация" и через него реализовывать разные преобразования. Но для этого надо как минимум поработать с системой и поковырятся в исходниках, дабы понять взаимосвязи и как создать новый тип данных.

          Comment

          • sadman
            Senior Member
            • Dec 2010
            • 1611

            #6
            Originally posted by Alexs
            Как вариант мне подходит. Идея в следующем:
            1. regexp оцифровываем первую цыфру, в первый вычисляемый источник данных. Как полагаю надо в одно выражение запихать 10 regexp, это возможно?
            Непонятно... Триггерный regexp не оцифровывает, он дает 1 или 0 - совпало или не совпало. Как в это прокрустово ложе всунуть математику - я не очень представляю. Т.е. что-то типа 1*{/^1/}+2*{/^2/}+...9*{/^9/}? Монстрообразно выйдет. Пробовать не буду

            Originally posted by Alexs
            Знаю С++, думаю смогу написать, но это не подходит. там про агент а у меня SNMP.
            В мануале написано "...Zabbix 2.2 появляется поддержка загружаемых модулей для расширения Zabbix агента и сервера без ущерба производительности."
            Т.е. вроде бы и сервер может модули вызывать внутри себя.

            Originally posted by Alexs
            Следуя логике системы (ИМХО) надо создавать новый тип данных например "конвертация"
            Представляется, что можно создать элемент данных regexp.it[param, regexp, conversion_type], где param - имя ключа для айтема, в котором лежит, к примеру, строка с температурой кунапа. Внутри функции через API по param найти эту строку и подвергнуть ее вычислению через заданный regexp. затем произвести return $1 с предварительной конвертацией согласно conversion_type.

            Comment

            • sadman
              Senior Member
              • Dec 2010
              • 1611

              #7
              Немного вам помогу:

              Code:
              #cat checks_simple.c |more
              ...
                      if (0 == strcmp(request.key, "net.tcp.service"))
                      {
                              if (SYSINFO_RET_OK == check_service(&request, item->interface.addr, result, 0))
                                      ret = SUCCEED;
                      }
              ...
                else
                      {
                              /* it will execute item from a loadable module if any */
                              if (SUCCEED == process(item->key, PROCESS_MODULE_COMMAND, result))
                                      ret = SUCCEED;
                      }
              ...
              Таким образом видно, что загружаемый модуль вызывается при использовании типа "простая проверка". А она осуществляется без агента, силами серверной части.

              Comment

              • Alexs
                Junior Member
                • Oct 2014
                • 5

                #8
                Originally posted by sadman
                Непонятно... Триггерный regexp не оцифровывает, он дает 1 или 0 - совпало или не совпало. Как в это прокрустово ложе всунуть математику - я не очень представляю. Т.е. что-то типа 1*{/^1/}+2*{/^2/}+...9*{/^9/}? Монстрообразно выйдет. Пробовать не буду
                Возможно попробую , Спасибо.

                Originally posted by sadman
                В мануале написано "...Zabbix 2.2 появляется поддержка загружаемых модулей для расширения Zabbix агента и сервера без ущерба производительности."
                Т.е. вроде бы и сервер может модули вызывать внутри себя.
                Ок, надо пробовать.


                Originally posted by sadman
                Представляется, что можно создать элемент данных regexp.it[param, regexp, conversion_type], где param - имя ключа для айтема, в котором лежит, к примеру, строка с температурой кунапа. Внутри функции через API по param найти эту строку и подвергнуть ее вычислению через заданный regexp. затем произвести return $1 с предварительной конвертацией согласно conversion_type.
                Как заббик передает параметры в модуль и как получает из него, для меня пока тёмный лес.
                Решено, пишу модуль конвертации.
                План работ, 1. создать виртуальную машину, установить убунту, установить заббикс 2.2, пакеты компиляции - 2дня.
                2. написать модуль 1 день.
                3. подключить к заббикс и протестировать Х.З.

                Описание модуля: передаваемые в модуль параметры
                1. Character - т.е. сама строка из которой надо получить число.
                2. Int - номер символа в строке с началом числа, по умолчанию 0
                3. int - тип возвращаемого значение 0- int (по умолчанию) 1-float
                Возвращаемое значение оно одно и необходимого типа, при неудаче преобразования возвращается 0.

                Есть несколько нюансов, вроде в заббих используется bigint? и надо обрабатывать минус?
                Предположительно так, есть дополнения, уточнения?

                Comment

                • sadman
                  Senior Member
                  • Dec 2010
                  • 1611

                  #9
                  Originally posted by alexs
                  Описание модуля: передаваемые в модуль параметры
                  1. Character - т.е. сама строка из которой надо получить число.
                  2. Int - номер символа в строке с началом числа, по умолчанию 0
                  3. Int - тип возвращаемого значение 0- int (по умолчанию) 1-float
                  Предположительно так, есть дополнения, уточнения?
                  Есть вопрос: что конкретно вы собрались писать - загружаемый модуль или патч для Заббикса? Т.е. как он будет выглядеть во фронтенде - простой проверкой, новым типом данных или чем-то еще? Без знания этого невозможно выдвигать уточнения.

                  Comment

                  • Alexs
                    Junior Member
                    • Oct 2014
                    • 5

                    #10
                    Originally posted by sadman
                    Есть вопрос: что конкретно вы собрались писать - загружаемый модуль или патч для Заббикса? Т.е. как он будет выглядеть во фронтенде - простой проверкой, новым типом данных или чем-то еще? Без знания этого невозможно выдвигать уточнения.
                    Ломать только установленный заббикс нет желания, да и понимания как он работает пока тоже нет.
                    Писать буду модуль к серверу, а вот как он взаимодействует с заббикс сервером, надо узнавать.

                    Comment

                    • yukra
                      Senior Member
                      • Apr 2013
                      • 1359

                      #11
                      Originally posted by alexs
                      Ломать только установленный заббикс нет желания, да и понимания как он работает пока тоже нет.
                      Писать буду модуль к серверу, а вот как он взаимодействует с заббикс сервером, надо узнавать.
                      Я предложил бы написать скрипт внешней проверки и не мучатся.

                      Comment

                      Working...