Рекомендации по настройке мониторинга
В данной статье представлены рекомендации по настройке мониторинга системы онлайн-консультирования Webim для обеспечения контроля за бесперебойной работой.
Параметры мониторинга
Круглосуточный мониторинг сервера базы данных осуществляется по следующим параметрам:
-
Наличие процесса MySQL;
-
Доступность порта
3306
с сервера клиента; -
Нагрузка на CPU с пороговым значением в 90% загрузки в течении 15 минут;
-
Наличие 5% свободной оперативной памяти на сервере;
-
Мониторинг здоровья жесткого диска по SMART и состояния RAID массива;
-
Наличие ошибок при реплицировании, отставание репликации;
-
Мониторинг корректности создания резервных копий MySQL, наличие файла последней резервной копии;
-
Ежедневная или еженедельная проверка на корректность таблиц в базе данных;
-
Мониторинг появления новых ошибок в логе сервера MySQL.
Требования к системе мониторинга
Рекомендуется настроить следующие виды мониторинга:
-
Мониторинг нагрузки на CPU на сервере
Критическое длительное значение — 90%.
Проверить запросы к nginx. Возможно, имеется ненормальная активность.
-
Мониторинг наличия процессов сервера, необходимых для работы Webim Server
Для работы сервера используются следующие службы:
Служба Необходимые процессы Действия при отсутствии процессов nginx master + worker процессы service nginx restart
В некоторых ОС управление сервисами может быть другое, например,systemctl restart nginx
для CentOS/RHELphp-fpm
(необязательно)Наличие master-процесса и всех пулов по списку: webim-visitor
webim-visitor2
webim-admin
webim-admin2
webim-images
service php-fpm restart
server.py
- Наличие процесса python
server.py
, запущенного с переменной-port 8260
(по умолчанию).
При работе с ОС Ubuntu, Debian можно запустить процесс черезsupervisorctl
.$ supervisorctl
supervisor> status
supervisor> start tornado-8260 - Наличие процесса
supervisord
В случае отсутствия supervisord
— запустить:service supervisor start
Admin Backend php2db
(только для аккаунтов на СУБД, отличной от MySQL)Необходимо контролировать наличие этих процессов на сервере.
-
Мониторинг работоспособности процесса
Мониторинг работоспособности процесса осуществляется с помощью обращения к нему по ссылке:
/l/v/track.php?event=init&since=0&callback=c
Запрос:
curl "/l/v/track.php?event=init&since=0&callback=c" -v
В ответ должен приходить код
200
и информация в видеjson
.Реакция: проверить лог
/var/log/pro/tornado-8260.log
В нормальных условиях должны появляться сообщения о старте сессий чата/отправки сообщений.В случае отсутствия новых данных стоит проверить доступность сервера из сети.
Если доступ есть, то перезапустить (для ОС Ubuntu, Debian):
supervisorctl restart tornado-8260
-
Мониторинг доступности PHP
Мониторинг осуществляется следующим образом:
/client.php
Корректный ответ:
$ curl /client.php -I HTTP/1.1 200 OK Server: nginx Date: Content-Type: text/html; charset=UTF-8 Connection: keep-alive Vary: Accept-Encoding Expires: Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: PHPSESSID=1111; path=/; domain=. ; secure; HttpOnly
Реакция: проверить лог
/var/log/pro/error.log
Если имеются ошибки, то по ситуации исправить их.
Если недоступен или не отвечает PHP, то перезапустить (для ОС Ubuntu, Debian):
sudo service php5-fpm restart
Перезапуск PHP для ОС CentOS:
sudo systemctl restart php5-fpm.service
-
Мониторинг данных аккаунта
Запрос:
curl https://service_user:service_pass@:8260/l/a/monitor/accounts-stat
Внимание!
Запрос в форме, приведённой выше, выполняется только локально на сервере! В остальных случаях запрос не будет выполнен.
curl --request GET \ --url 'https://companyname.webim.ru/l/a/monitor/accounts-stat?=' \ --header 'Authorization: Basic S0me7eX7'
Выше представлена стандартная форма запроса (подробнее об этом и других эндпоинтах мониторинга смотрите в этой статье).
Пример ответа:
[{ "online_operators_cnt": 0, "being_stored_now_objects_cnt": 0, "offline_sessions_cnt": 223, "in_queue_cnt": 0, "failed_to_store_objects_cnt": 0, "visible_sessions_cnt": 39, "name": "TOTAL", "alive_pages_cnt": 6, "sessions_cnt": 74, "collected_to_store_objects_cnt": 0, "not_belongs_to_tornado_instance": 0, "pages_cnt": 63, "chats_cnt": 38, "alive_sessions_cnt": 39, "being_stored_now_processed_objects_cnt": 0 }, { "domain": "", "offline_sessions_cnt": 223, "name": "demo", "pages_cnt": 63, "sessions_cnt": 74, "in_queue_cnt": 0, "collected_to_store_objects_cnt": 0, "failed_to_store_objects_cnt": 0, "visible_sessions_cnt": 39, "ignore_not_belongs_to_tornado_instance": false, "being_stored_now_processed_objects_cnt": 0, "alive_pages_cnt": 6, "chats_cnt": 38, "working_operators_cnt": 0, "alive_sessions_cnt": 39, "online_operators_cnt": 0, "being_stored_now_objects_cnt": 0, "not_belongs_to_tornado_instance": false }]
Переменные:
collected_to_store_objects_cnt
- не более2000
failed_to_store_objects_cnt
- не более0
Реакция: при срабатывании триггера
collected_to_store_objects_cnt
иfailed_to_store_objects_cnt
проверить доступность базы, возможность записи в нее.Рост
collected_to_store_objects_cnt
может быть вызван медленным доступом. -
Мониторинг доступности базы данных с сервера приложений
Проверку можно осуществлять с помощью
mysqladmin ping
.Реакция: восстановить доступность базы данных.
-
Мониторинг доступности сервера из внешней сети
Проверку можно производить по ссылкам из пунктов 3 и 4, с удаленных серверов.
Реакция: проверить сетевые интерфейсы на сервере, маршруты до/с сервера.
Кроме этого, рекомендуем дополнительно использовать фоновый сервис atop на сервере со сбором статистики раз в минуту. Он поможет оптимизировать процесс анализа состояния сервера.
Дополнительная информация
Рестарт сервисов для ротации логов не нужен.Ротировать надо следующие логи: nginx
(access
, error
), tornado
, myPHP
, fpm
. Желательно, чтобы логи были доступны одну неделю. Больший объём логов будет занимать значительный объём диска.
При большой нагрузке рекомендуется проводить мониторинг блокировок, в частности при работе с MySQL 5.7.
Ниже перечислены некоторые конечные точки, которые могут быть полезны при мониторинге:
-
/l/a/monitor
– базовая информация о запущенном Chat Backend -
/l/a/monitor/timer-stats
– что запущено в таймерах и сколько выполнялось -
/l/a/monitor/accounts-stat
– оперативные показатели по аккаунтам (включая информацию о количестве чатов, сессий, страниц и прочего) -
/l/a/monitor/zabbix/channels
– ошибки по каналам -
/l/a/monitor/object-stats
– objgraph-данные от профайлера -
/l/i/instance-id
– идентификатор Chat Backend -
/service/aux/check-php.php
и т.п. – группа конечных точек для проверки healthcheck-a PHP и прочего -
/service/monitor/get-all-env-list.php
– возвращает хост, окружение и адрес сервера -
/service/monitor/
– возвращает HTML-страницу для визуального мониторинга сервера -
/service/get-local-account-info.php
–JSON
с оперативной информацией по последнему периоду, чату и некоторым переменным -
/service/get_online_operators_by_date.php
и т.п. – чаты за определённый период и похожие конечные точки
Возможности мониторинга Webim в примерах
Webim позволяет осуществлять мониторинг параметров на различных уровнях.
-
Мониторинг ответов
Компоненты Webim Server позволяют осуществлять внешний мониторинг в реальном времени при помощи систем мониторинга наподобие Zabbix, благодаря чему можно анализировать задержку, код и тело ответа.
-
Таблицы мониторинга
Наиболее часто используемая для мониторинга информация агрегируется в виде таблиц, которые отправляются на Webim Server по запросам определённых эндпоинтов.
-
Мониторинг текущего состояния
Мониторинг текущего состояния в режиме реального времени, сохранять показатели в БД засчёт контроля системных параметров сервера и специализированных параметров Webim Server с помощью стандартных систем мониторинга.
-
Визуализация данных мониторинга
Полученные показатели можно визуализировать при помощи различных сервисов для аналитики и визуализации, таких как Grafana.
-
Логи
Каждый серверный компонент Webim записывает всю значимую информацию в log-файлы. По ним можно оперативно отслеживать ошибки и предупреждения. Логи ротируются и хранятся неделю.
2019/12/24 10:45:15 [error] 9327#0: *119085123 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xx.xx.xx.22, server: , request: "GET /operator/history.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.webim-admin2.sock:", host: "***.***.ru", referrer: "https://***.***.ru/operator/" ... [W 191212 14:01:53 visitor_tracking:2142] chat_start_params 800 9aff8484a12247d592fcd952f9d7d4f8 {'mode': u'chat', 'department_key': u'life'} [W 191212 14:01:55 visitor_tracking:906] Starting chat on visitor message @centostest for session: 9aff8484a1*********9d7d4f8 [W 191212 14:01:55 visitor_tracking:2004] process_event 9aff8484a********52f9d7d4f8 visitor.chat.start ... [E 191212 14:17:41 manager:160] WebimSiteMigrationManager: Previous migration failed. Service may encounter errors while working with the database. DB URL: postgresql+psycopg2cffi://webim_meta:***@127.0.0.1/webim_hosted_meta [E 191212 14:17:45 wm_yandex:228] YandexAPI: error, account=@centostest, params={'status': 'offline', 'timestamp': 1576149464}, status_code=404, text={"message":"Organization with chat_id='3d5540e2***********5af0dbbf82' is not found","result":"error"} [E 191212 14:17:45 wm_timer:114] Error while trying to execute target ... [W 191128 10:07:13 visitor_tracking:3850] Result for action chat.read_by_visitor: {"result": "ok"} [E 191128 10:07:13 wm_notification:564] Something wrong: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",) Traceback (most recent call last): File "/var/www/webim_ru/login/python.eta/webim/wm_notification.py", line 560, in send self._send(payload) File "/var/www/webim_ru/login/python.eta/webim/wm_notification.py", line 638, in _send self.adapter.notify_single_device(registration_id=payload['push_token'], data_message=payload['data']) File "/var/local/env.eta/lib/python2.7/site-packages/pyfcm/fcm.py", line 96, in notify_single_device self.send_request([payload], timeout) File "/var/local/env.eta/lib/python2.7/site-packages/pyfcm/baseapi.py", line 220, in send_request response = self.do_request(payload, timeout) File "/var/local/env.eta/lib/python2.7/site-packages/pyfcm/baseapi.py", line 210, in do_request response = requests.post(self.FCM_END_POINT, headers=self.request_headers(), data=payload, timeout=timeout) File "/var/local/env.eta/lib/python2.7/site-packages/requests/api.py", line 110, in post return request('post', url, data=data, json=json, **kwargs) File "/var/local/env.eta/lib/python2.7/site-packages/requests/api.py", line 56, in request return session.request(method=method, url=url, **kwargs) File "/var/local/env.eta/lib/python2.7/site-packages/requests/sessions.py", line 488, in request resp = self.send(prep, **send_kwargs) File "/var/local/env.eta/lib/python2.7/site-packages/requests/sessions.py", line 609, in send r = adapter.send(request, **kwargs) File "/var/local/env.eta/lib/python2.7/site-packages/requests/adapters.py", line 497, in send raise SSLError(e, request=request) SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)
-
Работа с логами
Log-файлы можно агрегировать и парсить при помощи различных сервисов (GrayLog, Logstash/ELK и т.д.), осуществлять поиск необходимых объектов, строить графики и диаграммы по сложным выборкам.
-
Оповещения
Сверх этого, рекомендуется настраивать оповещающие системы, которые будут уведомлять сотрудников о превышении допустимых значений показателей через различные каналы (Telegram, SMS и т.д.).