Ad Widget

Collapse

Помогите разобраться с LLD и itemprototype

Collapse
This topic has been answered.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Astar
    Member
    • Jul 2022
    • 36

    #1

    Помогите разобраться с LLD и itemprototype

    Zabbix 6.0
    в забиксе новичок, до этого только правил уже готовые шаблоны для сетевого активного оборудования, тут с нуля, готового не нашел

    Системы гарантированного питания Huawei ETP4860, 48200, общие параметры нагрузки токов и т.п. нужные OIDы нашел, но они могут быть укомплектованы разным количеством выпрямителей и батарейных блоков
    создал правило rectifiers discovery
    Click image for larger version

Name:	rctf-discovery.png
Views:	208
Size:	27.7 KB
ID:	450593

    правило возвращает следующую строку

    Code:
    [{"{#SNMPINDEX}":"28672","{#RCFNAME}":"Rectifier3","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003884"},{"{#SNMPINDEX}":"28673","{#RCFNAME}":"Rectifier2","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003840"},{"{#SNMPINDEX}":"28674","{#RCFNAME}":"Rectifier1","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003637"}]
    в данном случае 3 выпрямителя с {#SNMPINDEX} 28672,28673 и 28674
    я так понимаю получать здесь мне достаточно только имя, версию софта и серийный номер как я понял потом именно в правиле обнаружения мне не нужны, только {#SNMPINDEX} и {#RCFNAME}

    для этого правила создаю Прототипы, по такому принципу:


    Click image for larger version

Name:	item-prototype.png
Views:	106
Size:	44.5 KB
ID:	450594

    по этому OID действительно реальная эффективность выпрямителя значение = 930 и в preprocessing я еще использую:

    Click image for larger version

Name:	preprocessing.png
Views:	106
Size:	12.5 KB
ID:	450595

    однако эти Item'ы не создаются, как и 6 остальных
    я так понимаю я что то глобально не понимаю как работает, хотя сравнивал с Network interfaces discovery в шаблонах от активки, все вроде так же

    Направьте, пожалуйста, на путь истинный!
  • Answer selected by Astar at 31-08-2022, 10:48.
    Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    Спасибо за то, что описали свою ситуацию подробнее. Действительно, я сам не заметил, что в ключе нет никакого LLD-макроса, хотя он там быть обязан (хоть какой-нибудь) - поверил вам на слово, что не создаются вообще никакие айтемы (хотя на самом деле создавался только один, на остальные шла ругань на отсутствие уникальности).

    Насчёт второго вопроса - тут я вижу два варианта.
    Первый вариант - в случае, если устройство это позволяет, то изменить наименования компонентов в его настройках. Не факт, что это возможно; но если если таки да - то устройство по SNMP будет отдавать сразу нужный текст, и проблемы не будет.
    Второй вариант - всё же использовать препроцессинг, с помощью которого тупо заменить нужные строки их переводом на русский язык. Препроцессинг нужно прикручивать не к прототипам элементов данных, а к самому правилу LLD. На входе (до препроцессинга) будет строка, которую вы приводили:
    Code:
    [{"{#SNMPINDEX}":"28672","{#RCFNAME}":"Rectifier3","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003884"},{"{#SNMPINDEX}":"28673","{#RCFNAME}":"Rectifier2","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003840"},{"{#SNMPINDEX}":"28674","{#RCFNAME}":"Rectifier1","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003637"}]
    В препроцессинге есть возможность добавить шаг "Replace", которым можно заменить одну подстроку на другую, и который, казалось бы, подходит как раз для данной задачи. Но, к сожалению, это не так: данный вид препроцессинга заменяет только одно (первое) вхождение подстроки, а не все; поэтому придётся писать код на JavaScript. К счастью, в данном случае этот код будет довольно простым. Например:
    Code:
    return value.replace(/Rectifier/g,'Выпрямитель');
    Этот код заменит все вхождения строки 'Rectifier' на 'Выпрямитель'.
    Можно сделать более интеллектуально, чтобы заменять только те строки, которые являются значением макроса {#RCFNAME}, но код получится слегка длиннее:
    Code:
    //transform the source string into the JSON object
    val_json=JSON.parse(value);
    
    //this JSON object is an array, process this array in the loop
    for (i in val_json) {
        val_json[i]["{#RCFNAME}"] = val_json[i]["{#RCFNAME}"].replace(/Rectifier/,'Выпрямитель');
    }
    ​
    //return a resulting JSON transformed back into the string
    return JSON.stringify(val_json);
    ​
    Аналогичным образом можно в другом правиле LLD заменить подстроку 'Battery string' на 'Батарея'.
    Last edited by Kos; 31-08-2022, 08:48.

    Comment

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

      #2
      Originally posted by Astar
      однако эти Item'ы не создаются, как и 6 остальных
      я так понимаю я что то глобально не понимаю как работает, хотя сравнивал с Network interfaces discovery в шаблонах от активки, все вроде так же

      Направьте, пожалуйста, на путь истинный!
      Приветствую!

      Вроде бы, всё верно делаете. Нужно лишь дождаться, когда отработает само правило LLD (у вас выставлен интервал 1 час), либо явно ткнуть на нём кнопку "Execute now".
      Кроме того, по скриншоту видно, что в том же правиле LLD присутствует ещё правило препроцессинга (которое вы никак не прокомментировали). Если в нём шаг "тротлинг с хертбитом", то придётся ждать интервала этого хертбита, либо на время сильно уменьшить этот интервал.

      Comment

      • Astar
        Member
        • Jul 2022
        • 36

        #3
        Originally posted by Kos
        Приветствую!

        Вроде бы, всё верно делаете. Нужно лишь дождаться, когда отработает само правило LLD (у вас выставлен интервал 1 час), либо явно ткнуть на нём кнопку "Execute now".
        Дорогой Kos! Огромное спасибо! Если бы я приложил еще один скриншот, вы бы сразу сказали где ошибка. А так я полез искать где же эта кнопка "Execute now" находится, и на том экране увидел красные "!" которые разворачивались в текст типа " не могу создать Item rects.hwRectEfficency, с таким именем уже существует".
        если коротко, проблема была в значении "key"
        Click image for larger version

Name:	list-items.png
Views:	107
Size:	47.2 KB
ID:	450649

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


        Я вот не знаю, новую тему ли создать или здесь продолжу:
        при выполнении LLD {#RCFNAME} получает значение Rectifier1, Rectifier2, Rectifier3 - с помощью какого механизма, препроцессинга(?) но тогда как, изменить Rectifier1 на Выпрямитель1?
        с выпрямителями еще ладно, а вот в другом правиле LLD {#BATTNAME} определяется как "Battery string1" и т.д. а хотелось бы иметь "Батарея1"?

        Comment

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

          #4
          Спасибо за то, что описали свою ситуацию подробнее. Действительно, я сам не заметил, что в ключе нет никакого LLD-макроса, хотя он там быть обязан (хоть какой-нибудь) - поверил вам на слово, что не создаются вообще никакие айтемы (хотя на самом деле создавался только один, на остальные шла ругань на отсутствие уникальности).

          Насчёт второго вопроса - тут я вижу два варианта.
          Первый вариант - в случае, если устройство это позволяет, то изменить наименования компонентов в его настройках. Не факт, что это возможно; но если если таки да - то устройство по SNMP будет отдавать сразу нужный текст, и проблемы не будет.
          Второй вариант - всё же использовать препроцессинг, с помощью которого тупо заменить нужные строки их переводом на русский язык. Препроцессинг нужно прикручивать не к прототипам элементов данных, а к самому правилу LLD. На входе (до препроцессинга) будет строка, которую вы приводили:
          Code:
          [{"{#SNMPINDEX}":"28672","{#RCFNAME}":"Rectifier3","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003884"},{"{#SNMPINDEX}":"28673","{#RCFNAME}":"Rectifier2","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003840"},{"{#SNMPINDEX}":"28674","{#RCFNAME}":"Rectifier1","{#RCFSOFTVER}":"V603","{#RCFSN}":"2102312JPQHVM5003637"}]
          В препроцессинге есть возможность добавить шаг "Replace", которым можно заменить одну подстроку на другую, и который, казалось бы, подходит как раз для данной задачи. Но, к сожалению, это не так: данный вид препроцессинга заменяет только одно (первое) вхождение подстроки, а не все; поэтому придётся писать код на JavaScript. К счастью, в данном случае этот код будет довольно простым. Например:
          Code:
          return value.replace(/Rectifier/g,'Выпрямитель');
          Этот код заменит все вхождения строки 'Rectifier' на 'Выпрямитель'.
          Можно сделать более интеллектуально, чтобы заменять только те строки, которые являются значением макроса {#RCFNAME}, но код получится слегка длиннее:
          Code:
          //transform the source string into the JSON object
          val_json=JSON.parse(value);
          
          //this JSON object is an array, process this array in the loop
          for (i in val_json) {
              val_json[i]["{#RCFNAME}"] = val_json[i]["{#RCFNAME}"].replace(/Rectifier/,'Выпрямитель');
          }
          ​
          //return a resulting JSON transformed back into the string
          return JSON.stringify(val_json);
          ​
          Аналогичным образом можно в другом правиле LLD заменить подстроку 'Battery string' на 'Батарея'.
          Last edited by Kos; 31-08-2022, 08:48.

          Comment

          • Astar
            Member
            • Jul 2022
            • 36

            #5
            Originally posted by Kos

            Насчёт второго вопроса - тут я вижу два варианта.
            Первый вариант - в случае, если устройство это позволяет, то изменить наименования компонентов в его настройках....
            Класс! Спасибо! Особенно за примеры с кодом.

            Replace я попробовал в первую очередь и да, опытным путем убедился что возвращает только первое вхождение. Изменить наименование компонентов вряд ли. Хотя WEB интерфейс железки поддерживает 10 языков, русский в том числе, но таких манипуляций там не предусмотрено.

            попробую вариант с JavaScript. Я прямо вижу что должно получиться!

            Comment

            Working...