Ad Widget

Collapse

Plugins.Postgres и символы '<', '>'

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • a.l.r.e
    Member
    • May 2021
    • 45

    #1

    Plugins.Postgres и символы '<', '>'

    При создании custom query для плагина Plugins.Postgres в Zabbix Agent 2 (https://www.zabbix.com/integrations/...tgresql_agent2)
    Столкнулся проблемой беспричинной конвертации в выводе символов '<', '>' в \u003c, \u003e

    Click image for larger version

Name:	image.png
Views:	156
Size:	26.2 KB
ID:	455054

    Можно ли это как-то обойти ?

    А то невозможно нормально вывести как html в widget 'plain text' https://www.zabbix.com/documentation...ets#plain-text
  • a.l.r.e
    Member
    • May 2021
    • 45

    #2
    Ещё и символ '&' попал под раздачу

    Click image for larger version

Name:	image.png
Views:	99
Size:	20.4 KB
ID:	455067

    Comment

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

      #3
      Не знаю, где в выводе должен был быть символ "&", но возвращается, насколько я вижу, вполне корректный JSON (ну, кроме имени колонки "?column?"; но предполагаю, что если в исходном SELECT-е явно оговорить, как обозвать эту колонку - "SELECT ... AS ...", то там будет именно указанное имя).
      А решение простое: добавить к этому элементу данных шаг препросессинга с типом JSONPath, при помощи которого извлекать из этого JSON-а нужный фрагмент.

      Comment

      • a.l.r.e
        Member
        • May 2021
        • 45

        #4
        Повторяю второй пост с подсветкой

        Click image for larger version

Name:	image.png
Views:	104
Size:	20.9 KB
ID:	455072

        Происходит превращение символа '&' в \u0026

        Прямой аналог работы test.sql в psql выглядит так:

        Click image for larger version

Name:	image.png
Views:	92
Size:	12.2 KB
ID:	455073

        - здесь перекодирование отсутствует.

        Скорее всего в плагине установлен какой-то странный CLIENT_ENCODING, типа LATIN1 ( https://www.postgresql.org/docs/curr...RSET-SUPPORTED )

        Click image for larger version

Name:	image.png
Views:	91
Size:	26.5 KB
ID:	455075​​
        Attached Files

        Comment

        • a.l.r.e
          Member
          • May 2021
          • 45

          #5
          А скорее goland так работает

          https://golang-blog.blogspot.com/202...in-golang.html

          Quote и QuoteToASCII конвертируют строки в экранированные строковые литералы Go. Последний гарантирует, что результатом является строка ASCII, экранируя любой не-ASCII Unicode с \u

          https://habr.com/ru/company/vk/blog/314804/#19

          Внутри строк могут быть экранированные последовательности.

          data2 := "A\xfeC"
          fmt.Println(utf8.ValidString(data2)) // выводит: false​

          Comment

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

            #6
            Originally posted by a.l.r.e
            Повторяю второй пост с подсветкой

            [...]​

            Происходит превращение символа '&' в \u0026
            Спасибо, увидел.

            В любом случае, это не отменяет основной мысли моей реплики: плагин к агенту Zabbix вам возвращает корректный JSON, из которого надо извлечь нужную часть. Тогда в ней всё будет хорошо.

            Попробуйте дополнить свой SQL-запрос явным именем возвращаемого поля:
            Code:
            SELECT '<bla-bla-&-bla/>' as RESULT;
            Тогда, вероятно, агент будет возвращать вам результат как значение JSON-поля с именем 'RESULT':
            Code:
            {"RESULT":"\u003cbla-bla-\u0026-bla/\u003e"}
            В этом случае шаг препроцессинга с типом JSONPath и выражением:
            Code:
            $.RESULT
            вернёт вам то, что вы хотите получить:
            Code:
            <bla-bla-&-bla/>
            Last edited by Kos; 28-11-2022, 18:47.

            Comment

            • a.l.r.e
              Member
              • May 2021
              • 45

              #7
              Было так

              Click image for larger version

Name:	image.png
Views:	101
Size:	18.2 KB
ID:	455090

              Поправил на JSONPath

              Click image for larger version

Name:	image.png
Views:	93
Size:	17.6 KB
ID:	455091
              Ничего не поменялось

              Click image for larger version

Name:	image.png
Views:	96
Size:	44.3 KB
ID:	455092

              Откопал тут про golang

              https://golang-blog.blogspot.com/201...er-golang.html
              https://golang-blog.blogspot.com/201...-literals.html

              Примеры:

              'a'
              'ä'
              '本'
              '\t'
              '\000'
              '\007'
              '\377'
              '\x07'
              '\xff'
              '\u12e4'
              '\U00101234'
              '\'' // литерал руны, содуржащий символ одинарной кавычки
              'aa' // недопустимо: слишком много символов
              '\xa' // недопустимо: слишком мало шестнадцатеричных цифр
              '\0' // недопустимо: слишком мало восьмеричных цифр
              '\uDFFF' // недопустимо: суррогатная половина
              '\U00110000' // недопустимо: невалидная Unicode кодовая точка


              Видимо, придётся лезть в golang. Нужно понять как представить символы '<', '>', '&' в виде каких-то последовательностей \u, которые возможно сконвертируются golang в '<', '>', '&'

              Comment

              • a.l.r.e
                Member
                • May 2021
                • 45

                #8
                JSONPath другой

                Click image for larger version

Name:	image.png
Views:	95
Size:	17.4 KB
ID:	455094
                Но результат тот же

                Click image for larger version

Name:	image.png
Views:	97
Size:	43.6 KB
ID:	455095

                запрос (postgres все имена в lower преобразовывает)

                Click image for larger version

Name:	image.png
Views:	92
Size:	7.8 KB
ID:	455096
                ​​

                Comment

                • a.l.r.e
                  Member
                  • May 2021
                  • 45

                  #9


                  The default behavior is to escape &, <, and > to \u0026, \u003c, and \u003e to avoid certain safety problems that can arise when embedding JSON in HTML.

                  In non-HTML settings where the escaping interferes with the readability of the output, SetEscapeHTML(false) disables this behavior.​

                  Comment

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

                    #10
                    Блин, ну нет слов... Смотрите скриншоты, если не верите. Zabbix v6.0.9.
                    Click image for larger version

Name:	screenshot-2022-11-29_01.png
Views:	114
Size:	16.8 KB
ID:	455105 Click image for larger version

Name:	screenshot-2022-11-29_02.png
Views:	101
Size:	21.9 KB
ID:	455106

                    Отсылаю тестовые данные:
                    Code:
                    zabbix_sender -z 127.0.0.1 -s it00 -k jsonpath.test -o '{"result":"\u003cbla-bla-\u0026-bla/\u003e"}'
                    Результат в Latest data:
                    Click image for larger version

Name:	screenshot-2022-11-29_03.png
Views:	101
Size:	9.7 KB
ID:	455107

                    1) какая версия Zabbix у вас?
                    2) какие данные приходят от агента, если не делать никакой предобработки, а тип данных выставить в "Text"? Процитируйте, пожалуйста, дословно: либо из окна Latest data, либо из вывода команды zabbix_get.

                    Comment

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

                      #11
                      А, я, кажется, понял: у вас результат возвращается в квадратных скобках, которые я не учёл.
                      Это объясняет и то, что исходный JSONPath не сработал, вам пришлось добавлять вторую точку подряд.
                      Но это не решает проблему, правильный JSONPath:
                      Code:
                      $[0].result

                      Ну, или (что то же самое):
                      Code:
                      $[0]["result"]

                      Comment

                      • a.l.r.e
                        Member
                        • May 2021
                        • 45

                        #12
                        Спасибо.
                        В самом деле, с $[0].result заработало.

                        Zabbix 5.2.7

                        Comment

                        Working...