Ad Widget

Collapse

Препроцессинг JS для LLD с SNMP запросом

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • fractal90
    Senior Member
    • Jun 2019
    • 177

    #1

    Препроцессинг JS для LLD с SNMP запросом

    Привет, может кто подсказать как правильно использовать препроцессинг JS для изменения полученного значения по SNMP в правиле LLD?

    у меня есть правило LLD которые обнаруживает интерфейсы Vlan
    Code:
    discovery[{#IFNAME_LOGICAL_INT},IF-MIB::ifName, {#IFOPERSTATUS}, IF-MIB::ifOperStatus, {#IFALIAS}, IF-MIB::ifAlias, {#IFSPEED}, IF-MIB::ifSpeed]
    и фильтр для добавления только vlan интерфейсов
    Code:
    {#IFNAME_LOGICAL_INT_NEW} совпадет Vl+
    интерфейсы обнаруживаются с именами
    • Vl100
    • Vl101
    • Vl102
    я хочу через JS поменять им имя, создал такое
    Code:
    var interface_name = {
        'Vl100' : 'Main channel',
        'Vl101' : 'Backup channel',
        'Vl102' : 'L3vpn channel'
     };
    
    var value = JSON.parse(value);
    
    for (var i in value) {
        value[i]['{#IFNAME_LOGICAL_INT_NEW}'] = interface_name[value[i]['#IFNAME_LOGICAL_INT']] || value[i]['#IFNAME_LOGICAL_INT'];
    }
    
    return JSON.stringify(value);
    может где то еще что не учел? в прототипе в имени сделал так,

    8. {#IFNAME_LOGICAL_INT_NEW} - BANDWIDTH

    но имя видимо не применяется после препроцессинга к прототипам
    Last edited by fractal90; 14-05-2025, 05:41.
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    fractal90, вы всё делаете верно, но только описываете не шибко последовательно - не очень понятно, что и где в какой момент у вас получается.
    Логично было бы описывать примерно в таком стиле:
    • использую Zabbix такой-то версии;
    • имею то-то и то-то (правило LLD для обнаружения интерфейсов Vlan, оно работает и выдаёт такой-то JSON на выходе);
    • хочу того-то и того-то (иметь в этом JSON'е дополнительное поле, где содержится более информативное имя интерфейса);
    • для этого я пытаюсь сделать то-то и то-то (с помощью препроцессинга добавить такое поле, вот код JavaScript, который я для этого использую);
    • в результате после препроцессинга (например, нажимая кнопку "Тест") я получаю... (что именно получаете? работает ваш код, как ожидается, или нет?)
    • в прототипах элементов данных я использую свой добавленный LLD-макрос следующим образом (поле "Имя" у меня определено так: ...), однако после отрабатывания правила LLD в сгенерированных этим правилом элементах данных я получаю... (что именно? они вообще не создаются; или создаются, но не с тем именем, как ожидается; или ещё какие-то неожиданные результаты?)
    На мой взгляд, ваш код JavaScript выглядит вполне рабочим. Замечание только касательно фильтра - вы в нём указываете сравнение с шаблоном "Vl+" LLD-макроса, который сами генерируете, а этот макрос подстроки "Vl" содержать уже не будет.

    (добавлено)
    Ну и дополнительное замечание. В моей практике для большиства подобных устройств (свитчи, маршрутизаторы и т.п.) при настройке интерфейса (в том числе виртуального - для VLAN'ов, туннелей и т.п.) можно было задать описание этого интерфейса, которое при опросе по SNMP доступно в виде LLD-макроса {#IFNAME} либо {#IFALIAS}. То есть, нужный вам эффект достигается не путём прописывания правила препроцессинга и таблицы в коде JavaScript, а путём корректной настройки самого устройства.
    Last edited by Kos; 14-05-2025, 09:23.

    Comment

    • fractal90
      Senior Member
      • Jun 2019
      • 177

      #3
      (добавлено)
      Ну и дополнительное замечание. В моей практике для большиства подобных устройств (свитчи, маршрутизаторы и т.п.) при настройке интерфейса (в том числе виртуального - для VLAN'ов, туннелей и т.п.) можно было задать описание этого интерфейса, которое при опросе по SNMP доступно в виде LLD-макроса {#IFNAME} либо {#IFALIAS}. То есть, нужный вам эффект достигается не путём прописывания правила препроцессинга и таблицы в коде JavaScript, а путём корректной настройки самого устройства.
      естественно это есть 8. {#IFNAME_LOGICAL_INT} | {#IFALIAS} - BANDWIDTH, не об этом вопрос, у нас dnac от cisco, он description генерирует для 2000 филиалов согласно политики каждого филиала и длина descr может быть неудобоваримой. Ну и специфика устройств разная, допустим есть автоматически создаваемые туннели, им desc не задать соответственно этот IFALIS будет пустой, ну и дальше еще куча нюансов с динамическими туннелями
      Last edited by fractal90; 14-05-2025, 10:31.

      Comment

      • fractal90
        Senior Member
        • Jun 2019
        • 177

        #4
        1. Zabbix 7.0.0. © 2001–2024, Zabbix SIA
        2. LLD правило
        Click image for larger version  Name:	image.png Views:	0 Size:	42.1 KB ID:	503036
        3. Хочу менять параметр #IFNAME_LOGICAL_INT который в данном случае собирается номера vlan препроцессинг, для этого сделал JS
        Code:
        var interface_name = {
        'Vl100' : 'main channel',
        'Vl101' : 'backup channel',
        'Vl102' : 'L3vpn channel'
        };
        
        var value = JSON.parse(value);
        
        for (var i in value) {
        value[i]['{#IFNAME_LOGICAL_INT_NEW}'] = interface_name[value[i]['#IFNAME_LOGICAL_INT']] || value[i]['#IFNAME_LOGICAL_INT'];
        }
        
        return JSON.stringify(value);


        4. настроил фильтр с новым именем макроса после препроцессинга
        Click image for larger version  Name:	image.png Views:	0 Size:	20.6 KB ID:	503037

        5. Прототип с новым макросом
        Click image for larger version  Name:	image.png Views:	0 Size:	51.6 KB ID:	503038
        ​6. но выходит ошибка
        Cannot evaluate expression: "Cannot accurately apply filter: no value received for macro "{#IFNAME_LOGICAL_INT_NEW}".

        Last edited by fractal90; 14-05-2025, 10:46.

        Comment

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

          #5
          На скриншотах в путнках 2 и 4 - это одно и то же правило LLD (там колическтво фильтров отличается)?
          Какой JSON получается при тестировании правила LLD?
          Ошибка говорит, что при применении фильтра, в котором присутствует макрос {#IFNAME_LOGICAL_INT_NEW}, в итоговом JSON'е не найдено значений для такого макроса (что странно), поэтому и интересно, что видно при нажатии на кнопку "Тест".

          Comment

          • fractal90
            Senior Member
            • Jun 2019
            • 177

            #6
            Originally posted by Kos
            На скриншотах в путнках 2 и 4 - это одно и то же правило LLD (там колическтво фильтров отличается)?
            Какой JSON получается при тестировании правила LLD?
            Ошибка говорит, что при применении фильтра, в котором присутствует макрос {#IFNAME_LOGICAL_INT_NEW}, в итоговом JSON'е не найдено значений для такого макроса (что странно), поэтому и интересно, что видно при нажатии на кнопку "Тест".
            Да это одно правило, я удалил лишние (там помимо vlan еще туннели были, подинтерфейсы и так далее), количество фильтров теперь только 2

            по нажатию Тест выдает так

            Code:
            [{"{#SNMPINDEX}":"12","{#IFNAME_LOGICAL_INT}":"Vl936","{#IFOPERSTATUS}":"1","{#IFALIAS}":"-E- ### Internet","{#IFSPEED}":"30000000"},{"{#SNMPINDEX}":"13","{#IFNAME_LOGICAL_INT}":"Vl937","{#IFOPERSTATUS}":"1","{#IFALIAS}":"-E- ### Internet","{#IFSPEED}":"40000000"},{"{#SNMPINDEX}":"14","{#IFNAME_LOGICAL_INT}":"Vl938","{#IFOPERSTATUS}":"1","{#IFALIAS}":"-E- ### VPN","{#IFSPEED}":"5000000"},{"{#SNMPINDEX}":"15","{#IFNAME_LOGICAL_INT}":"Tu1","{#IFOPERSTATUS}":"1","{#IFALIAS}":"","{#IFSPEED}":"100000"},{"{#SNMPINDEX}":"16","{#IFNAME_LOGICAL_INT}":"Tu2","{#IFOPERSTATUS}":"1","{#IFALIAS}":"","{#IFSPEED}":"100000"}]

            Comment

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

              #7
              Originally posted by fractal90
              по нажатию Тест выдает так...
              Ну то есть сообщение об ошибке не врёт: LLD-макроса {#IFNAME_LOGICAL_INT_NEW} и вправду нет. Давайте с этим и разбираться.
              А что видно при нажатии на кнопку "Тест всех шагов" на вкладке "Предобработка" того же самого правила LLD? Шаг JavaScript отрабатывает, результат меняется?

              Comment

              • fractal90
                Senior Member
                • Jun 2019
                • 177

                #8
                Originally posted by Kos
                Ну то есть сообщение об ошибке не врёт: LLD-макроса {#IFNAME_LOGICAL_INT_NEW} и вправду нет. Давайте с этим и разбираться.
                А что видно при нажатии на кнопку "Тест всех шагов" на вкладке "Предобработка" того же самого правила LLD? Шаг JavaScript отрабатывает, результат меняется?
                Судя по всему я забыл скобки {} для выражения

                Code:
                value[i]['{#IFNAME_LOGICAL_INT_NEW}'] = interface_name[value[i]['#IFNAME_LOGICAL_INT']] || value[i]['#IFNAME_LOGICAL_INT'];
                , добавил, после этого тест начал отрабатывать, сейчас буду смотреть дальше

                Comment

                Working...