Мониторинг с помощью ServiceCheck.HTTP

Started by Anth0ny, June 30, 2008, 10:30:38 AM

Previous topic - Next topic

Anth0ny

Приветствую!

Возникло некоторое непонимание с "ServiceCheck.HTTP".
Действовал согласно 2 части инструкции.

Привожу свою русскую интерпретацию (это не перевод):

QuoteМониторинг web-сервера возможен без добавления его в базу NetXMS как ноды (возможно, предполагается мониторить ресурс: на котором нет клиента NetXMS, который находится вне вашей сети или который находится не в вашем подчинении).

1) Для уже существующего в базе объекта-ноды (это может быть например сам сервер NetXMS) необходимо создать DCI (источник - агент NetXMS):

DCI: ServiceCheck.HTTP(server_ip_address,port,uri,host_header,response)

Замечание: При использовании метода "ServiceCheck.HTTP" невозможно использование URL, обязательно должен использоваться URI (в том числе для запроса к корню сайта), т.е.:

www.google.com - не правильно
www.google.com:/ - правильно

Далее в примерах вместо DNS-имени используется ip-адрес, но суть ограничения от этого не меняется.

Пример использования 1 (запрос к корню web-сервера):
ServiceCheck.HTTP(209.85.135.147,80,/,www.google.com,"^HTTP/1\.[01] 200.*")

Пример использования 2 (запрос к файлу test.html в корне сервера, файл должен существовать!):
ServiceCheck.HTTP(209.85.135.147,80,/test.html,www.google.com,"^HTTP/1\.[01] 200.*")

Пример использования 3 (запрос к файлу test.html в корне сервера, файл должен существовать, ищем на полученной странице слово "maps"):
ServiceCheck.HTTP(209.85.135.147,80,/test.html,www.google.com,"^HTTP/1\.[01] 200.*maps*")

Данный запрос может вернуть несколько значений:

0 - удача (соединение с сервером установлено и получен ожидаемый ответ)
1 - использованы неверные аргументы (в основном если неправильно написан RegExp)
2 - невозможно соединиться с сервером
3 - получен неправильный ответ сервера

Для процессинга ответов DCI, отличных от "0", можно создать threshold'ы.

Для сведения: для использования данного вида опросов на сервере NetXMS (если опрос идёт именно с него) требуется наличие субагента "portchecker". В случае с платформой Windows данный субагент уже присутствует и загружен по умолчанию. В случае с платформой UNIX вам нужно убедиться, что в конфиге агента NetXMS присутствует что-то вроде этого:

SubAgent = /usr/local/lib/libnsm_portCheck.so

А теперь вопрос: при условии что я всё правильно понял (см. мою интерпретацию) у меня в процессе тестирования данного метода мониторинга возникла проблема с обнаружением на странице нужных мне слов.

Тут всё просто: мой web-сервер в процессе работы генерирует статическую страничку со списком пунктов, на которой html-тегами типа <red> и <green> (для пущей наглядности проверяющему) помечаются проблемы в работе сайта, существующие на момент генерации этого статического html-файла. И мне была поставлена задача в автоматическом режиме обнаруживать на этой страничке слово <red> средствами мониторинга NetXMS. Вроде судя по описанию, задачка проста.

Однако не тут-то было. Как я не изгалялся, получить адекватный результат мне так и не удалось. DCI всегда возвращает "0". Всегда, как бы не менялось содержимое проверяемой странички!

Мой DCI:

ServiceCheck.HTTP(10.200.1.100,80,/worktest.html,www.intwww.local,"^HTTP/1\.[01] 200.*red*")

Есть на странице слово "red" - получаю "0".
Нет на странице "red" - тоже получаю "0".

Складывается впечатление, что DCI возвращает не указанные ранее 4 значения, а просто отчёт о состоянии DCI (0 - выполнено успешно). Я ведь правильно понял, что в случае, если DCI не находит искомое слово на странице, я должен получить значение "3" (получен неправильный ответ сервера)?

Или как DCI должна отчитываться, что ответ от сервера отличается от заданного в RegExp'е запроса?

Прошу помочь разобраться с проблемой.

Anth0ny

up.
прошу помочь разобраться с проблемой.

???

Victor Kirhenshtein

Esli DCI imenno takoj, kak v poste:

Quote from: Anth0ny on June 30, 2008, 10:30:38 AM
Мой DCI:

ServiceCheck.HTTP(10.200.1.100,80,/worktest.html,www.intwww.local,"^HTTP/1\.[01] 200.*red*")

Есть на странице слово "red" - получаю "0".
Нет на странице "red" - тоже получаю "0".


to v nem oshibka. REgexp .*red* matchit bukvi re, za kotorimi mozet idti ili ne idti bukva d, posle chego mozet idti chto ugodno. T.e. slova rexx, retry, centered, i t.d. toze smatchatsja. Ochen' bol'shaja verojatnost', chto na etoj stranice vstrechaetsja kombinacija bukv re, poetomu vsegda 0 i vozvraschaetsja.

Pravil'nej budet .*red.*, hotja slovo centered vse ravno podojdet. Dlja testov rekomenduju vzjat' html, propuskat' cherez grep i smotret', pravil'nij li rezul'tat.

Best regards,
Victor

Anth0ny

Виктор, Вы гений =)

Действительно, для тестов использовалась пустая страница, где было только одно слово: red или green
Сейчас попробую сделать так, как Вы сказали.

Спасибо!

А всё-таки что по кодам возврата?
Что должно вернуться если условие regexp'а не выполнено но сайт работает корректно?

Т.е. что вернёт DCI если в моём случае нет слова "red" на странице?

Если 0 (мол, запрос отработал удачно), то можно ли как-то изменить это положение вещей, чтобы я однозначно видел, какой именно ответ вернуло выполнение regexp'а (что заданное в regexp условие было отправлено и полученный результат или TRUE или FALSE ?)

А то всё время 0 да 0 ... Не удобно, право слово...

ТЕСТ НЕ ПРОЙДЕН: после модификации запроса на .*red.* всё вроде бы отработало успешно. Однако возвращаемый результат по прежнему - 0. True regexp  или false - всё равно возвращается 0. если условие Threshold'а говорит, что если ответ = 0 -> ошибка, то при любых словах на странице DCI помечается как обнаруживший искомое.

нет эффекта. изменение слова на текстовой странице не влияет на получаемый результат: всегда получаю 0 и соответственно отрабатывает только правило, обнаруживающее что получено значение 0.

складывает впечатление что в моём конкретном случае это не работает.

что red что green на странице- всегда возвращается 0.

и почему-то не могу завершить процессинг эвента...
не работает правило, прерывающее обработку. может дело в том что всегда возвращается 0 (чтобы не получил regexp) и дальше тупо нечего процессить? Потому что 0 - это TRUE, при котором считается что RED найдено. А если не найдено, то всё равно получаю 0.

Anth0ny

дополнительный комментарий:

даю скрины, чтобы было понятно о чём спич.

1. строка проверки на наличие слова RED на странице:
ServiceCheck.HTTP(10.200.1.100,80,/worktest.html,www.intwww.local,"^HTTP/1\.[01] 200.*red.*")

При выполнении DCI всегда возвращается 0, а значит НЕЛЬЗЯ настроить прерывание для Event'а.

2. скрин Theshold'а, как это сейчас настроено

3. скрин Event Processing'а - Alarm
4. скрин Event Processing'а - терминатор для Alarm'а



Victor Kirhenshtein

Regexp proverjaet ne tol'ko content stranici, no i header'i. Vot otvet moego web-saita:

HTTP/1.1 200 OK
Date: Fri, 04 Jul 2008 08:05:22 GMT
Server: Apache
X-Powered-By: PHP/4.4.0-pl1-gentoo
Set-Cookie: supraLang=en; expires=Sun, 19 Jul 2009 13:05:23 GMT; path=/
Set-Cookie: PHPSESSID=afa2bbc5cdf668e7db85c92b04cfea2d; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 7658
Connection: close
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

i dal'she idet content

zagolovok X-Powered-By: PHP/4.4.0-pl1-gentoo prekrasno matchitsja regexpom .*red.*. Vozmozno v vashem headere chto-to podobnoe. Mozno poprobovat'

^HTTP/1\.[01] 200.*<html.*red.* - togda mi budem iskat' slovo red tol'ko posle taga <html>.



Anth0ny

Виктор, спасибо за быстрый ответ!

О проблеме: моя тестовая страница совершенно пуста. там вообще нет тегов. это просто текстовый файл с расширением html и одним-единственным тестовым словом. вообще, как мне кажется, дело тут не в том, что находит-ли искомое regexp или не находит, а в том, что в ответ на запрос с regexp'ом всегда возвращается "0".

Нашёл? = 0
Не нашёл? = 0

Моё условие Вы уже видели: если на странице встречается слово "red" - должно быть зафиксировано событие (Event), что слово "red" найдено. Затем запускается процессинг, который отсылает мне извещение, что слово на странице найдено.

И всё бы хорошо, да только у Threshold'а, который использует этот regexp, нет другого возвращаемого состояния, кроме как "0". А это значит, что DCI не в состоянии отличить состояние "найдено" last()=0 от "не найдено" last()l=0.

И соответственно я не могу создать условие-терминатор, которое бы тоже опиралось на возвращаемое состояние и заканчивало бы обработку данного эвента (помечало DCI как нормально рабюотающий). Не на что опираться, потому что всегда получаем 0.

применительно к моему тестированию: ищем слово red, если находим- проблема, если нет- всё ок.

Threshold Configuration
----------------------
Condition

Will be "Equal"
Than "0"
----------------------
Event

Condition TRUE
Site test Filed!

Condition FALSE
Site test OK!
----------------------

Я собственно вот о чём...
=)

Нужно ввести возвратные коды для такого рода Threshold'ов.
0 - условие regexp'а полностью выполнено (искомое найдено).
1 - условие regexp'а не выполнено (искомое не найдено)

Это возможно? А то невозможно понять что вообще происходит...
=)

Anth0ny

вот ответ моего тестового сайта:

Quote
http://www.intwww.local/worktest.html

GET /worktest.html HTTP/1.1
Host: www.intwww.local
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Wed, 02 Jul 2008 10:12:27 GMT
If-None-Match: "b17d7e212cdcc81:c90"

HTTP/1.x 304 Not Modified
Server: Microsoft-IIS/5.1
Date: Wed, 02 Jul 2008 11:41:16 GMT
X-Powered-By: ASP.NET
Etag: "b17d7e212cdcc81:c90"
Content-Length: 0

хмм.. тоже присутствует X-Powered-By
а как же тогда быть?
как заставить искать только конкретное слово, БЕЗ совпадений?

Anth0ny

просто получается, что найдя искомое, Threshold пометит хост в соответствии со значением, заданным ему при помощи Event'а. А как же перевести его в обратное состояние, в то, которое предшествовало новому?

т.е. как в данном случае в автоматическом режиме пометить хост как нормальный, если искомое не обнаруживается при следующем опросе?

я даже проверил поиск абстрактным словом "^HTTP/1\.[01] 200.*blablablabla.*"
не получается. если условия настроены так как сказано выше (при ответе = 0 -> проблема), то при каждом запросе получаю именно состояние "Проблема".


а всё-таки Вы оказались правы!

если я ищу слово blablablabla а его нет на странице, я получаю ответ "3"!
если добавляю- получаю 0 - и хост помечается проблемным.
если снова убираю- хост помечается как нормальный.

соответственно прошу меня извинить, был не прав.  :-\
усиленно бью челом.
всё работает так как заявлено.



Anth0ny

ещё раз ОГРОМНОЕ спасибо за помощь и проявленное при этом нечеловеческое терпение.

Victor Kirhenshtein

Pozalujsta :) Mne toze prijatno chto rezul'tati moej raboti komu-to nuzni :)

Anth0ny

Вот ещё реализуете работу с логами windows и тогда вообще уже практически нечего будет желать =).

offtop: что там насчёт 0.2.22? =)
когда нам ожидать (примерно) и что нового будет в релизе?

Victor Kirhenshtein

Esli so vremenem vse budet ok, to na sledujuschej nedele.
Poka izmenenija takie:

V sobitijah, alarmah i actionah mozno budet ispol'zovat' skripti dlja formirovanija teksta (v vide macro %[script_name]);
Skripti v event processing policy poluchat dostup k attributam nodi i samogo sobitija cherez peremennie $node i $event;
Dobavlena podderzka custom attributes dlja ob'ektov (t.e. mozno opredelit' svoj attribut skazem u nodi i potom ispol'zovat' v skriptah;
Dobavlena vozmoznost' kodirovki NXCP soobschenij v XML i utilita nxcptest;
Ispravleni zaregistrirovannie bugi #196, #201, #216, #220, #221.

Sobirajus' esche poispravljat' bagov i realizavat' koe-chto iz feature requests.

isherim

Quote from: Anth0ny on July 03, 2008, 01:00:29 PM
Вот ещё реализуете работу с логами windows и тогда вообще уже практически нечего будет желать =).
Есть чего желать. И даже больше виндовых логов. Очень актуальна возможность фильтрации и сортировки событий за произвольный период. И реакция на события сислога.

Anth0ny

2 Виктор: удачи! очень надеемся что время всё же будет. и Вы реализуете всё что запланировали. и даже больше.  ;)

2 Isherim: нуу.. в общем да, ты прав.
было бы здОрово иметь эти возможности.

хотя, в принципе, что касаемо сортировки и фильтрации давно минувших событий то тут я не уверен, что это сильно нужно. как опция- да. не не как самоцель. так как мониторинг в первую очередь интересен своей оперативностью и информативностью. а копаться в старом белье... имхо не так уже это и важно. важнее то, что происходит с контролируемыми нодами здесь и сейчас.

и поэтому реакция на SysLog очень даже интересна.
тут полностью согласен.