Рекомендации по настройке мониторинга
В данной статье представлены рекомендации по настройке мониторинга системы онлайн-консультирования Webim для обеспечения контроля за бесперебойной работой.
Параметры мониторинга
Круглосуточный мониторинг сервера базы данных осуществляется по следующим параметрам:
-
Наличие процесса MySQL;
-
Доступность порта
3306с сервера клиента; -
Нагрузка на CPU с пороговым значением в 90% загрузки в течении 15 минут;
-
Наличие 5% свободной оперативной памяти на сервере;
-
Мониторинг здоровья жесткого диска по SMART и состояния RAID массива;
-
Наличие ошибок при реплицировании, отставание репликации;
-
Мониторинг корректности создания резервных копий MySQL, наличие файла последней резервной копии;
-
Ежедневная или еженедельная проверка на корректность таблиц в базе данных;
-
Мониторинг появления новых ошибок в логе сервера MySQL.
---
Требования к системе мониторинга
Рекомендуется настроить описанные ниже виды мониторинга. Рекомендуется настроить описанные ниже виды мониторинга.
Мониторинг нагрузки на CPU на сервере
Мониторинг нагрузки на CPU на сервере
Критическое длительное значение — 90%. Проверить запросы к nginx. Возможно, имеется ненормальная активность. Критическое длительное значение — 90%. Проверить запросы к nginx. Возможно, имеется ненормальная активность.
Мониторинг наличия процессов сервера, необходимых для работы Webim Server
Мониторинг наличия процессов сервера, необходимых для работы 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): Если доступ есть, то перезапустить (для ОС Ubuntu, Debian):
supervisorctl restart tornado-8260
supervisorctl restart tornado-8260
Мониторинг доступности PHP
Мониторинг доступности PHP
Мониторинг осуществляется следующим образом: Мониторинг осуществляется следующим образом:
Эндпоинт: /client.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.
$ 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): Если недоступен или не отвечает PHP, то перезапустить (для ОС Ubuntu, Debian):
systemctl restart php-fpm
systemctl restart php-fpm
Мониторинг данных аккаунта
Локальная проверка (только на сервере):
Мониторинг данных аккаунта
Локальная проверка (только на сервере):
curl https://service_user:service_pass@:8260/l/a/monitor/accounts-stat
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'
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
}]
[{
"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 и failed_to_store_objects_cnt проверить доступность базы, возможность записи в нее.
Рост collected_to_store_objects_cnt может быть вызван медленным доступом.
Рост collected_to_store_objects_cnt может быть вызван медленным доступом.
Мониторинг доступности базы данных с сервера приложений
Используйте mysqladmin ping.
Мониторинг доступности базы данных с сервера приложений
Используйте mysqladmin ping.
Также для проверки доступности базы данных со стороны Chat Backend можно использовать эндпоинт /l/a/monitor/connect-to-db (см. Описание эндпоинтов мониторинга).
Также для проверки доступности базы данных со стороны Chat Backend можно использовать эндпоинт /l/a/monitor/connect-to-db (см. Описание эндпоинтов мониторинга).
Реакция: восстановить доступность базы данных. Реакция: восстановить доступность базы данных.
Мониторинг доступности сервера из внешней сети
Мониторинг доступности сервера из внешней сети
Проверку удобно производить по описанным выше эндпоинтам с внешних узлов. При проблемах — проверить интерфейсы и маршруты. Проверку удобно производить по описанным выше эндпоинтам с внешних узлов. При проблемах — проверить интерфейсы и маршруты.
Реакция: проверить сетевые интерфейсы на сервере, маршруты до/с сервера. Реакция: проверить сетевые интерфейсы на сервере, маршруты до/с сервера.
Кроме этого, рекомендуем дополнительно использовать фоновый сервис atop на сервере со сбором статистики раз в минуту. Он поможет оптимизировать процесс анализа состояния сервера.
Кроме этого, рекомендуем дополнительно использовать фоновый сервис atop на сервере со сбором статистики раз в минуту. Он поможет оптимизировать процесс анализа состояния сервера.
Дополнительная информация
Рестарт сервисов для ротации логов не нужен. Ротировать надо следующие логи: nginx (access, error), tornado, myPHP, fpm. Желательно, чтобы логи были доступны одну неделю. Больший объём логов будет занимать значительный объём диска.
Рестарт сервисов для ротации логов не нужен. Ротировать надо следующие логи: 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/connect-to-db– проверка подключения Chat Backend к базе данных -
/l/a/monitor/timer-stats– что запущено в таймерах и сколько выполнялось -
/l/a/monitor/accounts-stat– оперативные показатели по аккаунтам (включая информацию о количестве чатов, сессий, страниц и прочего) -
/l/a/monitor/accounts-stat– оперативные показатели по аккаунтам (включая информацию о количестве чатов, сессий, страниц и прочего) -
/l/a/monitor/zabbix/channels– ошибки по каналам -
/l/a/object-stats– objgraph-данные от профайлера -
/l/a/object-stats– objgraph-данные от профайлера -
/l/i/instance-id– идентификатор Chat Backend -
/service/monitor/– возвращает HTML-страницу для визуального мониторинга сервера
Возможности мониторинга Webim в примерах
Webim позволяет осуществлять мониторинг параметров на различных уровнях.
Мониторинг ответов
Мониторинг ответов
Компоненты Webim Server позволяют осуществлять внешний мониторинг в реальном времени при помощи систем мониторинга наподобие Zabbix, благодаря чему можно анализировать задержку, код и тело ответа. Компоненты Webim Server позволяют осуществлять внешний мониторинг в реальном времени при помощи систем мониторинга наподобие Zabbix, благодаря чему можно анализировать задержку, код и тело ответа.




Таблицы мониторинга
Таблицы мониторинга
Наиболее часто используемая для мониторинга информация агрегируется в виде таблиц, которые отправляются на Webim Server по запросам определённых эндпоинтов. Наиболее часто используемая для мониторинга информация агрегируется в виде таблиц, которые отправляются на Webim Server по запросам определённых эндпоинтов.
Мониторинг текущего состояния
Мониторинг текущего состояния
Мониторинг текущего состояния в режиме реального времени, сохранять показатели в БД засчёт контроля системных параметров сервера и специализированных параметров Webim Server с помощью стандартных систем мониторинга. Мониторинг текущего состояния в режиме реального времени, сохранять показатели в БД засчёт контроля системных параметров сервера и специализированных параметров Webim Server с помощью стандартных систем мониторинга.


Визуализация данных мониторинга
Визуализация данных мониторинга
Полученные показатели можно визуализировать при помощи различных сервисов для аналитики и визуализации, таких как Grafana. Полученные показатели можно визуализировать при помощи различных сервисов для аналитики и визуализации, таких как Grafana.






Логи
Логи
Каждый серверный компонент Webim записывает всю значимую информацию в log-файлы. По ним можно оперативно отслеживать ошибки и предупреждения. Логи ротируются и хранятся неделю. Каждый серверный компонент 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')],)",)
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 и т.д.), осуществлять поиск необходимых объектов, строить графики и диаграммы по сложным выборкам. Log-файлы можно агрегировать и парсить при помощи различных сервисов (GrayLog, Logstash/ELK и т.д.), осуществлять поиск необходимых объектов, строить графики и диаграммы по сложным выборкам.




Оповещения
Оповещения
Сверх этого, рекомендуется настраивать оповещающие системы, которые будут уведомлять сотрудников о превышении допустимых значений показателей через различные каналы (Telegram, SMS и т.д.). Сверх этого, рекомендуется настраивать оповещающие системы, которые будут уведомлять сотрудников о превышении допустимых значений показателей через различные каналы (Telegram, SMS и т.д.).

