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

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

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

  • Наличие процесса MySQL;
  • Доступность порта 3306 с сервера клиента;
  • Нагрузка на CPU с пороговым значением в 90% загрузки в течении 15 минут;
  • Наличие 5% свободной оперативной памяти на сервере;
  • Мониторинг здоровья жесткого диска по SMART и состояния RAID массива;
  • Наличие ошибок при реплицировании, отставание репликации;
  • Мониторинг корректности создания резервных копий MySQL, наличие файла последней резервной копии;
  • Ежедневная или еженедельная проверка на корректность таблиц в базе данных;
  • Мониторинг появления новых ошибок в логе сервера MySQL.

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

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

  1. Мониторинг нагрузки на CPU на сервере.
    Критическое длительное значение - 90%.
    Проверить запросы к nginx. Возможно, имеется ненормальная активность.
  2. Мониторинг наличия процессов сервера, необходимых для работы Webim Server.
    Для работы сервера используются следующие службы:

    • nginx
    • php-fpm
    • python server.py (порт 8260)

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

    Служба Необходимые процессы Действия при отсутствии процессов
    nginx master + worker процессы service nginx restart
    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
  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.

    Мониторинг осуществляется следующим образом:

    <hostname>/client.php
    

    Корректный ответ:

    $ curl 
    <hostname>/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=. </hostname><hostname>; secure; HttpOnly
    

    Реакция: проверить лог /var/log/pro/error.log
    Если имеются ошибки, то по ситуации исправить их.
    Если недоступен или не отвечает php, то перезапустить:
    service php5-fpm restart

  5. Мониторинг данных.

    Запрос:

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

    Пример ответа:

    [{
        "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": "<hostname>", 
        "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, my PHP, fpm.
Желательно, чтобы логи были доступны одну неделю.
Больший объём логов будет занимать значительный объём диска.

При большой нагрузке рекомендуется проводить мониторинг блокировок, в частности при работе с MySQL 5.7.

Ниже перечислены некоторые конечные точки, которые могут быть полезны при мониторинге:

  • /l/a/monitor - базовая информация о запущенном tornado server,
  • /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 - ID tornado,
  • /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_chats_by_date.php, /service/get_online_operators_by_date.php и т.п. - чаты за определённый период и похожие конечные точки.

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

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

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

    Ping service

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

    Monitoring Tornado

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

    Test initialization

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

    Current memory load

    Ping:

    Ping

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

    Open chats

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

    objects

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

    CPU load

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

    Graylog search

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

    Server components response

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