Использование Rocket.Chat для создания чата оперативных оповещений

by Anton Chernousov aka GITA-DEV


Опубликовано: 16 Май 2018 (последние правки 1 месяц, 2 недели)


Использование Rocket.Chat для создания чата оперативных оповещений

В предыдущей статье, под названием использование Rocket.Chat для создания чата оперативных оповещений я рассматривал простейший пример того как можно отправить сообщение в приватный чат Rocket.Chat. На самом деле в своих проектах я использую несколько модифицированную версию этого решения, более адаптированную к продакшн-решениям. Сегодня я как раз и хотел бы поговорить о том как я модифицировал рассмотренное ранее API для реализации так называемого оперативного чата.

В своей статье "Отправка оповещений Django-приложения в приватный чат Rocket.Chat", я рассматривал API для взаимодействия с Rocket.Chat которое разработал Derek Stegelman, он правда в свой модуль уже год ничего не коммитил и на странице висит сообщение, что он готов передать поддержку проекта другому разработчику:

Looking For Authors! This project is currently looking for a user to take it over. If that sounds like you, send a note to derek at stegelman dot com or open up an issue in this repository.

Я форкнул этот проект себе и по мере того как я допишу необходимый мне функционал, попробую отписаться Дереку и предложить внести мои наработки в его проект, так как он и завязан на репозиторий pip. Итак, я собственно хотел поделиться своими наработками которые я использую в продакшн, но для начала я начну с описания модификаций которые я внес в его библиотеку взаимодействия с Rocket.Chat.

Отправка оперативных оповешений в Rocket.Chat

В процессе эксплуатации нашей системы оповещений о сбоях на поддерживаемых серверах, я пришел к мнению, что использование для системы оповещений электронной почты мягко говоря не надежное решение и его стоит использовать как дублирующее. Я использую фильтры Sieve для автоматического перемещения почты от Zabbix в отдельную IMAP-папку, а мобильные клиенты электронной почты не всегда корректно отрабатывают оповещения о новой почте не в центральной папке "Входящие" (точнее почти всегда некорректно отрабатывают).

Модификация библиотеки взаимодействия с Rocket.Chat

Следовательно, логично было использовать мессенджер и так как внутренним стандартом у нас теперь стал Rocket.Chat, то я оперативно написал утилитку для отправки сообщений в приватный чат которую я уже демонстрировал, но в процессе эксплуатации так же появились неочевидные на первый взгляд подводные камни.

  1. Разрастание приватного чата в котором хранятся все сообщения системы мониторинга приводит к медленной загрузке чата на мобильных устройствах и как следствие задержке в отображении оповещений о сбоях (от чего собственно и уходили)
  2. Хотелки растут и теперь уже хочется не только оповещения Zabbix получать, а вообще иметь возможность отправки сообщений из консоли как в случае использования конвейера с командой mail

По первому пункту, было принято решение использовать так называемый "Оперативный чат", а именно чат в котором хранятся сообщения за последние 24-е часа, а для сохранения истории оповещений дальше использовать электронную почту (например, сотрудник вернулся из отпуска и решил почитать что творилось пока его не было). Нативной поддержки автоочистки чатов естественно не существует, так как это слишком специфичная задача и проще всего сделать скрипт который будет запускаться раз в час и удалять лишний хвост сообщений.

Здесь, как раз я и столкнулся, с тем что необходимых для реализации такого функционала функций в библиотеке не было и мне пришлось их дописать и мной дополнительно было реализовано несколько функций:

api.get_private_room_id(room_name) - Получает внутренний идентификатор приватного чата по его имени

api.delete_private_room_message(room_id,message_id) - Удаляет сообщение в приватном чате

Так же я внес изменения в функцию api.get_private_room_history('room_id', oldest=date) добавив параметр message_count (api.get_private_room_history('room_id', oldest=date, message_count = 20)), так как по умолчанию функция возвращает только 20 значений как и записано в дефолтном значении в документации к API, а у меня может быть очень много оперативных сообщений и хотелось бы получать блок побольше для последующего анализа даты публикации.

Естественно, что бот может удалить только собственные сообщения в приватном чате и вам лучше дать боту права на удаление всех сообщений в приватном чате для полного контроля.

Разрешаем боту Rocket.Chat удалять чужие сообщения

Мой репозиторий python библиотеки для взаимодействия с Rocket.Chat доступен по адресу: https://github.com/gita-dev/rocket-python

Теперь, рассмотрим пример кода для взаимодействия с Python-библиотекой (все, что она делает описано в комментариях):

from rocketchat.api import RocketChatAPI
from datetime import datetime, timedelta

username = 'Имя пользователя бота'
password = 'Пароль бота'
chanel = 'Имя чата'

# Подключаемся к API
api = RocketChatAPI(settings={'username': username, 'password': password,
                                  'domain': 'URL-подключения к чату'})

# Отправляем в чат 50 сообщений
room_id = api.get_private_room_id(chanel)
for iterator in range(1,50):
    print (api.send_message('message - '+str (iterator),room_id))

#Получаем историю чата за последние 24-е часа
id = 1
for message in api.get_private_room_history(room_id, oldest=datetime.now()- timedelta(hours=24), message_count = 200)['messages']:
    id = id + 1
    # Удаляем сообщение в чате
    api.delete_private_room_message(room_id,message['_id'])
    print (str(id) + ' : ' + str(message))

И после такого длинного вступительного слова, я продемонстрирую две утилиты которые активно использую в своих продакшн-проектах для реализации функционала оперативных оповещений.

Отправка оповещений из Linux-консоли в приватный чат Rocket.Chat

Первая утилита предназначена для отправки оперативных оповещений в приватный чат Rocket.Chat. Все параметры необходимые для отправки сообщения вы можете передать в качестве параметров командной строки:

# echo "Сообщение!" | ./rocketsend.py -u=<Имя пользователя> -p=<Пароль пользователя> -c=<Наименование группового чата> -url=<URL-подключения>

Или использовать файл конфигурации /etc/rocketsend/rocket.conf вида:

USER = Имя пользователя
PASSWORD = Пароль
GROUP_CHAT = Наименование группового чата
CHAT_URL = URL-подключения к сервису

Параметры командной строки переопределяют глобальные параметры конфигурационного файла, что позволяет отправлять сообщения при помощи укороченный записи вида:

# echo "Сообщение!" | ./rocketsend.py send

Или отдельно переопределить имя чата в который мы будем доставлять сообщение.

Репозиторий утилиты доступен по адресу: https://github.com/gita-dev/rocket.send

Удаление сообщений опубликованных позже суток назад (24 часа)

А это соответственно реализация уже удаления устаревших сообщений для чего все и затевалось, репозиторий этой утилиты соответственно доступен по адресу: https://github.com/gita-dev/rocket.clean

Автоматизированная очистка устаревших чатов Rocket.Chat

Утилита использует тот же конфигурационный файл, что и для отправки сообщений, но дополнительно требуется указать какие чаты мы будем чистить, перечислив их через запятую:

...
CLEAN_HISTORY_GROUP_CHAT = system-reports, website-reports

Обратите внимание на статьи:


Настройка отправки оповещений Zabbix в чат Rocket.Chat

Настройка отправки оповещений Zabbix в чат Rocket.Chat

В своей статье, - использование Rocket.Chat для создания чата оперативных оповещений, я не описал как именно можно при помощи моей утилиты для работы с Rocket.Chat, отправить Zabbix-оповещение. Я так понимаю, что тема заинтересовала несколько человек и придется немного заострить на этом внимание.


Настройка Nginx-Front для работы с Rocket.Chat

Настройка Nginx-Front для работы с Rocket.Chat

В прошлой статье я рассказывал, что у меня после очередного обновления сломался клиент Rocket.Chat для Android и я думал, что это связано с устаревшей версией серверной части, но как оказалось на самом деле это было связано с некорректной конфигурацией Nginx.


Тестирование GIT-версии Rocket.Chat (Обновление Rocket.Chat)

Тестирование GIT-версии Rocket.Chat (Обновление Rocket.Chat)

Я активно использую в своей работе Rocket.Chat и честно говоря меня все устраивает, но недавно мне преподнесли небольшой сюрприз объявив мобильную версию для Android устаревшей фактически принудительно ее обновив, точнее они навязчиво рекомендовали обновиться при каждом запуске приложения и однажды я все же случайно нажал на обновление и в общем зря я это сделал ...


Отправка оповещений Django-приложения в приватный чат Rocket.Chat

Отправка оповещений Django-приложения в приватный чат Rocket.Chat

Вчера я подумал, что если я все же вернулся к использованию Rocket.Chat и он меня уже не так бесит как предыдущие версии, то можно настроить систему оповещений о событиях на сайте и сбоях в работе Django-приложения в приватный чат Rocket.Chat. Для Python быстро нашелся вполне работоспособный модуль который идеально подошел для отправки сообщений в приватные чаты.


RocketChat - Установка и настройка из репозитария (не docker)

RocketChat - Установка и настройка из репозитария (не docker)

Рано или поздно вам все равно придет в голову мысль о внутреннем корпоративном мессенджере полностью вам подконтрольном и настраиваемом. Я перепробовал много различных мессенджеров и в конце концов пришел к мнению, что Rocket.Chat подходит на эту роль лучше других. В типовом решении описанном на сайте Rocket.Chat вам просто предложат использовать подготовленный Docker-контейнер, но я честно говоря недолюбливаю докеры и мне ближе полностью подконтрольные мне контейнеры LXD.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .

Блог это некоммерческий проект! Если вам понравился мой блог и то что я пишу помогло вам на практике, то можете сказать спасибо материально.