Ad Widget

Collapse

Отправка уведомлений об ошибке с текстом проблемы

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • BrunoFernandes
    Junior Member
    • Mar 2021
    • 6

    #1

    Отправка уведомлений об ошибке с текстом проблемы

    Доброго времени суток!
    Появилась такая задача, которую пока не смог решить: Необходимо настроить мониторинг сервиса таким образом, чтобы заббикс в случае ошибки отправлял сообщение включая текст ошибки которая приходит от сервиса. Например, сервис отвечает 503, а в теле "DB", и хотелось бы, чтобы заббикс отсылал сообщение с кодом и текстом находящимся внутри.
    Подскажите пожалуйста как такое можно реализовать ?
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Если речь идёт о веб-сервисах (т.е. 503 в данном примере - это HTTP-шный код ответа), то можно делать запросы при помощи агента HTTP (ссылка) и анализировать хоть возвращаемый заголовок, хоть тело.
    Например, выставить в настройках "Retreive mode = Body and headers", тип для возвращаемого элемента данных - Text (чтобы иметь возможность сохранять многострочные значения), далее в триггере анализировать начало возвращаемого значения на ошибочный код возврата при помощи регулярного выражения, а в имя триггера вставлять нужную подстроку из тела, вырезая её из значения при помощи макрофункции.

    Comment

    • BrunoFernandes
      Junior Member
      • Mar 2021
      • 6

      #3
      Originally posted by Kos
      Если речь идёт о веб-сервисах (т.е. 503 в данном примере - это HTTP-шный код ответа), то можно делать запросы при помощи агента HTTP (ссылка) и анализировать хоть возвращаемый заголовок, хоть тело.
      Например, выставить в настройках "Retreive mode = Body and headers", тип для возвращаемого элемента данных - Text (чтобы иметь возможность сохранять многострочные значения), далее в триггере анализировать начало возвращаемого значения на ошибочный код возврата при помощи регулярного выражения, а в имя триггера вставлять нужную подстроку из тела, вырезая её из значения при помощи макрофункции.
      По отдельности все понятно. А как все вместе связать не могу додумать, подскажите пожалуйста:
      анализировать скорее всего буду только заголовки, т.е. например приходит сообщение:

      HTTP/1.1 503 Service Unavailable
      Server: nginx
      Date: Fri, 30 Apr 2021 10:20:30 GMT
      Content-Length: 0
      Connection: keep-alive

      и я переправляю на почту или смс сообщение о проблеме с заголовком 503 Service Unavailable

      Я создал HTTP агент с минимальными настройками,
      Click image for larger version

Name:	Screenshot_12.png
Views:	306
Size:	52.0 KB
ID:	423892

      Создал веб сценарий с шагом проверки требуемой строки HTTP/1.1 200 OK и требуемым кодом состояния 200, после этого создал триггер с выражением {Узел сети:web.test.rspcode[Веб сценарий, шаг сценария].last()}>=400
      Затем добавил два макроса
      Click image for larger version

Name:	Screenshot_10.png
Views:	314
Size:	3.8 KB
ID:	423891

      И в названии триггера записал такое выражение

      Click image for larger version

Name:	Screenshot_11.png
Views:	318
Size:	3.6 KB
ID:	423893

      Для проверки в имени триггера оставил пока только вывод кода ошибки.

      Все что я сделал - правильно ли я вас понял и если да то где искать ошибки?)
      Attached Files

      Comment

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

        #4
        И снова здравствуйте!
        Нет, поняли не совсем правильно.

        Использовать можно либо HTTP-агент, либо веб-сценарии. Это альтернативы, которые не надо путать.
        Я сначала понял вашу задачу так, что интересующий вас текст ошибки находится в теле ответа, поскольку Вы писали:
        Например, сервис отвечает 503, а в теле "DB"
        Поэтому и предложил использовать HTTP-агент, поскольку только он позволяет извлекать какие-то данные именно из тела.
        Если интересует только само сообщение об ошибке (которое идёт не в теле ответа, а в HTTP-заголовке - сразу после кода "503"), то можно обойтись веб-сценарием - это настроить проще.

        Опишите вашу задачу подробнее, тогда можно будет посоветовать что-то более конкретное.

        Comment

        • BrunoFernandes
          Junior Member
          • Mar 2021
          • 6

          #5
          Originally posted by Kos
          И снова здравствуйте!
          Нет, поняли не совсем правильно.

          Использовать можно либо HTTP-агент, либо веб-сценарии. Это альтернативы, которые не надо путать.
          Я сначала понял вашу задачу так, что интересующий вас текст ошибки находится в теле ответа, поскольку Вы писали:


          Поэтому и предложил использовать HTTP-агент, поскольку только он позволяет извлекать какие-то данные именно из тела.
          Если интересует только само сообщение об ошибке (которое идёт не в теле ответа, а в HTTP-заголовке - сразу после кода "503"), то можно обойтись веб-сценарием - это настроить проще.

          Опишите вашу задачу подробнее, тогда можно будет посоветовать что-то более конкретное.
          Для упрощения, в HTTP заголовок сразу после кода ошибки решено было вставлять короткие сообщения (собственно вместо Service Unavailable там может быть фраза Database) о недоступности какого-то сервиса и это сообщение отправлять в смс, что не доступна БД этого узла сети или какой то другой сервис этого же узла сети.
          Приблизительно задача передо мной стоит такая.

          Comment

          • BrunoFernandes
            Junior Member
            • Mar 2021
            • 6

            #6
            Originally posted by Kos
            И снова здравствуйте!
            Нет, поняли не совсем правильно.

            Использовать можно либо HTTP-агент, либо веб-сценарии. Это альтернативы, которые не надо путать.
            Я сначала понял вашу задачу так, что интересующий вас текст ошибки находится в теле ответа, поскольку Вы писали:


            Поэтому и предложил использовать HTTP-агент, поскольку только он позволяет извлекать какие-то данные именно из тела.
            Если интересует только само сообщение об ошибке (которое идёт не в теле ответа, а в HTTP-заголовке - сразу после кода "503"), то можно обойтись веб-сценарием - это настроить проще.

            Опишите вашу задачу подробнее, тогда можно будет посоветовать что-то более конкретное.
            Не подскажите пожалуйста как все-таки сделать без скрипта?

            Comment

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

              #7
              Originally posted by BrunoFernandes
              Не подскажите пожалуйста как все-таки сделать без скрипта?
              Извините, так и не ответил.
              В этом случае HTTP-агент не нужен.
              Настраиваете веб-сценарий (собственно, вы уже описывали, как его настроили - в общем-то, в настройках сценария все верно).
              Далее настраиваете триггер. Если у вас для шага сценария задано поле "требуемые коды состояния"="200", то большого смысла проверять в триггере код завершения для шага нет: если он будет отличаться от "200", то "завалится" не только шаг, но и весь сценарий. Соответственно, будут доступны параметры web.test.fail[Сценарий] (станет больше нуля) и web.test.error[Сценарий] (текст сообщения об ошибке). Более того, последний из этих параметров будет доступен только в случае ошибки. Так что, в принципе, и проверять достаточно только его:
              Code:
              {Узел сети:web.test.error[Веб сценарий].strlen()}>0
              Ну а поскольку именно туда вы и запихиваете нужные вам сообщения, то в уведомлении они будут доступны как значение макроса {ITEM.VALUE1}.

              Comment

              • BrunoFernandes
                Junior Member
                • Mar 2021
                • 6

                #8
                Originally posted by Kos
                Ну а поскольку именно туда вы и запихиваете нужные вам сообщения, то в уведомлении они будут доступны как значение макроса {ITEM.VALUE1}.
                Спасибо большое! про веб-сценарий и условие в триггере понял, а вот про передачу в название триггера сообщения так и не могу понять:
                Какой макрос и где все таки присваивается текст этому макросу?
                {ITEM.VALUE1} как я понял итем это все таки узел сети? и с единицей в конце value тоже не очень понятно( Подскажите пожалуйста поподробнее

                Comment

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

                  #9
                  Ну, чего я буду документацию пересказывать...
                  В оповещении вместо макроса {ITEM.VALUE1} будет подставлено текущее (на момент срабатывания триггера) значение первого элемента данных из триггерного выражения.
                  В предлагаемом триггере это как раз текст сообщения об ошибке, возвращаемый HTTP-сервером после кода ответа.

                  Comment

                  Working...