# Чаты ## Основные репозитории * Бэкенд чатов [chatd-nodejs](http://git.rn/projects/N1/repos/chatd-nodejs/browse) * Фронтенд чатов [chat](http://git.rn/projects/N1/repos/chat/browse) * Десктопный контейнер для чатов [n1-bundle-cabinet](http://git.rn/projects/N1/repos/n1-bundle-cabinet/browse) * Контейнер с мобильной версией чатов [n1-mobile-bundle-offera](http://git.rn/projects/N1/repos/n1-mobile-bundle-offers/browse) * Кроны, для выполнения отложенных операций по чатам [api](http://git.rn/projects/N1/repos/api/browse) * Логи для отравки в clickhouse [frontend](http://git.rn/projects/N1/repos/frontend/browse) * Сервис для сбора и отправки аналитики в clickhouse [view-stats-parser](https://gitlab.n1.org.ru/bi/view-stats-parser) ## Dashboard чатов https://dash.pusher.com/chatkit g.fokin@n1.ru 000000 (но лучше привяжи свой аккаунт, попроси у Лёши Мышко инвайт) ## Мониторинг * Основные метрики чатов мы отслеживаем в [графане ](http://grafana.n1.org.ru/d/VjJ61NRWk/chatd-nodejs?orgId=1&refresh=1m) * Баги смотрим в [Sentry](http://sentry.n1.s/n1/chatd-nodejs/) * Критовые баги дублируются к нам в канал в mattermost: https://chat.n1.org.ru/n1ru/channels/notify-team-buyer * Баги по работе кронов на php смотрим [тут](http://sentry.n1.s/n1/n1-api/?query=is%3Aunresolved+team%3ABuyer) ### Настройка оповещений о багах через mattermost Чтобы оперативно реагировать на критовые баги, мы настроили их дублирование из sentry в mattermost, делаем мы это посредством [Zappier](https://zapier.com/app/zaps) Логин: g.fokin@n1.ru Пароль: q12345 После авторизации выбираем вкладку My Zaps и ищем `Sentry to mattermost: notify-team-buyer` ### Метрики на мониторе На мониторах у нас дублируются графики из графаны. Чтобы запустить/перезапустить мониторинг нужно: 1. `ssh monitor@192.168.10.84` pass: monitor 2. Запустить скрипт `./start-monitoring` ### Как узнать ip-шник mongoDB, Rabbit или чего-либо ещё 1. Зайди на [https://deployer.n1.s/](https://deployer.n1.s/) 2. Выбери свою среду, появится таблица со всеми ресурсами ![](https://i.imgur.com/XmqmSIe.png) 3. Ищи нужный тебе Unit (например БД для чатов называется `mongo-chatd`) ## Отправка писем о непрочитанных сообщениях ### Отладка событий Во время отправки сообщения чаты эмитят событие message.sent. Событие отправляется в RabbitMQ. Если есть необходимость подебажить эти события, нужно открыть веб морду рэббита: 1. Узнай ip своего рэббита, как это сделать описано [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё) (тебя интересует Unit `rabbitmq-realty`) 2. Открой браузер и введи этот ip, добавив порт 15672 `твой_ip:15672` 4. Введи логин и пароль (`guest`, `guest`) 5. Выбери вкладку **Exchanges** и ищи `chat`, жмякни на него и увидишь все очереди, которые мы используем для работы с чатами ![](https://i.imgur.com/VnqsRBh.png) 7. Ищи нужную очередь (в нашем случае это `unread_messages < chat`) 8. Далее выбери вкладку **Queues** и жмякни по нужной очереди ### Логика работы Есть [скрипт](http://git.rn/projects/N1/repos/api/browse/scripts/services/subscriptions_rpc/Realty/SubscriptionsTypes/ChatUnreadMessages/Cli/UnreadMessagesListener.php), который слушает очередь `unread_messages < chat` и создаёт таски в mongoDB(коллекция `unread_chat_messages`). Далее специальный [крон](http://git.rn/projects/N1/repos/api/browse/scripts/services/subscriptions_rpc/Realty/SubscriptionsTypes/ChatUnreadMessages/Cli/UnreadMessagesHandler.php) разгребает эти таски и раз в 7 минут триггерит событие в Emarsys о том что нужно отправить уведомление о непрочитанных сообщениях. #### Emarsys Попасть в Emarsys можно по ссылке https://suite16.emarsys.net/. Account - n1_ru, логин и пароль проси у Булгаковой Натальи После авторизации нужно выбрать Campaigns -> Email campaigns и вбить в поиск чаты, там есть вся информация о шаблоне и логике отправки ### Как протестировать отправку письма 1. Отправить сообщение в чате 2. Убедиться что в очереди `unread_messages < chat` появилось сообщение (см. пункт Отладка событий) 3. Зайти в монгу и в коллекции `unread_chat_messages` отредактировать дату на 10 минут назад (адрес монги смотри в [тут](https://deployer.n1.s), ищи mongo-n1 ) 4. Далее нужно зайти на php-ноду: `ssh root@phpnode7-bionic.твоя.среда` и запустить 2 крона 4.1. `/data/projects/n1.ru/scripts/cli.php subscriptions_rpc SubscriptionsTypes_ChatUnreadMessages UnreadMessagesListener process` 4.2. `/data/projects/n1.ru/scripts/cli.php subscriptions_rpc SubscriptionsTypes_ChatUnreadMessages UnreadMessagesHandler run` Если что-то не выходит, обратись к Наташе Булгаковой, она поможет с тестированием ## Отправка хита в статистику просмотров по карточке объявления Создание канала в чате равносильно открытию контакта в карточке, такие действия мы трекаем и отправляем в специальный сервис стастики, чтобы продавец видел у себя в личном кабинете в том числе и статистику по открытию чатов. Во время создания канала в RabbitMQ в очередь `offers_hits < chat.new_channel` отправляется соответсвующее событие Далее cli-скрипт на php `/data/projects/n1.ru/scripts/cli.php offers Offers_HitsCount NewChatChannelsListener process` отправит это в сервис статистики просмотров. (Как запускать cli-скрипты смотри в 'Отправка писем о непрочитанных сообщениях'). За подробностями работы сервиса стастики обращайся к команде продавцов. ## Отключение возможности писать сообщения Пользователи могут отключать у себя чаты из личного кабинета, также чаты могут отключать модераторы из админки. Апишка для отключения чатов: ``` curl -X POST \ http://api.n1.ru.b.dobrovolskiy.n1/api/v1/chat/user-rpc/ \ -H 'Authorization: Bearer f64ab47dfc5c8d2df499e46886bdc43a5ae0dea2' \ -H 'Content-Type: application/json' \ -H 'Postman-Token: 6b2d2e20-ad1b-4862-95c8-31045d6cbded' \ -H 'cache-control: no-cache' \ -d '{ "jsonrpc": "2.0", "method": "disableChat", "params": {}, "id": 1 }' ``` ***Реализация этого эндпоинта и других связанных с включением/отключением чатов и их проверкой лежит [тут](http://git.rn/projects/N1/repos/chatd-nodejs/browse/src/handlers/createUserJsonRpc.js)*** После отключения чатов происходит 2 вещи: 1. В коллекцию `'users_settings'` в бд чатов записывается информация о том что пользователь отключил у себя чаты (как узнать ip MongoDB смотри [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё), тебя интересует Unit `mongo-chatd`) 2. Эмитится событие в RabbitMQ в очередь `users < chat.change_is_chat_enabled` (как отлаживать события смотри [тут](#Отладка-событий) 3. Событие слушает [PHP-й крон](http://git.rn/projects/N1/repos/api/browse/scripts/services/elastic_indexer/Realty/ElasticIndexer/Cli/ChatEnabledChangesListener.php), по userID он получает все объявления и инициирует их реиндексацию. ### Реиндексация объявлений Если упрощённо, то объявления, которые ты получаешь из апишки, возвращаются тебе из эластика. Для подключения к эластику удобней всего пользоваться плагином хрома elasticsearch-head. IP эластика можешь посмотреть [тут](#Как-узнать-ip-шник-mongoDB-Rabbit-или-чего-либо-ещё) (тебя интересует Unit `n1_elastic`). Ищи коллекцию с алиасом `offers`. Информацию о состоянии чатов у оффера мы храним в поле `chat.enabled` Каждый раз когда происходит процесс реиндексации, мы ходим в апи чатов за настройками пользователя и проверяем не отключил ли он у себя чаты и если это так проставляем `chat.enabled = false` (чуть выше я давал ссылку на реализацию эндпоинтов для работы с настройками пользователя чатов) Если у объявления, которое вернет тебе api, этот флаг будет установлен в `false` то кнопка **Написать сообщение** скрывается в карточке объявлений. ## Отправка аналитики в Clickhouse Каждую отправку нового сообщения мы фиксируем в clickhouse. Делается это в 2 этапа 1. Ходим на специальный урл [(логика начинается тут)](http://git.rn/projects/N1/repos/chatd-nodejs/browse/src/services/sendMessage.js#98), по которому nginx складирует логи [ссылка на пул реквест](http://git.rn/projects/N1/repos/frontend/pull-requests/323/overview) 2. Go-й [демон](https://gitlab.n1.org.ru/bi/view-stats-parser) скачивает файл с этими логами, парсит их и отправляет в clickhouse. ### Подключение к clickhouse Веб интерфейс: [http://clickhouse.n1.org.ru/](http://clickhouse.n1.org.ru/) dev сервер кликхаус: `http://clickhouse-dev.n1.s:80` user: `default` tcp порт dev сервера: `clickhouse-dev.n1.s:32007` ### Логи ошибок Ошибки смотри в mattermost, канал `notify-team-buyer`, выглядят они так: ![](https://i.imgur.com/C1s7i9Y.png)