Ad Widget

Collapse

Пользовательские макросы нельзя использовать в тегах Item-ов?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Wadim_Sch
    Member
    • Feb 2022
    • 83

    #1

    Пользовательские макросы нельзя использовать в тегах Item-ов?

    Только после отпуска заметил что моя конструкция описанная здесь не работает. Вернее работает только наполовину.
    Мне нужно собрать данные по MODBUS с нескольких хостов (кВт/ч) и затем суммировать их.
    Создал шаблон. В шаблоне Item для сбора данных выглядет следующим образом:
    Code:
    modbus.get[tcp://10.34.230.101:502,{$SENSOR_NUMMER},3,512,1,uint64, mle,0]
    В шаблоне также есть ещё два элемента с данными (кВт/ч) и (кВт/ч за текущий месяц). Эти элементы имеют следующие теги:
    Code:
    Tag: PDU_Client Value: AllEnergy_{$CLIENT_NAME} и
    Tag: PDU_Client Value: EnergyCurrentMonth_{$CLIENT_NAME}
    Пользовательские макросы {$SENSOR_NUMMER} и {$CLIENT_NAME} я задаю непосредственно на хосте.Click image for larger version  Name:	Modbus1.jpg Views:	2 Size:	30.8 KB ID:	490039
    Так вот. Макрос {$SENSOR_NUMMER} работает. Номер датчика подставляется в конструкцию
    Code:
    modbus.get[tcp://10.34.230.101:502,{$SENSOR_NUMMER},3,512,1,uint64, mle,0
    корректно и этот Item в хосте получает корректные данные.
    А вот макрос {$CLIENT_NAME} не срабатывает. При попытке суммировиния данных на хосте Zabbix-server по тегу AllEnergy_TEST (AllEnergy_{$CLIENT_NAME}) Zabbix пишет:
    Cannot evaluate expression: no input data for function at "sum(last_foreach(/*/Energy.Active.[*]?[group="DTS_HF_Energy_PDUs" and tag="PDU_Client:AllEnergy_TEST"]))"
    При этом если я вручную прописываю теги на соответствующих Item-ax самих хостов: AllEnergy_TEST. То суммирование на хосте Zabbix-server работает без проблем.

    Пробовал в шаблоне менять тег таким образом чтобы тег состоял не из текста и макроса, а только из макроса:
    не Tag: PDU_Client Value: AllEnergy_{$CLIENT_NAME}, а что-то вроде: Tag: PDU_Client Value: {$AllEnergy_CLIENT_NAME}. Но это тоже не работает.​

    Теперь два вопроса:
    1. Пользовательские макросы вроде бы можно использовать в тегах Item-ов или я документацию неправильно понимаю?​
    Click image for larger version  Name:	Modbus2.jpg Views:	2 Size:	28.9 KB ID:	490040
    2. Как посмотреть во что разворачивается макрос. Я имею ввиду посмотреть что подставляет макрос. Иначе приходиться по каким-то косвенным показателям (типа суммировиние данных на хосте Zabbix-server) вычислять что-же макрос подставил в тот или иной элемент.

    Zabbix 7.0
    ​​​​
    Last edited by Wadim_Sch; 22-08-2024, 09:53.
  • Semiadmin
    Senior Member
    • Oct 2014
    • 1625

    #2
    Там сноска есть, и в ней сказано, что макросы в тэгах раскроются тоолько в событии по триггеру, но не в айтеме. Так что агрегировать по ним, увы, нельзя. Жутко неудобно.

    Comment

    • Wadim_Sch
      Member
      • Feb 2022
      • 83

      #3
      Хм... Вот сноску то я и не прочитал. Теперь надо что-то другое придумывать.
      Есть идея использовать пользовательский макрос как часть параметра ключа элемента данных.
      Click image for larger version

Name:	image.png
Views:	93
Size:	27.3 KB
ID:	490134

      Изменил в шаблоне ключи элементов с
      Energy.Active.[A]
      Energy.Active.[B]
      на
      Energy.Active.[A,{$CLIENT_NAME}]
      Energy.Active.[B,{$CLIENT_NAME}]
      Макрос {$CLIENT_NAME} задаю как и раньше на хосте: {$CLIENT_NAME} = Test_Customer_1

      Изменил формулу суммировиния на хосте zabbix-server на:
      sum(last_foreach(/*/Energy.Active.[*,Test_Customer_1]))

      НЕ РАБОТАЕТ!

      Меняю ключи элементов вручную на
      Energy.Active.[A,Test_Customer_1]
      Energy.Active.[B,Test_Customer_1]
      Суммирование происходит!

      Я опять не правильно документацию понимаю?
      И можно ли как-то посмотреть во что разворачивается макрос?​​​
      Attached Files

      Comment

      • Semiadmin
        Senior Member
        • Oct 2014
        • 1625

        #4
        Проверил этот способ.
        Суммируется, если в формулу вычисляемого тоже проставить тот же макрос, а не его значение.
        Посмотреть, как раскрывается макрос, можно в последних данных, поставив галку "Show details".
        Я это обходил так: в препроцессинге LLD rule делал дополнительный LLD макрос со значением пользовательского макроса и уже им тегировал прототипы. Тогда все отлично агрегируется.
        Для регулярных айтемов приходилось делать singleton LLD rule, чтобы они были в нем прототипами.

        Comment

        • Wadim_Sch
          Member
          • Feb 2022
          • 83

          #5
          Суммируется, если в формулу вычисляемого тоже проставить тот же макрос, а не его значение.
          Что-то не совсем понял. У меня несколько клиентов: Test_Customer_1, Test_Customer_2, Test_Customer_3 ...
          Имя клиента я хочу использовать как идентификатор для суммирования потребленной этим клиентом электроэнергии.

          Макрос {$CLIENT_NAME} на хосте для клиента Test_Customer_1 будет: {$CLIENT_NAME} = Test_Customer_1
          Макрос {$CLIENT_NAME} на хосте для клиента Test_Customer_2 будет: {$CLIENT_NAME} = Test_Customer_2
          и т.д.

          Если я задам формулу sum(last_foreach(/*/Energy.Active.[*,{$CLIENT_NAME}])) вместо sum(last_foreach(/*/Energy.Active.[*,Test_Customer_1])) или sum(last_foreach(/*/Energy.Active.[*,Test_Customer_2]))
          то что я получу? Или я неправильно вас понял?
          Посмотреть, как раскрывается макрос, можно в последних данных, поставив галку "Show details".
          Спасибо!
          Я переделал немного шаблон. Сделал так:
          Click image for larger version

Name:	Modbus1.jpg
Views:	120
Size:	19.5 KB
ID:	490146
          Макрос на хосте для клиента Test_Customer_1 выглядет так:
          Click image for larger version

Name:	Modbus2.jpg
Views:	92
Size:	14.0 KB
ID:	490147
          Теперь смотрю "Последние данные" с галкой "Show details".
          Click image for larger version

Name:	Modbus3.jpg
Views:	87
Size:	22.0 KB
ID:	490148
          Здесь понятно во что раскрывается макрос и что макрос {$CLIENT_NAME} раскрывается корректно.
          Почему же не работает: sum(last_foreach(/*/Energy.Active.[*,Test_Customer_1])). Вернее сейчас работает, но берёт только ключ для линии A, там где в шаблоне Test_Customer_1 задан явным образом а не через макрос {$CLIENT_NAME}.
          Я это обходил так: в препроцессинге LLD rule делал дополнительный LLD макрос со значением пользовательского макроса и уже им тегировал прототипы. Тогда все отлично агрегируется.
          Для регулярных айтемов приходилось делать singleton LLD rule, чтобы они были в нем прототипами.​
          А могли бы вы это поподробнее описать или скрины приложить. Для устройств MODBUS я применяю супер-примитивные шаблоны без LLD. Там собственно обнаруживать нечего. Но может быть я придумаю на основе вашего опыта какой-нибудь превдо-Item исключительно для обхода проблем с макросами


          ​​​

          Comment

          • Semiadmin
            Senior Member
            • Oct 2014
            • 1625

            #6
            По первому вопросу - я написал, как оно работает. Но, как вы совершенно правильно заметили, толку от такого применения никакого.
            Теперь немного опишу мой кейс, чтобы было понятно, зачем это делалось.
            Мне надо было делать агрегированные проверки по нодам кластера, где имя кластера было невозможно взять из каких-либо данных, и оно произвольно задавалось через пользовательский макрос {$CLUSTER} на нодах.
            Структура групп и подгрупп хостов была жестко регламентирована, и создавать новые для агрегирования по группам было нельзя, а в одной группе могло быть несколько разных кластеров.
            Поэтому оставалось агрегирование по тэгам.
            На нодах делалось LLD rile типа Script:
            return '[{"{#CLUSTER}":"'+'{$CLUSTER}'+'","{#SINGLETON}" :"" }]'
            Айтемы - прототипы в нем с ключами вида metric[{#SINGLETON}] или metric[parameter,{#SINGLETON}] и тэгом Cluster: {#CLUSTER}

            Comment

            • Wadim_Sch
              Member
              • Feb 2022
              • 83

              #7
              Спасибо! Заработало!
              Отчитываюсь.
              Zabbix не поддерживает пользовательские макросы ({$CLIENT_NAME}) в тегах Item-ов, но поддерживает макросы LLD {#CLIENT_NAME}. Поэтому в шаблоне было добавлено правило LLD типа Script.
              В скрипте идет присвоение значения пользовательского макроса {$CLIENT_NAME} макросу LLD {#CLIENT_NAME}.
              Code:
              return '[{"{#CLIENT_NAME}":"' + '{$CLIENT_NAME}' + '"}]'
              Далее четыре Itema в которых используются макросы {$CLIENT_NAME} были перенесены в правило LLD и используемые в них макросы {$CLIENT_NAME} были исправлены на {#CLIENT_NAME}.
              Click image for larger version  Name:	Modbus1.jpg Views:	0 Size:	57.6 KB ID:	490227
              Click image for larger version  Name:	Modbus2.jpg Views:	0 Size:	27.1 KB ID:	490228
              На отнове этого шаблона на хосте формируюста четыре Item-a
              Click image for larger version  Name:	Modbus3.jpg Views:	0 Size:	48.2 KB ID:	490229
              С нужными мне тегами:
              PDU_Client: AllEnergy_Test_Customer_2
              PDU_Client: EnergyCurrentMonth_Test_Customer_2

              Теперь про суммирование например всей потребленной энергии (показаний счетчиков) на хосте на хосте zabbix-server для конкретного клиента.
              Формула выглядит так:
              Code:
              sum(last_foreach(/*/Energy.Active.[*,*]?[group="DTS_HF_Energy_PDUs" and tag="PDU_Client:AllEnergy_Test_Customer_2"]))
              ​​​
              Attached Files
              Last edited by Wadim_Sch; 26-08-2024, 08:45.

              Comment

              Working...