Рекомендации по настройке мониторинга
В данной статье представлены рекомендации по настройке мониторинга системы онлайн-консультирования Webim для обеспечения контроля за бесперебойной работой.
Параметры мониторинга
Круглосуточный мониторинг сервера базы данных осуществляется по следующим параметрам:
-
Наличие процесса MySQL;
-
Доступность порта
3306с сервера клиента; -
Нагрузка на CPU с пороговым значением в 90% загрузки в течении 15 минут;
-
Наличие 5% свободной оперативной памяти на сервере;
-
Мониторинг здоровья жесткого диска по SMART и состояния RAID массива;
-
Наличие ошибок при реплицировании, отставание репликации;
-
Мониторинг корректности создания резервных копий MySQL, наличие файла последней резервной копии;
-
Ежедневная или еженедельная проверка на корректность таблиц в базе данных;
-
Мониторинг появления новых ошибок в логе сервера MySQL.
Требования к системе мониторинга
Рекомендуется настроить описанные ниже виды мониторинга.
Мониторинг нагрузки на CPU на сервере
Критическое длительное значение — 90%. Проверить запросы к nginx. Возможно, имеется ненормальная активность.
Мониторинг наличия процессов сервера, необходимых для работы Webim Server
Для работы сервера используются следующие службы:
| Служба | Необходимые процессы | Действия при отсутствии процессов |
|---|---|---|
| nginx | master + worker процессы | systemctl restart nginx |
php-fpm (необязательно) |
Наличие master‑процесса и всех пулов: webim-visitor, webim-visitor2, webim-admin, webim-admin2, webim-images |
systemctl restart php-fpm |
server.py |
Наличие процесса python server.py (-port 8260 по умолчанию). На Ubuntu/Debian управление через supervisorctl. Также должен работать supervisord. |
При отсутствии supervisord: systemctl start supervisor |
| Admin Backend | Процесс приложения и доступность порта (по умолчанию 6001) |
Рестарт приложения согласно способу инсталляции |
php2db (для СУБД, отличных от MySQL) |
— | — |
Мониторинг работоспособности процесса
Эндпоинт: /l/v/init
Проверка:
curl "/l/v/init" -v
Ожидается 200 и JSON‑ответ.
Реакция: проверить лог /var/log/pro/tornado-8260.log.
| Служба | Необходимые процессы | Действия при отсутствии процессов |
|---|---|---|
| nginx | master + worker процессы | systemctl restart nginx |
php-fpm (необязательно) |
Наличие master‑процесса и всех пулов: webim-visitor, webim-visitor2, webim-admin, webim-admin2, webim-images |
systemctl restart php-fpm |
server.py |
Наличие процесса python server.py (-port 8260 по умолчанию). На Ubuntu/Debian управление через supervisorctl. Также должен работать supervisord. |
При отсутствии supervisord: systemctl start supervisor |
| Admin Backend | Процесс приложения и доступность порта (по умолчанию 6001) |
Рестарт приложения согласно способу инсталляции |
php2db (для СУБД, отличных от MySQL) |
— | — |
Мониторинг работоспособности процесса
Эндпоинт: /l/v/init
Проверка:
curl "/l/v/init" -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):
systemctl restart php-fpm
Мониторинг данных аккаунта
Локальная проверка (только на сервере):
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.
Также для проверки доступности базы данных со стороны Chat Backend можно использовать эндпоинт /l/a/monitor/connect-to-db (см. Описание эндпоинтов мониторинга).
Реакция: восстановить доступность базы данных.
Мониторинг доступности сервера из внешней сети
Проверку удобно производить по описанным выше эндпоинтам с внешних узлов. При проблемах — проверить интерфейсы и маршруты.
Реакция: проверить сетевые интерфейсы на сервере, маршруты до/с сервера.
Кроме этого, рекомендуем дополнительно использовать фоновый сервис atop на сервере со сбором статистики раз в минуту. Он поможет оптимизировать процесс анализа состояния сервера.
Дополнительная информация
Рестарт сервисов для ротации логов не нужен. Ротировать надо следующие логи: nginx (access, error), tornado, myPHP, fpm. Желательно, чтобы логи были доступны одну неделю. Больший объём логов будет занимать значительный объём диска.
При большой нагрузке рекомендуется проводить мониторинг блокировок, в частности при работе с MySQL 5.7.
Ниже перечислены некоторые конечные точки, которые могут быть полезны при мониторинге:
-
/l/a/monitor– базовая информация о запущенном Chat Backend -
/l/a/monitor/connect-to-db– проверка подключения Chat Backend к базе данных -
/l/a/monitor/timer-stats– что запущено в таймерах и сколько выполнялось -
/l/a/monitor/accounts-stat– оперативные показатели по аккаунтам (включая информацию о количестве чатов, сессий, страниц и прочего) -
/l/a/monitor/zabbix/channels– ошибки по каналам -
/l/a/object-stats– objgraph-данные от профайлера -
/l/i/instance-id– идентификатор Chat Backend -
/service/monitor/– возвращает HTML-страницу для визуального мониторинга сервера
Возможности мониторинга 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 и т.д.).


