Ad Widget

Collapse

Не могу понять regex в zabbix

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Cons74
    Junior Member
    • Apr 2019
    • 19

    #1

    Не могу понять regex в zabbix

    Добрый день.

    Писал ключ для item вида web.page.regexp[] и захотелось найти какую-то отладку regexp, т.к. web.page.regexp[] возвращает пустую строку.
    Нашел описание https://www.zabbix.com/documentation...ar_expressions, но не пойму как работает эта regexp в zabbix.

    Пример: тестовая строка "sessions_all: 456", regexp выражение sess.*
    Для варианта "Результат ИСТИНА" ожидаемо получаю результат "Истина", а для "Строка символов включена" получаю ЛОЖЬ.
    Attached Files
  • Cons74
    Junior Member
    • Apr 2019
    • 19

    #2
    Что означает тип "Строка символов включена", если он не означает "совпадение подстроки", и почему возвращает ЛОЖЬ?

    Comment

    • Cons74
      Junior Member
      • Apr 2019
      • 19

      #3
      Я так чувствую, надо писать напрямую разработчикам. Кто скажет адрес?

      Comment

      • Semiadmin
        Senior Member
        • Oct 2014
        • 1625

        #4
        Тип "Строка символов включена" означает буквальное включение в строку данного текста, а не совпадение с регуляркой. Вам нужен тип "Результат ИСТИНА".

        Comment

        • Cons74
          Junior Member
          • Apr 2019
          • 19

          #5
          Ясно. Значит никакого "продвинутый редактор для создания и тестирования сложных регулярных выражений" нет. Получается только на "ИСТИНА/ЛОЖЬ" можно проверить.

          Я хотел отладить регулярку, которая получает несколько строк с web-страницы.

          Текст страницы:
          "HTTP/1.1 200 OK
          Date: Tue, 02 Apr 2019 08:51:32 GMT
          Server: Apache/2.4.38 (Win64) OpenSSL/1.0.2r
          Content-Length: 110
          Connection: close
          Content-Type: application/json; charset=utf-8

          {
          "sessions_all": 416,
          "sessions_backgroundjob": 4,
          "sessions_comconnection": 0,
          "sessions_client": 408
          }"


          Выражение regex:
          sessions.*(\n[^}].*)*

          В тестах получаю: sessions_all": 416,
          "sessions_backgroundjob": 4,
          "sessions_comconnection": 0,
          "sessions_client": 408

          а при попытке вставки в web.page.regexp[], даже просто 'session.*' в виде web.page.regexp[vm28,"MonitoringDB/hs/Monitoring/vm07/sessionsjson",8080,"sessions.*",,\1] - в текущих данных получаю пустую строку.

          Comment

          • Victor Sklyarov
            Senior Member
            • Apr 2016
            • 184

            #6
            Отладчик вам в помощь https://regex101.com/
            Что вы хотите выбрать? Если все строки где есть session, то вот: ("sessions.*: \d+)\s? Выбирайте параметр /1

            Comment

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

              #7
              Originally posted by Cons74
              при попытке вставки в web.page.regexp[], даже просто 'session.*' в виде web.page.regexp[vm28,"MonitoringDB/hs/Monitoring/vm07/sessionsjson",8080,"sessions.*",,\1] - в текущих данных получаю пустую строку.
              Это, как раз, логично. "\N" заменяется содержимым соответствующей matched group, а у вас в данном случае в регулярном выражении ни одной matched group нет.
              Исходное выражение (sessions.*(\n[^}].*)*) содержит одну пару круглых скобок; соответственно - они определяют одну matched group.

              Для отладки регулярных выражений удобно использовать вот этот ресурс: в большое окно вбиваете исходный обрабатываемый текст, в верхнее поле ввода - ваше регулярное выражение, и видите весь процесс разбора текста в соответствии с этим выражением. В данном случае, если указать в качестве регулярного выражения
              sessions.*(\n[^}].*)*
              то в первую группу попадает строка:
              "sessions_client": 408
              (вместе с переводами строк в начале и в конце).

              Comment

              • Cons74
                Junior Member
                • Apr 2019
                • 19

                #8
                Выражение ("sessions.*: \d+)\s? на regex101.com получает строки по-отдельности, 4 match (https://regex101.com/r/UOP71n/1/) а мне надо все сразу.
                То, что вышеуказанное выражение получает по одной строке - соответствует утверждению
                Originally posted by Kos
                Исходное выражение (sessions.*(\n[^}].*)*) содержит одну пару круглых скобок; соответственно - они определяют одну matched group.
                Но. Сайт regex101.com для выражения sessions.*(\n[^}].*)* выдает в Match1-Group1 две строки, вернее, перевод строки и строку с текстом.Click image for larger version

Name:	Screenshot_2.png
Views:	2015
Size:	128.6 KB
ID:	377088

                А в zabbix для только одна пустая строка.
                Click image for larger version

Name:	Screenshot_28.png
Views:	1978
Size:	9.8 KB
ID:	377089
                Получается что zabbix интерпретирует sessions.*(\n[^}].*)* по-своему (отбрасывает строки ниже пустой)?
                Attached Files

                Comment

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

                  #9
                  Но. Сайт regex101.com для выражения sessions.*(\n[^}].*)* выдает в Match1-Group1 две строки, вернее, перевод строки и строку с текстом.
                  Я же писал про это:
                  то в первую группу попадает строка:
                  "sessions_client": 408
                  (вместе с переводами строк в начале и в конце).
                  Т.е. в группу попадает перевод строки, процитированная красным строка, а затем - ещё один перевод строки.

                  А в zabbix для только одна пустая строка.
                  Какой тип у вас используется в Zabbix-е для этого значения? Если Character - то и будет лишь первая строка (которая пустая), а если Text - то должно быть всё нормально.

                  Comment

                  • Cons74
                    Junior Member
                    • Apr 2019
                    • 19

                    #10
                    Originally posted by Kos
                    Какой тип у вас используется в Zabbix-е для этого значения? Если Character - то и будет лишь первая строка (которая пустая), а если Text - то должно быть всё нормально.
                    Тип=Text ...


                    Comment

                    • Cons74
                      Junior Member
                      • Apr 2019
                      • 19

                      #11
                      Вечер наверно, ничего не понимаю. Новый пример:
                      Click image for larger version  Name:	Screenshot_4.png Views:	2 Size:	82.1 KB ID:	377098
                      Zabbix по настройке web.page.regexp[vm28,"MonitoringDB/hs/Cluster1cMonitoring/vm07/sessionsjson",8080,"sess[^}]+"] выдает только первую строку из 4х.
                      А если прописать в конце ,,\0 (или ,,\1) - вообще пустая строка.
                      Attached Files
                      Last edited by Cons74; 05-04-2019, 18:02.

                      Comment

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

                        #12
                        Похоже, что для метрики web.page.regexp всегда возвращается максимум одна строка. Видимо, для этой метрики для регулярного выражения не используется модификатор "g", а явно указать его в самом регулярном выражении нельзя:
                        g modifier can't be specified in line.
                        Zabbix по настройке web.page.regexp[vm28,"MonitoringDB/hs/Cluster1cMonitoring/vm07/sessionsjson",8080,"sess[^}]+"] выдает только первую строку из 4х.
                        А если прописать в конце ,,\0 (или ,,\1) - вообще пустая строка.
                        Я перепроверил у себя (сервер и агент версии 4.0.6), сделав на веб-сервере тестовый файл с вашим содержимым.
                        С регулярным выражением "sess[^}]+" - да, возвращает первую строку из четырёх совпадающих.
                        Если дописать в конце ,,\0 - возвращает ту же строку.
                        Если дописать в конце ,,\1 - возвращает пустую строку (что вполне логично, поскольку нет capturing group, см. мою предыдущую реплику).
                        Если сделать capturing group, заключив шаблон регулярного выражения в круглые скобки ("(sess[^}]+)") - все три раза возвращается одна и та же строка.
                        Если в качестве регулярного выражения указать ".*" (т.е. что угодно), то возвращается первая строка ответа:
                        Code:
                        HTTP/1.1 200 OK
                        Если вместо метрики web.page.regexp использовать web.page.get, то возвращается вся страница со всеми заголовками HTTP, включая первую с кодом возврата.

                        Честно говоря, я не очень понимаю, какую задачу Вы пытаетесь решить. Возможно, для неё лучше подойдёт HTTP-агент, появившийся в сервере, начиная с версии 4.0?

                        Comment

                        • Cons74
                          Junior Member
                          • Apr 2019
                          • 19

                          #13
                          Задача была: получать в zabbix данные по количеству сессий пользователей в кластере 1с. Для этого в отдельной базе 1с был создан http-сервис, который по запросу возвращал страницу со значениями разных типов сессий. Это те самые строки
                          {
                          "sessions_all": 416,
                          "sessions_backgroundjob": 4,
                          "sessions_comconnection": 0,
                          "sessions_client": 408
                          }"

                          Пока http-сервис возвращал одну строку на странице - web.page.regexp работал. Но когда я переписал сервис на возврат всех параметров разом - web.page.regexp перестал справляться.

                          В результате сперва перешел на использование web.page.get в основном item, и добавил несколько зависимых item, в которых в предобработке уже искал по началу конкретной строки, например, "sessions_backgroundjob".
                          Но оказалось, что сервис работает нестабильно: все время валится ошибка таймаута. В настройках zabbix таймаут 4сек, а сервис отвечал по 10-15сек. Настройку решили не менять. И тогда перешел на zabbix_sender: база 1С сама регулярно формирует файл с данными и вызывает zabbix_sender.exe, а тот уже отправляет данные на сервер.

                          Спасибо за участие в решении задачи.

                          Comment

                          Working...