Ad Widget

Collapse

Собирать информацию в одном дискавери правиле, но с разными SNMPINDEX.

Collapse
This topic has been answered.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Skada
    Junior Member
    • Dec 2021
    • 6

    #1

    Собирать информацию в одном дискавери правиле, но с разными SNMPINDEX.

    Доброго времени суток!
    Столкнулся с проблемой сбора данных с установленных в сети коммутаторов.

    Имеется коммутатор Extreme X690-48x-2q-4c на EXOS 22.7.3.5.
    Имеется Zabbix версии 5.4.4.

    Задача: собирать SNMP-данные о полученном и переданном трафике внутри всех имеющихся на коммутаторе VPLS-туннелей.

    Я отыскал нужные SNMP OID'ы для сбора нужной мне информации.
    .1.3.6.1.2.1.10.2132.1.2.1.2 - этот OID позволяет считать названия VPLS-туннелей.
    .1.3.6.1.4.1.1916.1.37.5.1.1.6 - этот OID позволяет считать загруженный трафик через VPLS-туннели.
    Все было бы чудесно и просто, если бы не одно НО - SNMPINDEX для этих OID'ов разный!

    Например, привожу вывод команды snmpwalk для OID'а считывания названия VPLS-туннелей:
    root@debian:~# snmpwalk -c xxxxxxxx -v 2c 172.16.112.1 .1.3.6.1.2.1.10.2132.1.2.1.2
    iso.3.6.1.2.1.10.2132.1.2.1.2.1 = STRING: "VPLS-ML-Gus-3512"
    iso.3.6.1.2.1.10.2132.1.2.1.2.2 = STRING: "VPLS-ML-Gus-Kln19"
    iso.3.6.1.2.1.10.2132.1.2.1.2.3 = STRING: "VPLS-ML-Gus-Polevaya1a"
    iso.3.6.1.2.1.10.2132.1.2.1.2.4 = STRING: "VPLS-ML-Gus-Tpl23-2"
    iso.3.6.1.2.1.10.2132.1.2.1.2.5 = STRING: "VPLS-ML-Gus-Trans16b"
    iso.3.6.1.2.1.10.2132.1.2.1.2.6 = STRING: "VPLS-ML-Gus-Trp12a"
    iso.3.6.1.2.1.10.2132.1.2.1.2.7 = STRING: "VPLS-Voice"

    Тут мы видим, что SNMPINDEX'ами выступает диапазон цифр от 1 до 7 включительно.

    Привожу вывод команды snmpwalk для OID'а считывания загруженного трафика через VPLS-туннели:
    root@debian:~# snmpwalk -c xxxxxxxx -v 2c 172.16.112.1 1.3.6.1.4.1.1916.1.37.5.1.1.6
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10001 = Counter64: 6945309452
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10002 = Counter64: 0
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10003 = Counter64: 17492927304
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10004 = Counter64: 122713759149
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10005 = Counter64: 273138150660
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10006 = Counter64: 0
    iso.3.6.1.4.1.1916.1.37.5.1.1.6.10007 = Counter64: 31942678772

    Тут мы видим, что SNMPINDEX'ами выступает уже другой диапазон цифр от 10001 до 10007 включительно.

    Я создал правило обнаружения VPLS-туннелей на коммутаторе следующим образом:
    Click image for larger version

Name:	Untitled.png
Views:	181
Size:	28.8 KB
ID:	437493
    Прототип элементов данных я создал вот так:
    Click image for larger version

Name:	Untitled.png
Views:	111
Size:	45.8 KB
ID:	437494
    В итоге я получаю корректные последние данные в том формате, который мне нужен:
    Click image for larger version

Name:	Untitled.png
Views:	107
Size:	41.3 KB
ID:	437495
    Трюк с .1.3.6.1.4.1.1916.1.37.5.1.1.2.1000{#SNMPINDEX} работает до тех пор, пока количество туннелей на коммутаторе не превышает 9, а если будет десятый, то фактически OID приобретет некорректный вид .1.3.6.1.4.1.1916.1.37.5.1.1.2.100010, хотя в моей задаче нужно получать .1.3.6.1.4.1.1916.1.37.5.1.1.2.10010.

    Вопрос: есть ли вменяемое решение задачи по моему вопросу?
  • Answer selected by Kos at 27-12-2021, 16:55.
    Skada
    Junior Member
    • Dec 2021
    • 6

    Originally posted by Kos
    Ну, у меня получается как-то так:
    Code:
    //transform a source string into JSON object
    val_json=JSON.parse(value);
    //transform string value of every {#SNMPINDEX} into integer, add 10000 and transform back to string
    for (i in val_json) {
    val_json[i]["{#SNMPINDEX}"] = (parseInt(val_json[i]["{#SNMPINDEX}"]) + 10000) + "";
    }
    //return the result as a string
    return JSON.stringify(val_json);
    Если в вашем примере первый индекс заменить с единицы на "11", то результат предобработки таким скриптом будет:
    Code:
    [{"{#SNMPINDEX}":"10011","{#VPLS}":"VPLS-ML-Gus-3512"},{"{#SNMPINDEX}":"10002","{#VPLS}":"VPLS-ML-Gus-Kln19"},{"{#SNMPINDEX}":"10003","{#VPLS}":"VPLS-ML-Gus-Polevaya1a"},{"{#SNMPINDEX}":"10004","{#VPLS}":"VPLS-ML-Gus-Tpl23-2"},{"{#SNMPINDEX}":"10005","{#VPLS}":"VPLS-ML-Gus-Trans16b"},{"{#SNMPINDEX}":"10006","{#VPLS}":"VPLS-ML-Gus-Trp12a"},{"{#SNMPINDEX}":"10007","{#VPLS}":"VPLS-Voice"}]
    Пока ожидал вашего ответа, попробовал сам написать JS код, и пришел к почти такому же решению как у вас
    Действительно, таким образом я получаю нужные мне данные в нужном мне виде! Благодарю вас за помощь!

    Comment

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

      #2
      Хм, любопытная задача.
      Начнём с того, что я не уверен, что всегда в этих двух таблицах индексы OID-ов будут чётко соответствовать друг другу.
      Но если предположить, что это так, то можно вывернуться через несложную предобработку, которую проще всего сделать на JavaScript.
      Если нажать на кнопку "Тест" на первом скриншоте, то должен вернуться JSON со списком имён туннелей и соответствующих им индексов.
      Если вам несложно, то процитируйте этот JSON здесь, пожалуйста.
      Смысл предобработки: сделать каждое значение макроса {#SNMPINDEX} двузначным (или даже сразу трёхзначным). Или даже, что ещё проще - сразу пятизначным, арифметически прибавляя к нему число 10000. Тогда значение этого макроса можно будет использовать в прототипах элемента данных "как есть". Правда, немного поменяются и ключи в сгенерированных айтемах (они тоже будут пятизначными), но не думаю, что это принципиально.

      Comment

      • Skada
        Junior Member
        • Dec 2021
        • 6

        #3
        Originally posted by Kos
        Если вам несложно, то процитируйте этот JSON здесь, пожалуйста.
        JSON, который я получаю при выполнении теста обращения к коммутатору:
        [{"{#SNMPINDEX}":"1","{#VPLS}":"VPLS-ML-Gus-3512"},{"{#SNMPINDEX}":"2","{#VPLS}":"VPLS-ML-Gus-Kln19"},{"{#SNMPINDEX}":"3","{#VPLS}":"VPLS-ML-Gus-Polevaya1a"},{"{#SNMPINDEX}":"4","{#VPLS}":"VPLS-ML-Gus-Tpl23-2"},{"{#SNMPINDEX}":"5","{#VPLS}":"VPLS-ML-Gus-Trans16b"},{"{#SNMPINDEX}":"6","{#VPLS}":"VPLS-ML-Gus-Trp12a"},{"{#SNMPINDEX}":"7","{#VPLS}":"VPLS-Voice"}]

        Касательно порядка индексов при считывании названий туннелей и трафика все красиво, оба идут в "правильном" порядке.

        Comment

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

          #4
          Originally posted by Skada
          JSON, который я получаю при выполнении теста обращения к коммутатору:
          [...]
          Ну, у меня получается как-то так:
          Code:
          //transform a source string into JSON object
          val_json=JSON.parse(value);
          //transform string value of every {#SNMPINDEX} into integer, add 10000 and transform back to string
          for (i in val_json) {
              val_json[i]["{#SNMPINDEX}"] = (parseInt(val_json[i]["{#SNMPINDEX}"]) + 10000) + "";
          }
          //return the result as a string
          return JSON.stringify(val_json);
          Если в вашем примере первый индекс заменить с единицы на "11", то результат предобработки таким скриптом будет:
          Code:
          [{"{#SNMPINDEX}":"10011","{#VPLS}":"VPLS-ML-Gus-3512"},{"{#SNMPINDEX}":"10002","{#VPLS}":"VPLS-ML-Gus-Kln19"},{"{#SNMPINDEX}":"10003","{#VPLS}":"VPLS-ML-Gus-Polevaya1a"},{"{#SNMPINDEX}":"10004","{#VPLS}":"VPLS-ML-Gus-Tpl23-2"},{"{#SNMPINDEX}":"10005","{#VPLS}":"VPLS-ML-Gus-Trans16b"},{"{#SNMPINDEX}":"10006","{#VPLS}":"VPLS-ML-Gus-Trp12a"},{"{#SNMPINDEX}":"10007","{#VPLS}":"VPLS-Voice"}]

          Comment

          • Skada
            Junior Member
            • Dec 2021
            • 6

            #5
            Originally posted by Kos
            Ну, у меня получается как-то так:
            Code:
            //transform a source string into JSON object
            val_json=JSON.parse(value);
            //transform string value of every {#SNMPINDEX} into integer, add 10000 and transform back to string
            for (i in val_json) {
            val_json[i]["{#SNMPINDEX}"] = (parseInt(val_json[i]["{#SNMPINDEX}"]) + 10000) + "";
            }
            //return the result as a string
            return JSON.stringify(val_json);
            Если в вашем примере первый индекс заменить с единицы на "11", то результат предобработки таким скриптом будет:
            Code:
            [{"{#SNMPINDEX}":"10011","{#VPLS}":"VPLS-ML-Gus-3512"},{"{#SNMPINDEX}":"10002","{#VPLS}":"VPLS-ML-Gus-Kln19"},{"{#SNMPINDEX}":"10003","{#VPLS}":"VPLS-ML-Gus-Polevaya1a"},{"{#SNMPINDEX}":"10004","{#VPLS}":"VPLS-ML-Gus-Tpl23-2"},{"{#SNMPINDEX}":"10005","{#VPLS}":"VPLS-ML-Gus-Trans16b"},{"{#SNMPINDEX}":"10006","{#VPLS}":"VPLS-ML-Gus-Trp12a"},{"{#SNMPINDEX}":"10007","{#VPLS}":"VPLS-Voice"}]
            Пока ожидал вашего ответа, попробовал сам написать JS код, и пришел к почти такому же решению как у вас
            Действительно, таким образом я получаю нужные мне данные в нужном мне виде! Благодарю вас за помощь!

            Comment

            Working...