Ad Widget

Collapse

Вычисляемые элементы данных + Tagging.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ilja
    Junior Member
    • Jan 2023
    • 14

    #1

    Вычисляемые элементы данных + Tagging.

    Добрый день!

    Помогите разобраться. Пытаюсь сделать вычисляемый элемент данных, графики, куда бы автоматически попадали создаваемые прототипы элемента данных с использованием макроса LLD.
    В LLD макрос попадают записи в форме {#EVENTLOG} - VoiceService.onStart_NO_MONEY или GprsGxService.onStart_CARD_NOT_FOUND и т.д. Прототип элемента данных создает ключи с использованием данных из lld макроса {#EVENTLOG} и ключи получаются к примеру такого формата 50prcntExTime[GprsGxService.onStart_CARD_NOT_FOUND], 50prcntExTime[VoiceService.onStart_NO_MONEY]. Для вычисляемого элемента данных пробовал различные варианты в виде "max(max_foreach(/BILLING-DB-01/50prcntExTime[*],1m))" где вместо * пытался использовать частичное совпадения ключа. Мне нужно разделить по типам сервисов ключи т.е. GprsGxService.onStart_ калькулировать отдельно, VoiceService.onStart_ калькулировать отдельно.

    Как мне подсказали, вариант max(max_foreach(/BILLING-DB-01/50prcntExTime[GprsGxService.onStart_*],1m)) не допускает частичного совпадения ключа и рекомендовали группировать данные на уровне тегирования элементов данных создаваемых прототипом с применением частичного совпадения данных в макросе LLD пример: {{#LLDMACRO}.regsub(pattern, output)}​.

    Пробовал разные варианты, но все приводят к тому, что вне зависимости от совпадения в макросе паттерна с к примеру GprsGxService.onUpdate_ тэги вешаются всем элементам данных рассматриваемого прототипа.
    К примеру на элемент данных с ключом 50prcntExTime[BillingFunctions.requestGprsTariff].

    {{#EVENTLOG}.regsub("GprsGxService.onUpdate_", \1)}
    {{$EVENTLOG}.regsub("(GprsGxService.onStart_)", \1)}
    {{$EVENTLOG}.regsub("^([GprsGxService.onStart_+])", \1)}

    Судя по https://regex101.com/r/b7WJBY/1 вариант (GprsGxService.onStart_) уже должен дать мне искомый результат. Но к сожалению не работает.
    В чем ошибка можете подсказать?
    И если не сложно, подскажите как будет выглядеть вариант вычисляемого элемента данных на основе тегированных элементов данных? К примеру в тег GprsGxonStart50pr_of_inquiries должны попасть все элементы данных с ключами 50prcntExTime[GprsGxService.onStart_....], как потом вычислять по тегу, так?: max(max_foreach(/BILLING-DB-01/50prcntExTime[*] and (tag="GprsGxonStart50pr_of_inquiries"),1m))

    Zabbix server 6.2
    Заранее спасибо!​
    Last edited by ilja; 09-03-2023, 13:58.
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Originally posted by ilja
    К примеру на элемент данных с ключом 50prcntExTime[BillingFunctions.requestGprsTariff].

    {{#EVENTLOG}.regsub("GprsGxService.onUpdate_", \1)}
    {{$EVENTLOG}.regsub("(GprsGxService.onStart_)", \1)}
    {{$EVENTLOG}.regsub("^([GprsGxService.onStart_+])", \1)}
    Так работать и не будет: в первом случае нечего подставлять (в регулярном выражении нет группы захвата, т.е. круглых скобок), а в остальных случаях - не тот макрос (не LLD, а user macro).
    И, по-любому, чтобы такой подход работал, регулярное выражение должно быть таким, чтобы оно подходило к любому из поступающих значений (а не только к некоторому их подмножеству).

    Несколько вопросов:
    • А нет ли возможности управлять форматом того JSON-а, который идёт на вход правилу обнаружения? Если вы его формируете сами, то мне кажется, что самый простой вариант - это разбить такой длинный LLD-макрос на две части, которые можно было бы использовать в прототипах независимо друг от друга - хоть вместе, хоть порознь.
    • Если такой возможности нет, то следующий вопрос: по какому критерию вы хотите отделять в значении макроса "тип сервиса" от "всего остального"? По первой точке, первому символу подчёркивания, ещё как-то?

    Comment

    • Semiadmin
      Senior Member
      • Oct 2014
      • 1625

      #3
      Надо получить в тэг прототипа айтема ту самую общую часть LLD макроса, по которой требуется агрегировать. Если предположить, что уникальная часть начинается после первого подчеркивания, то, например так:
      Name: some_tag
      Value: {{#EVENTLOG}.regsub("([^_]+_).*", \1)}​
      Тогда можно будет агрегировать примерно так:
      max(max_foreach(//50prcntExTime[*]?[tag="some_tag:GprsGxService.onUpdate_"],1m))​

      Comment

      • ilja
        Junior Member
        • Jan 2023
        • 14

        #4
        Originally posted by Semiadmin
        Надо получить в тэг прототипа айтема ту самую общую часть LLD макроса, по которой требуется агрегировать. Если предположить, что уникальная часть начинается после первого подчеркивания, то, например так:
        Name: some_tag
        Value: {{#EVENTLOG}.regsub("([^_]+_).*", \1)}​
        Тогда можно будет агрегировать примерно так:
        max(max_foreach(//50prcntExTime[*]?[tag="some_tag:GprsGxService.onUpdate_"],1m))​
        Спасибо, Value: {{#EVENTLOG}.regsub("([^_]+_).*", \1)}​ отработал как надо, я на выходе получил к примеру Name: 50pr_of_inquiries: Value: GprsGxService.onStart_ (50pr_of_inquiries:GprsGxService.onStart_).
        Но при попытке использовать max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m))​ получаю ошибку: "Не удалось обновить элемент данных: Ошибочный параметр "/1/params": некорректное выражение начиная с "​"."
        ​Удалив кавычки ошибка:
        Ошибочный параметр "/1/params": некорректное выражение начиная с "max(max_foreach(/BILLING-DB-01/50prcntExTime?[tag=50pr_of_inquiries:GprsGxService.onStart _],1m))​".
        ​в чем ошибка синтаксиса?​


        Originally posted by Kos
        Так работать и не будет: в первом случае нечего подставлять (в регулярном выражении нет группы захвата, т.е. круглых скобок), а в остальных случаях - не тот макрос (не LLD, а user macro).
        И, по-любому, чтобы такой подход работал, регулярное выражение должно быть таким, чтобы оно подходило к любому из поступающих значений (а не только к некоторому их подмножеству).

        Несколько вопросов:
        • А нет ли возможности управлять форматом того JSON-а, который идёт на вход правилу обнаружения? Если вы его формируете сами, то мне кажется, что самый простой вариант - это разбить такой длинный LLD-макрос на две части, которые можно было бы использовать в прототипах независимо друг от друга - хоть вместе, хоть порознь.
        • Если такой возможности нет, то следующий вопрос: по какому критерию вы хотите отделять в значении макроса "тип сервиса" от "всего остального"? По первой точке, первому символу подчёркивания, ещё как-то?
        1. Формирую JSON сам из таблицы статистики на ux переделывая ее в формат csv и преобразуя в json в zabbix. Во вложении пример части таблицы с необходимой группировкой статистики по сервисам. Т.е. отдельно нужно статистика суммарная по "Gprs, sms, voice," а так же на их типе "GprsGx, GprsGy", так же на на стадии onStart, onUpdate, onStop и статусе обработки OK, NO MONEY и далее динамическое кол-во подобных значений. Я решил лучше группировать Event + Status выводя в LLD макрос. Учитывая кол-во возможных статусов и кол во строк и столбцов мне показалось это наиболее простым решением.
        2. В ответе на 1й постарался ответить и на второй. В итоге решение Value: {{#EVENTLOG}.regsub("([^_]+_).*", \1)}​ для тегирования то что нужно. Осталось разобраться с калькуляцией max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStar t_"],1m))​ и ошибкой описанной выше.​
        Attached Files
        Last edited by ilja; 10-03-2023, 12:47.

        Comment

        • ilja
          Junior Member
          • Jan 2023
          • 14

          #5
          Не улавливаю что изменилось, но смог создать элемент данных max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m)) но калькуляция не происходит, ошибка: Cannot evaluate expression: no input data for function at "max(max_foreach(/BILLING-DB-01/50prcntExTime?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m))"
          Хотя фактически данные в элементах с этим тегом собираются:
          Click image for larger version

Name:	image.png
Views:	251
Size:	55.5 KB
ID:	460868
          ​В чем может быть причина?
          И еще, что будет если элемент с тегом более не будет находится по LLD и встанет в очередь на удаление? Статистика опять перестанет калькулироваться в элементе агрегированных вычислений?

          Comment

          • ilja
            Junior Member
            • Jan 2023
            • 14

            #6
            Пытаюсь вычисляемый элемент данных создать с использованием фильтра по тэгу. Формула: max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m))
            Получаю ошибку:
            Cannot evaluate expression: no input data for function at "max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m))"

            В варианте без отсылки на тэг (max(max_foreach(/BILLING-DB-01/50prcntExTime[*],1m))) вычисление работает, но по ключу 50prcntExTime[*] получаю много значений мне ненужных.
            Элементы данных с ключом 50prcntExTime[(разное)] и тегом (имя) 50pr_of_inquiries: GprsGxService.onStart_ (значение) существуют и сбор данных по ним происходит. Есть идеи в чем может быть проблема?

            Пример эл. данных которые должны входить в вычисляемые значения:
            Ключ: 50prcntExTime[GprsGxService.onStart_SERVER_OVERLOADED] тэг: 50pr_of_inquiries: GprsGxService.onStart_
            Ключ: 50prcntExTime[GprsGxService.onStart_OK] тэг: 50pr_of_inquiries: GprsGxService.onStart_

            Пример эл. данных которые не должны входить в вычисляемые значения:
            Ключ: 50prcntExTime[GprsGxService.onStart] тэг: 50pr_of_inquiries: (пусто)
            Ключ: 50prcntExTime[BillingFunctions.requestGprsTariff] тэг: 50pr_of_inquiries: (пусто)​

            т.к. интересующие эл. данных имеют еще один тег попробовал и его включить в фильтр max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[(tag="50pr_of_inquiries:GprsGxService.onStart_" and tag="Protei: OCS_Stat")],1m)) но проблему это не решило. Ошибка та же.
            Last edited by ilja; 13-03-2023, 11:21.

            Comment

            • ilja
              Junior Member
              • Jan 2023
              • 14

              #7
              Добавлю описание проблемы в картинках:
              В варианте без отсылки на тэг (max(max_foreach(/BILLING-DB-01/50prcntExTime[*],1m))) вычисление работает, но по ключу 50prcntExTime[*] получаю значение из диапазона данных мне не подходящих.
              Click image for larger version  Name:	image.png Views:	0 Size:	51.5 KB ID:	460964
              использованием фильтра по тэгу Получаю ошибку:
              Cannot evaluate expression: no input data for function at "max(max_foreach(//50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m))"

              Click image for larger version  Name:	image.png Views:	0 Size:	54.2 KB ID:	460965
              Меняя на last_foreach и убирая ​1m тип ошибки не меняется:
              Click image for larger version  Name:	image.png Views:	0 Size:	18.6 KB ID:	460966

              ​отфильтровал элементы по тегу, все корректно:
              Click image for larger version  Name:	image.png Views:	0 Size:	171.4 KB ID:	460967
              Убедился что данные собираются
              Click image for larger version  Name:	image.png Views:	0 Size:	74.4 KB ID:	460968
              На примере одного из эл. данных убедился, что в периоде 1й минуты данные есть:
              13.03.2023 15:22:50 69
              13.03.2023 15:22:40 73
              13.03.2023 15:22:30 72
              13.03.2023 15:22:21 73
              13.03.2023 15:22:11 68
              13.03.2023 15:22:00 71
              13.03.2023 15:21:51 68
              13.03.2023 15:21:40 67
              13.03.2023 15:21:30 71

              Как траблшутить дальше?​​
              Last edited by ilja; 13-03-2023, 14:33.

              Comment

              • ilja
                Junior Member
                • Jan 2023
                • 14

                #8
                Дальнейшие изыскания по проблеме:

                1. Для того, что бы убедиться, что вычисление с фильтром по тегам в моем zabbix_server (Zabbix) 6.2.6 работает, создал вычисляемый элемент данных на основе элементов из стандартных шаблонов следующего вида sum(last_foreach(//net.if.in[*]?[tag="interface:eth3"],1m)) и убедился. что это работает:


                2. Далее выясняя какая часть моего тега zabbix-у не нравится, я исключил значение из связки имя:значение тега и тест прошел, т.е. вычисление сработало, но данные захвачены как и в случае с вычислением без тега (max(max_foreach(/BILLING-DB-01/50prcntExTime[*],1m))) меня не устраивают т.к. захватывают лишнее.
                ​ ​
                3. Решил из первоначального варианта max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxService.onStart_"],1m)) удалить точку и нижнее подчеркивание из значения тега (разбил данные макроса на 3 {{#EVENTLOG}.regsub("([^[.]+)([.])([^_.]+)_", \1\3)}​ пример ключей в {#EVENTLOG} и разбивки на группы по ссылке: https://regex101.com/r/HGZiyG/1 ).
                4. В итоге получил связку тега 50pr_of_inquiries: GprsGxServiceonStart​. Пробую повторить тест, ошибка осталась: Cannot evaluate expression: no input data for function at "max(max_foreach(//50prcntExTime[*]?[tag="50pr_of_inquiries:GprsGxServiceonStart"],1m))"
                ​Далее решил пробовать использовать {{#EVENTLOG}.regsub("([^[.]+)([.])([^_.]+)_", \1\3)}​ в виде имени тег-а, а не значения. Был удивлен что это сработало и я получил связку тега: GprsGxServiceonStart​: GprsGxServiceonStart​ и попробовал выполнить вычисление только по имени тега max(max_foreach(/BILLING-DB-01/50prcntExTime[*]?[tag="GprsGxServiceonStart"],1m)) как в пункте 2. Но ошибка сохранилась.​

                Comment

                Working...