Ad Widget

Collapse

Предобработка данных макроса SNMP discovery. Как убрать лишние пробелы?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • registr76
    Junior Member
    • Jun 2021
    • 12

    #1

    Предобработка данных макроса SNMP discovery. Как убрать лишние пробелы?

    Версия Zabbix 6.2.6

    Здравствуйте.

    Собираю данные из таблицы регистрации клиентов WiFi на оборудовании Mikrotik.
    Для идентификации клиентов записываю данные о мак-адресе клиента в макрос {#SNMPVALUE}. В дальнейшем использую информацию при создании прототипов данных в полях NAME и KEY.

    Суть проблемы в следующем. Mikrotik по SNMP отдаёт данные о мак-адресе с разделителями в виде пробелов (Пример - "48 8F 5A 65 16 8C "), причём, в конце добавляет еще один пробел.
    Я пытался обработать эти данные с помощью Предобработки. Но, как оказалось, Zabbix обрабатывает не конкретный макрос, всю строку с данными вида:

    Code:
    [{"{#SNMPINDEX}":"72.143.90.101.22.140.1","{#SNMPVA LUE}":"48 8F 5A 65 16 8C ","{#RADIONAME}":"1 - TEST"},
    {"{#SNMPINDEX}":"108.59.107.77.231.45.1","{ #SNMPVALUE}":"6C 3B 6B 4D E7 2D ","{#RADIONAME}":"2 - TEST"}]
    Применить функцию {{#SNMPVALUE}regsub («...»,/)} в поле SNMP OID тоже не получилось. Вероятно в этом поле функции не работают.

    Если кто сталкивался проблемой подскажите как можно убрать лишний пробел в конце мак-адреса, перед сохранением данных в макрос {#SNMPVALUE}, а в идеале, заменить оставшиеся пробелы между октетами на двоеточие.​
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Можно использовать в самом правиле LLD предобработку с типом "JavaScript", чтобы преобразовать только нужную часть JSON-а таким образом, как нужно Вам.
    Например, следующий код вполне рабочий (разве что нет обработки ошибок на случай, если во входных данных нет элемента с именем "{#SNMPVALUE}"):
    Code:
    //transform source string into JSON object
    val_json=JSON.parse(value);
    //Regular expression: search the space globally
    re=/\s/g;
    //transform needed part of array (replace all spaces by colons, except the last ones)
    for (i in val_json) {
      val_json[i]["{#SNMPVALUE}"] = val_json[i]["{#SNMPVALUE}"].trim().replace(re,":");
    }
    //return result converted back to String
    return JSON.stringify(val_json);
    Для примера Ваших исходных данных:
    Code:
    [{"{#SNMPINDEX}":"72.143.90.101.22.140.1","{#SNMPVALUE}":"48 8F 5A 65 16 8C ","{#RADIONAME}":"1 - TEST"},
    {"{#SNMPINDEX}":"108.59.107.77.231.45.1","{#SNMPVALUE}":"6C 3B 6B 4D E7 2D ","{#RADIONAME}":"2 - TEST"}]​
    получается такой результат (разбито на две строки для читабельности):
    Code:
    [{"{#SNMPINDEX}":"72.143.90.101.22.140.1","{#SNMPVALUE}":"48:8F:5A:65:16:8C","{#RADIONAME}":"1 - TEST"},
    {"{#SNMPINDEX}":"108.59.107.77.231.45.1","{#SNMPVALUE}":"6C:3B:6B:4D:E7:2D","{#RADIONAME}":"2 - TEST"}]
    Last edited by Kos; 17-03-2023, 10:26.

    Comment

    • Semiadmin
      Senior Member
      • Oct 2014
      • 1625

      #3
      Ну, и, наконец, {{#SNMPVALUE}.regsub("(\w+)\s(\w+)\s(\w+)\s(\w+)\s (\w+)\s(\w+)","\1:\2:\3:\4:\5:\6")} тоже, думаю, должно сработать​

      Comment

      • registr76
        Junior Member
        • Jun 2021
        • 12

        #4
        Коллеги.

        Огромное спасибо за ответы. )

        Вариант с JavaScript в моём случае оказался рабочим.

        Вариант с Custom preprocessing проверить не смог. Нет такого пункта в списке поля NAME "Preprocessing steps". Возможно в моей версии zabbix (6.2.6) его еще нет, или уже нет.

        Вариант {{#SNMPVALUE}.regsub("(\w+)\s(\w+)\s(\w+)\s(\w+)\s (\w+)\s(\w+)","\1:\2:\3:\4:\5:\6")} пробовал ранее. В поле SNMP OID у меня функции макросов не работали. Использовал вот такую конструкцию.
        Code:
        discovery[{{#SNMPVALUE}.regsub("(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)","\1:\2:\3:\4:\5:\6")},1.3.6.1.4.1.14988.1.1.1.2.1.1,
        {#RADIONAME},1.3.6.1.4.1.14988.1.1.1.2.1.20]

        Comment

        • Semiadmin
          Senior Member
          • Oct 2014
          • 1625

          #5
          Так regsubприменяется не в самом LLD rule, а в прототипах айтемов / триггеров​

          Comment

          • registr76
            Junior Member
            • Jun 2021
            • 12

            #6
            Да. В прототипах работает без проблем.)

            Comment

            • Lurker
              Member
              • Nov 2016
              • 83

              #7
              А у меня в прототипе не работает.
              Точнее в имени работает cdp neighbor name {{#SNMPINDEX}.regsub("^\d*", \0)}
              а в ключе нет cdp.neighbor.name.[{{#SNMPINDEX}.regsub("^\d*", \0)}]
              Что я делаю не так?

              UPD в ключе нужен другой синтаксис. Вот так раборает
              neighbor.name.["{{#SNMPINDEX}.regsub("^\d*", \0)}"]
              Last edited by Lurker; 09-11-2023, 08:54.

              Comment

              Working...