Все, кто получает данные от веб-сервисов в автоматическом режиме, пользуется тонкими клиентами, работает с web-приложениями (сайтами), наверняка не раз сталкивались с проблемой недоступности сервиса. Причины могут быть разные, здесь мы не будем их рассматривать, но если сервис играет важную роль в сложном процессе, хорошо бы иметь возможность регулярного мониторинга его доступности.
Можно периодически смотреть вручную что сервис доступен, но гораздо продуктивнее автоматизировать этот процесс. Рассмотрим один из вариантов автоматизации проверки доступности веб-сервиса при помощи cUrl.
Для начала нам потребуется установленный cUrl. Если с этим разобрались, нужно понять, что именно будет являться показателем доступности веб-сервиса. Для этого идеально подойдут коды HTTP статусов, находящиеся в заголовке ответа от сервиса/сайта. Что это такое, можно подробно прочитать на википедии.
- Если пришел код 200 (или любой из 2xx) – сервис доступен и готов к работе
- Если 3хх – сработало перенаправление. Это значит что мы попали на зеркало сервиса. То есть сайт работает, но перенаправляет запросы на другой адрес. Такое бывает, например, при переезде сайта на другой домен.
- Остальные коды будут означать для нас – что с сервисом что-то не так и требуется ручное вмешательство.
Чтобы получить ответ от сервиса, нужно открыть командную строку и написать:
curl -s -o /dev/null -w "HTTP_code %{http_code}, total_time %{time_total}" http://rtportal.ru
Похоже на птичий язык, но все можно объяснить:
сurl – взывает curl =)
-s, -o и -w это опции с которыми мы вызываем Curl.
-s это режим тишины – будет выводиться минимум информации. А нам много и не надо.
-o /dev/null означает что вывод результата будет только в командной строке
-w "HTTP_code %{http_code}, total_time %{time_total}" показывает что именно нужно выводить по результатам запроса. В данном случае мы хотим вывести код в http_code и время ответа сервиса time_total
Последняя часть http://rtportal.ru – это веб-сервис/сайт/клиент, который мы вызываем.
Важно! При указании опций нужно учитывать регистр. –s и –S это не одно и то же для cUrl.
Полный перечень опций cUrl можно посмотреть здесь и на русском языке здесь
Запускаем:
Получаем:
То, что нужно.
Мы вызвали curl самостоятельно – это круто, с этим уже можно работать, но нам нужна автоматическая проверка, а не ручная.
Давайте подумаем как это сделать.
Во-первых, нужен инструмент, где можно запустить cUrl. Можно в командной строке (в чем мы убедились выше), можно в bash’е (расширенная командная строка Linux), можно в sas, python, php и еще много где. Главное чтобы инструмент работал с cUrl, а это умеет почти любой язык. Выбор инструмента зависит от ваших личных предпочтений и навыков.
Во-вторых, нам нужно куда-то записать результат. Логично будет писать его в базу данных.
В-третьих, должна быть возможность запросить сразу несколько сервисов и получить от них ответ. Для этого желательно, чтобы наш инструмент поддерживал возможности циклов.
Я буду использовать bash для вызова curl, oracle для записи результата и windows scheduler (планировщик заданий) для запуска скрипта по расписанию.
Код вызова curl в bash:
#!/bin/bash
#services for monitoring
for serv in "http://rtportal.ru" " http://RTDMws.rtportal.ru:8080/SASBIWS/services/scoring_service?wsdl "
do
http_status=$(curl -s -o /dev/null -w "HTTP_code %{http_code}, total_time %{time_total}" $serv)
echo $http_status
sqlplus rt/pass@rtportal <<EOF
INSERT INTO RT_service_status (SERVICE_ADDRESS, DT_CHECK, STATUS) values ('$serv', sysdate, '$http_status');
commit;
exit;
EOF
done
Здесь мы запускаем цикл (for) в котором записываем адреса, которые будем проверять, в переменную serv и вызываем каждый из адресов с помощью cUrl.
Подключение к oracle выполняется через команду sqlplus rt/pass@rtportal, где rt – название схемы в oracle, pass – пароль к схеме, rtportal – SID прописанный в tnsnames.ora на том сервере, где вы выполняете скрипт.
Дальше выполняется sql скрипт, записывающий в таблицу адрес (serv), текущую дату и статус (http_status) вызова.
Естественно, все тоже самое можно повторить на том языке, на котором вам будет удобно, главное чтобы он обладал нужным функционалом.
Скрипт готов. Ставим его на выполнение, например, один раз в 10 минут в windows scheduler и наслаждаемся результатом.
Теперь каждые 10 минут мы будем автоматически снимать состояние сервисов и записывать результат в таблицу oracle.
Это все что нам требовалось.
Дальше таблицу можно отдать аналитикам, вывести на интерфейс в APEX, поставить на мониторинг для отправки сообщений в случае, если код сервиса отличен от 2хх и т.д.
Риск-технологу этот метод может быть полезен чтобы проверять доступность сервисов БКИ, антифрод-сервисов, шины, движков принятия решения, фронт-офисных систем collection, оформления кредитных заявок и еще много где. Зависит от вашей фантазии.