Ad Widget

Collapse

Правильный синтаксис wmi.getall

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Victor Sklyarov
    Senior Member
    • Apr 2016
    • 184

    #1

    Правильный синтаксис wmi.getall

    Необходимо выбрать 2 параметра. Методом проб и ошибок подобрал синтаксис, работающий с zabbix_get -s x.x.x.x -k wmi.getall["root\hpq, [select Name, CurrentState from HP_NumericSensor]"] Если создаю на узле элемент с таким ключом и пытаюсь его выполнить, получаю ошибку "Invalid number of parameters" Как правильно написать запрос? Второй вопрос, если задать условие выборки только некондиционных элементов, то в случае когда все элементы нормальные, по команде zabbix_get приходит пустой результат: ZBX_NOTSUPPORTED: Empty WMI search result. Можно ли получить пустой результат в элемент данных и предобработкой превратить его в значение ОК?
  • Semiadmin
    Senior Member
    • Oct 2014
    • 1625

    #2
    1. wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor"]
    2. Можно, начиная с 5.2, через Check for not supported value

    Comment

    • Semiadmin
      Senior Member
      • Oct 2014
      • 1625

      #3
      Хотя пишут, что в агенте 5.2.5 и, видимо, 5.0.9 и 5.4.0
      ZBX-17543 Fixed error in case if wmi.getall returned no items

      Comment

      • Victor Sklyarov
        Senior Member
        • Apr 2016
        • 184

        #4
        1. Похоже zabbix_get и запрос с сервера по разному разбирают строку. Версия и того и другого 5.4.6
        zabbix_get -s 172.20.78.72 -k wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor"]
        zabbix_get [115194]: invalid parameter "select Name, CurrentState from HP_NumericSensor]"
        Try 'zabbix_get --help' for more information.

        Запрос сервера отрабатывает нормально. Т.е. для zabbix_get оператор select нужно взять в [], а для запроса c сервера в " "

        2. Элемент wmi.getall[root\hpq, "select Name from HP_NumericSensor where CurrentState NOT 'Normal'"] нормально отрабатывает с преобразованием задать значение в ОК.
        Если я добавлю ещё шаг для обработки [{"CurrentState":"Degrade","Name":"Temperature Sensor 25"}], будет ли он выполняться после обработки ошибки или только если ошибки нет?

        Comment

        • Semiadmin
          Senior Member
          • Oct 2014
          • 1625

          #5
          Так какая все-таки версия агента? Вроде бы должны были исправить неподдерживаемость при пустом выводе, так что и обрабатывать ее, получается, не надо

          Comment


          • Victor Sklyarov
            Victor Sklyarov commented
            Editing a comment
            Поставил 5.4.6 на узел, был 4.4.3 Ситуация только ухудшилась. На сервере 5.4.6. Не исправили
        • Kos
          Senior Member
          Zabbix Certified SpecialistZabbix Certified Professional
          • Aug 2015
          • 3404

          #6
          Originally posted by Victor Sklyarov
          1. Похоже zabbix_get и запрос с сервера по разному разбирают строку. Версия и того и другого 5.4.6
          zabbix_get -s 172.20.78.72 -k wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor"]
          zabbix_get [115194]: invalid parameter "select Name, CurrentState from HP_NumericSensor]"
          Try 'zabbix_get --help' for more information.

          Запрос сервера отрабатывает нормально. Т.е. для zabbix_get оператор select нужно взять в [], а для запроса c сервера в "
          Команда zabbix_get сначала обрабатывается шеллом (оболочкой операционной системы), который некоторые символы может понимать по-своему. В частности, пробелы и кавычки.
          Чтобы избежать недоразумений, самое простое - это обрамить весь ключ апострофами:
          Code:
          zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor"]'

          Comment

          • Victor Sklyarov
            Senior Member
            • Apr 2016
            • 184

            #7
            Поставил на узел агент 5.4.6, до этого был 4.4.3 Никакими ухищрениями получить параметры через zabbix_get -s 127.0.0.1 -k .... не удаётся. Можно получить параметры только так zabbix_agentd -t wmi.getall[root\hpq, [select Name, CurrentState from HP_NumericSensor]] никакие одиночные кавычки не спасают. Более того получить что-то через конструкцию wmi.getall[root\hpq, "select Name from HP_NumericSensor where CurrentState NOT 'Normal'"] вообще не удаётся. Это что касается агента Windows (стоит на Win2008R2 64)

            Что касается получения метрики с zabbix сервера (v 5.4.6 OS SLES15 SP2)
            1. zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor where CurrentState like 'Normal'"]'
            ZBX_NOTSUPPORTED: Empty WMI search result. - не работает
            2. zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, [select Name from HP_NumericSensor where CurrentState like "Normal"]]'
            [{"Name":"Temperature Sensor 1"},{"Name":"Temperature Sensor 2"},{"Name":"Temperature Sensor 5"},........ Нормально отрабатывает
            3. zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, "select Name from HP_NumericSensor"]'
            [{"Name":"Temperature Sensor 1"},{"Name":"Temperature Sensor 2"},{"Name":"Temperature Sensor 5"},...... Без оператора WHERE работает и с кавычками вокруг select и со скобками

            4. На самом деле нужно получить элементы со статусом проблема, если они есть zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, [select Name from HP_NumericSensor where CurrentState not "Normal"]]' Работает с таким синтаксисом, но возвращает сообщение, а не пустой массив []
            ZBX_NOTSUPPORTED: Empty WMI search result.

            Как пел Владимир Семёнович: "Удивительное рядом, но оно запрещено..." Сухой остаток: на узле windows через zabbix_get v.5.4.6 вообще ничего получить с ключом wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor where CurrentState not 'Normal'"] ( или like ) не удаётся. Тем более не работает никакой синтаксис с оператором WHERE. С zabbix сервера можно получить параметры с синтаксисом, использующим [....] вокруг select. Синтаксис с "" работает неверно, конструкция where CurrentState not 'Normal' возвращает все элементы со статусом Normal, а не должна.

            Comment

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

              #8
              Я бы перефразировал, что сухой остаток: кто-то не понимает, что такое шелл и как он работает.
              От версии zabbix_get это никак не зависит. Да и вообще это к самому Zabbix-у имеет косвенное отношение.

              1. zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor where CurrentState like 'Normal'"]'
              ZBX_NOTSUPPORTED: Empty WMI search result. - не работает
              Логично, т.к. у вас внутри строки с апострофами используется апостроф.
              3. zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, "select Name from HP_NumericSensor"]'
              [{"Name":"Temperature Sensor 1"},{"Name":"Temperature Sensor 2"},{"Name":"Temperature Sensor 5"},...... Без оператора WHERE работает и с кавычками вокруг select и со скобками
              Т.е. та конструкция, о которой я говорил (обрамить апострофами весь ключ, который включает в себя и кавычки, и пробелы), - таки работает. Да, при этом символ апострофа недопустим внутри ключа, о чём я не сказал. Однако, если там необязательно должен быть именно апостроф (например, могут быть кавычки), то тогда и проблемы нет:
              Code:
              zabbix_get -s 172.20.78.72 -k 'wmi.getall[root\hpq, "select Name from HP_NumericSensor where CurrentState not \"Normal\""]'
              Апострофы ограничивают весь ключ, чтобы шеллом он воспринимался как один параметр, внутри которого ничего интерпретировать не надо (сохраняя все пробелы, кавычки и т.д.).
              Дальше уже идёт синткасис самого ключа Zabbix: второй параметр ключа (выражение select) заключается в кавычки, т.к. содержит внутри себя пробелы и другие кавычки. А эти самые "другие кавычки" (которые являются частью выражения select) экранируются обратным слэшем.
              возвращает сообщение, а не пустой массив []
              ZBX_NOTSUPPORTED: Empty WMI search result.
              А вот это уже зависит от версии агента. К сожалению, не могу проверить, т.к. у нас всё ещё используются более старые агенты (v4.0.x), в которых этот ключ не поддерживался вообще.

              Comment

              • Victor Sklyarov
                Senior Member
                • Apr 2016
                • 184

                #9
                "От версии zabbix_get это никак не зависит" - но Вы же не проверяли, не так ли? А я проверил. И zabbix_get и zabbix_agentd -t. В разных версиях, по разному. И почему, по Вашему мнению, инструмент проверки работы метрики не имеет отношения к zabbix? Ведь декларировано, что работает, а на самом деле не работает. Ниже вывод с агентом 5.4.6 Запросы сделаны точно по вашему шаблону.

                c:\zabbix\bin>zabbix_agentd -t 'wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor where CurrentState like \"Normal\""]'
                zabbix_agentd [22488]: invalid parameter "select Name, CurrentState from HP_NumericSensor where CurrentState like "Normal"]'"

                c:\zabbix\bin>zabbix_get -s 127.0.0.1 -k 'wmi.getall[root\hpq, "select Name, CurrentState from HP_NumericSensor where CurrentState like \"Normal\""]'
                zabbix_get [22084]: invalid parameter "select Name, CurrentState from HP_NumericSensor where CurrentState like "Normal"]'"
                Try 'zabbix_get --help' for more information.
                Last edited by Victor Sklyarov; 28-10-2021, 10:36.

                Comment

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

                  #10
                  А, то есть zabbix_get Вы запускали на Windows-машине? Тогда прошу прощения, я писал про Unix/Linux шелл.

                  Comment

                  • Semiadmin
                    Senior Member
                    • Oct 2014
                    • 1625

                    #11
                    А зачем, если не секрет, вообще мучиться с zabbix_get и zabbix_agentd -t, если в 5.4 есть кнопка Test в настойках айтема?
                    P.S. Попробовал на агенте 5.4.0 - вполне себе возвращает [] при пустом результате запроса
                    Last edited by Semiadmin; 28-10-2021, 13:30.

                    Comment


                    • Victor Sklyarov
                      Victor Sklyarov commented
                      Editing a comment
                      Да в общем не за чем. Так и проверяю. Что значит возвращает []? Я нажимаю на кнопку ТЕСТ, приходит ошибка "Empty WMI search result" Ведь пустой ответ никак не может быть занесён в получаемую метрику. Посему приходится обрабатывать ошибку. Или я что-то не понимаю?
                      А вообще WQL полон сюрпризов. Получаю:
                      [{"Name":"Fan 3","OperationalStatus":[2]},
                      {"Name":"Fan 4","OperationalStatus":[2]},
                      {"Name":"Fan 5","OperationalStatus":[2]},
                      {"Name":"Fan 6","OperationalStatus":[2]},
                      {"Name":"Fan 7","OperationalStatus":[2]},
                      {"Name":"Fan 8","OperationalStatus":[2]}]
                      Хотел с помощью where OperationalStatys != 2 выбирать только состояния деградации а в случае если все =2, получать пустой массив и превращать его в значение метрики "ОК". Но не тут то было. Получаемое значение OperationalStatys - массив ([2]) из одного элемента. И сколько не бился, так и не смог сделать выборку по != 2
                  • Alex_UUU
                    Senior Member
                    • Dec 2018
                    • 541

                    #12
                    Коллеги, обратите внимание на намек профессионала.

                    Originally posted by Kos
                    А, то есть zabbix_get Вы запускали на Windows-машине? Тогда прошу прощения, я писал про Unix/Linux шелл.
                    А теперь посмотрите на свои команды и сосчитайте кавычки. И в линухе и в винде надо все экранировать.А то у вас получается, что сначала кавычки раскрываете, внутри закрываете, а потом опять".

                    Посмотрите, как экранируются кавычки в винде.
                    Судя по ошибке кавычки не передаются агенту.

                    Да, не обязательно создавать итем, заббикс_гет работает и без созданного ранее :-)

                    Comment

                    • Semiadmin
                      Senior Member
                      • Oct 2014
                      • 1625

                      #13
                      Ну как что значит - возвращает []?
                      Есть у меня шаблонный айтем wmi.getall[root\cimv2,"select Name,Description,NetConnectionID,Speed,AdapterType Id,NetConnectionStatus from win32_networkadapter where PhysicalAdapter=True and NetConnectionStatus>0"].
                      Без препроцессинга. Получает JSON, который потом используется в LLD. Меняю в запросе > на <, т.е. условие заведомо невыполнимое, получаю в ответе пустой JSON []. Агент 5.4.0.

                      Comment

                      Working...