Ad Widget

Collapse

Не создаются items из discovery rule

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Andrewshe
    Junior Member
    • Feb 2024
    • 17

    #1

    Не создаются items из discovery rule

    Добрый день! Подскажите пожалуйста в чем ошибка?
    Пытаюсь создать автоматическое создание items на основе данных json.
    1. Создан template, в него добавлен item c типом "HTTP agent" получающий json по URL без парсинга.
    В latest data значения (исходный json) по нему отображаются.
    Формат :

    Click image for larger version

Name:	image.png
Views:	155
Size:	59.7 KB
ID:	479293

    2. создано discovery rule c типом "Dependent item" и выбран "Master item" из п.1.
    В нем же настроен Preprocessing: JSONPath $.components[?(@.status)]~ Для того чтобы получить имя ключа, чтобы использовать его далее.
    Тест не проходит, возвращает ошибку:

    ​​Click image for larger version

Name:	image.png
Views:	156
Size:	15.4 KB
ID:	479294
    Для проверки этого создан отдельный зависимый item от "Master item" из п.1. с аналогичным Preprocessing: JSONPath $.components[?(@.status)]~ и по нему значение отображает корректное, то что нужно.
    Click image for larger version

Name:	image.png
Views:	153
Size:	21.2 KB
ID:	479295
    в этом же discovery rule настроен LLD macros: {#COMPONENT.NAME} = $.components[?(@.status)]~

    3. Создан “item prototypes” Name: Marketplace service {#COMPONENT.NAME}
    Key: marketplace.status[{#COMPONENT.NAME}]
    c типом "Dependent item" и выбран "Master item" из п.1.
    Preprocessing: JSONPath $.components.{#COMPONENT.NAME}.status

    Но в итоге никакие item по этому правилу не создаются.
    Attached Files
  • Hamardaban
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • May 2019
    • 2713

    #2
    Думаю во первых json для LLD неправильный - нужен массив объектов "[{},{},,{}]", а не объект."{}".

    Comment

    • Andrewshe
      Junior Member
      • Feb 2024
      • 17

      #3
      Originally posted by Hamardaban
      Думаю во первых json для LLD неправильный - нужен массив объектов "[{},{},,{}]", а не объект."{}".
      Т.е. в discovery rule неправильно указано правило Preprocessing, из него же дальше идет LLD?

      Comment

      • Hamardaban
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • May 2019
        • 2713

        #4
        Не об этом речь! Мастер итем отдает неправильный json, непригодный для LLD. Поместите содержимое json в [] чтоб получился массив.

        Comment

        • Andrewshe
          Junior Member
          • Feb 2024
          • 17

          #5
          Не получается распарсить json к виду:
          [
          "ping",
          "reactiveDiscoveryClients",
          "clientConfigServer",
          "livenessState",
          "rabbit",
          "db",
          "readinessState",
          "refreshScope",
          "diskSpace",
          "discoveryComposite"
          ]

          Zabbix ругается на <cannot extract value from json by path "$.components[?(@.status)]~": invalid object format, expected opening character '{' or '[' at: '' > если я использую в препроцессинг выражение $.components[?(@.status)]~, это же выражение в "JSONPath Online" работает. Как распарсить пока не нашел, пробую обходной путь.

          Для проверки, пробую создать item получающий готовый json из файла и настроить discovery rule на него, получает.

          Click image for larger version  Name:	image.png Views:	0 Size:	33.3 KB ID:	479411
          Далее в discovery rule как master item выбираю его, в Preprocessing ничего не указываю (т.к. он готовый), в LLD Macros задаю:

          Click image for larger version  Name:	image.png Views:	0 Size:	11.3 KB ID:	479412

          В Item prototype в настройках Preprocessing задаю аналогично:
          Click image for larger version  Name:	image.png Views:	0 Size:	13.8 KB ID:	479413

          Но все равно не работает.​

          Даже наверное в Item prototype не надо вообще ничего указывать в Preprocessing, задать только правильный Name и Key с макросом, но тоже не работает.
          Attached Files
          Last edited by Andrewshe; 21-02-2024, 18:07.

          Comment

          • Hamardaban
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • May 2019
            • 2713

            #6
            Извините - видимо я не так понял вашу задачу. Видимо моих познаний недостаточно для понимания ваших путей.
            еще раз извините - может кто из коллег подскажет .

            Comment

            • Andrewshe
              Junior Member
              • Feb 2024
              • 17

              #7
              Hamardaban, спасибо за помощь. Возможно это я не так понимаю логику работы и можно сделать другим способом, буду признателен за советы.
              Моя цель получив json вида:
              Click image for larger version

Name:	image.png
Views:	145
Size:	73.9 KB
ID:	479431

              создать автоматически items со статусами компонентов из json (components), т.е. components.discoveryClient.status, components.db.status, components.discoveryComposite.status и т.д.
              Т.е. например, item "myservicename.db" и статус "UP"

              Comment

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

                #8
                Originally posted by Andrewshe
                Hamardaban, спасибо за помощь. Возможно это я не так понимаю логику работы и можно сделать другим способом, буду признателен за советы.
                Моя цель получив json вида:
                [...]
                создать автоматически items со статусами компонентов из json (components), т.е. components.discoveryClient.status, components.db.status, components.discoveryComposite.status и т.д.
                Т.е. например, item "myservicename.db" и статус "UP"
                Спасибо, теперь стало немного понятнее.
                Как совершенно верно отметил коллега Hamardaban, для дискаверинга нужен JSON, содержащий массив. В вашем случае JSON есть, но это просто объект со множеством атрибутов, а не массив. Но это дело поправимое - с помощью предобработки на JavaScript его можно привести к нужному виду, получив на выходе что-то вроде следующего:
                Code:
                [
                {"component": "clientConfigServer", "status": "UP"},
                {"component": "db", "status": "UP"},
                {"component": "discoveryComposite", "status": "UP"},
                ​{"component": "discoveryComposite.discoveryClient", "status": "UP"},
                ...
                ​]
                Такой массив уже будет легко как скормить дискаверингу (т.е. правилу обнаружения), так и выдирать из него нужные значения элементов данных, созданных из прототипов.​

                Comment

                • Andrewshe
                  Junior Member
                  • Feb 2024
                  • 17

                  #9
                  Kos, спасибо. Попробую привести JSON к такому виду.

                  Comment

                  • Andrewshe
                    Junior Member
                    • Feb 2024
                    • 17

                    #10
                    Kos, подскажите пожалуйста где почитать про "предобработку на JavaScript" приминительно к Zabbix? И почему предпочтительнее использовать JavaScript (не пинайте, только погружаюсь в zabbix)?

                    Comment

                    • Alex_UUU
                      Senior Member
                      • Dec 2018
                      • 541

                      #11
                      Originally posted by Andrewshe
                      Kos, подскажите пожалуйста где почитать про "предобработку на JavaScript" приминительно к Zabbix? И почему предпочтительнее использовать JavaScript (не пинайте, только погружаюсь в zabbix)?
                      Там используется "урезанный" джаваскрипт, в доках есть ссылка даже на онлайн-тесты.
                      На входе есть переменная value - это последнее полученное значение после предыдущих предобработок.
                      возвратить return и что отдавать
                      Кнопочка тест работает даже на моменте создания итема. Именно так и пользуюсь, скармливая нужное, смотрю на результат.

                      Comment

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

                        #12
                        Originally posted by Andrewshe
                        Kos, подскажите пожалуйста где почитать про "предобработку на JavaScript" приминительно к Zabbix? И почему предпочтительнее использовать JavaScript (не пинайте, только погружаюсь в zabbix)?
                        Почитать - вестимо, в документации
                        Если читаете на русском языке, то я бы рекомендовал читать о версии 6.0 (ссылка) - как LTS-версия, она более "причёсана" и лучше поддерживается, чем уже устаревшие более старые версии или не-LTS версии 6.2 и 6.4. В отношении предобработки JavaScript между версиями 6.0 и 6.4, по-моему, ничего не менялось.

                        Из неочевидных вещей, на которых внимание в документации не акцентируется (а если и упоминается, то вскользь):
                        • для работы JavaScript используется движок Duktape. Он соответствует спецификациям ES 5.0 и ES 5.1, но не более новым; это нужно учитывать (например, стрелочные функции не поддерживаются).
                        • при предобработке на входе функция получает исходные данные в переменной value в виде текстовой строки; на выходе она должна вернуть результат тоже в виде текстовой строки - всё это независимо от указанного для элемента данных типа данных (впрочем, если вовращается число, то оно автоматически преобразуется в текст).
                        • из предыдущего пункта следует неочевидная вещь: если есть сомнения, то лучше явно указывать преобразования типов. Классический пример: если есть пользовательский макрос {$EXAMPLE.MACRO}, содержащий какое-то число, и хочется в предобработке просто прибавить это число к исходному значению, то такой код:
                        Code:
                        return value + {$EXAMPLE.MACRO};
                        работать не будет. Вернее, работать-то будет, но неправильно: он будет конкатенировать две текстовые строки вместо арифметического сложения. Правильный код в таком случае будет таким:

                        Code:
                        return (parseInt(value) + parseInt("{$EXAMPLE.MACRO}"));
                        • при обработке JSON-ов удобно использовать две функции: JSON.parse() (преобразование строки в объект, обычно в начале кода) и JSON.stringify() (обратное преобразование, обычно на выходе)​.
                        Last edited by Kos; 22-02-2024, 19:10.

                        Comment

                        • Andrewshe
                          Junior Member
                          • Feb 2024
                          • 17

                          #13
                          Alex_UUU, Kos спасибо! Буду разбираться.

                          Comment

                          • Tonik
                            Junior Member
                            • Jun 2023
                            • 13

                            #14
                            Andrewshe можно с JS не разбираться, а использовать "Замена".
                            На входе ["...","...","..."]
                            1) [" -> [{"data" : "
                            2) "," -> "} , {"data" : "
                            3) "] -> "}]
                            На выходе будет [{"data" : "..."} , {"data" : "..."} , {"data" : "..."}]

                            Comment

                            • Andrewshe
                              Junior Member
                              • Feb 2024
                              • 17

                              #15
                              Originally posted by Tonik
                              Andrewshe можно с JS не разбираться, а использовать "Замена".
                              На входе ["...","...","..."]
                              1) [" -> [{"data" : "
                              2) "," -> "} , {"data" : "
                              3) "] -> "}]
                              На выходе будет [{"data" : "..."} , {"data" : "..."} , {"data" : "..."}]
                              Tonik, спасибо попробую.

                              Comment

                              Working...