Перейти к содержанию

Рекомендации по настройке мониторинга

Параметры мониторинга

Круглосуточный мониторинг сервера базы данных осуществляется по следующим параметрам:

  • Наличие процесса MySQL;

  • Доступность порта 3306 с сервера клиента;

  • Нагрузка на CPU с пороговым значением в 90% загрузки в течении 15 минут;

  • Наличие 5% свободной оперативной памяти на сервере;

  • Мониторинг здоровья жесткого диска по SMART и состояния RAID массива;

  • Наличие ошибок при реплицировании, отставание репликации;

  • Мониторинг корректности создания резервных копий MySQL, наличие файла последней резервной копии;

  • Ежедневная или еженедельная проверка на корректность таблиц в базе данных;

  • Мониторинг появления новых ошибок в логе сервера MySQL.


Требования к системе мониторинга

Рекомендуется настроить следующие виды мониторинга:

  1. Мониторинг нагрузки на CPU на сервере

    Критическое длительное значение — 90%.

    Проверить запросы к nginx. Возможно, имеется ненормальная активность.

  2. Мониторинг наличия процессов сервера, необходимых для работы Webim Server

    Для работы сервера используются следующие службы:

    Служба Необходимые процессы Действия при отсутствии процессов
    nginx master + worker процессы service nginx restart
    В некоторых ОС управление сервисами может быть другое, например, systemctl restart nginx для CentOS/RHEL
    php-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)

    Необходимо контролировать наличие этих процессов на сервере.

  3. Мониторинг работоспособности процесса

    Мониторинг работоспособности процесса осуществляется с помощью обращения к нему по ссылке:

    /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
    
  4. Мониторинг доступности 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
    
  5. Мониторинг данных аккаунта

    Запрос:

    curl https://service_user:service_pass@:8260/l/a/monitor/accounts-stat
    

    N.B.

    Запрос в форме, приведённой выше, выполняется только локально на сервере! В остальных случаях запрос не будет выполнен.

    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 может быть вызван медленным доступом.

  6. Мониторинг доступности базы данных с сервера приложений

    Проверку можно осуществлять с помощью mysqladmin ping.

    Реакция: восстановить доступность базы данных.

  7. Мониторинг доступности сервера из внешней сети

    Проверку можно производить по ссылкам из пунктов 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.phpJSON с оперативной информацией по последнему периоду, чату и некоторым переменным

  • /service/get_chats_by_date.php, /service/get_online_operators_by_date.php и т.п. – чаты за определённый период и похожие конечные точки


Возможности мониторинга Webim в примерах

Webim позволяет осуществлять мониторинг параметров на различных уровнях.

  1. Мониторинг ответов

    Компоненты Webim Server позволяют осуществлять внешний мониторинг в реальном времени при помощи систем мониторинга наподобие Zabbix, благодаря чему можно анализировать задержку, код и тело ответа.

    Ping-сервис

    Оперативная информация по серверу (количество активных аккаунтов, сессий и т.д.)

    Тестовая инициализация сессии чата

  2. Таблицы мониторинга

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

  3. Мониторинг текущего состояния

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

    Нагрузка на память

    Ping

  4. Визуализация данных мониторинга

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

    Количество открытых чатов и операторов онлайн на один аккаунт в моменте

    Количество объектов в очереди на запись, открытых сессий и т.д.

    Совмещённые графики системных параметров при исследовании инцидента

  5. Логи

    Каждый серверный компонент 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')],)",)
    
  6. Работа с логами

    Log-файлы можно агрегировать и парсить при помощи различных сервисов (GrayLog, Logstash/ELK и т.д.), осуществлять поиск необходимых объектов, строить графики и диаграммы по сложным выборкам.

    Поиск записей о событии operator.update_status внутри временного промежутка в GrayLog

    Графики величины времени ответа компонентов сервера

  7. Оповещения

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