Получение, обработка и отправка сообщений из очереди RabbitMQ в канал Teams

17.02.22

Интеграция - Внешние источники данных

Статья о том, как можно получать сообщения из очередей RabbitMQ, обрабатывать эти сообщения и отправлять их в каналы Teams

Скачать исходный код

Наименование Файл Версия Размер
Получение, обработка и отправка сообщений из очереди RabbitMQ в канал Teams:
.zip 1,02Kb
3
.zip 1,02Kb 3 Скачать

Работая в большом проекте, с огромным числом пользователей, для поддержки критически важно получать оповещения о проблемах как можно быстрее. Не все системы мониторинга могут предоставить инструменты для мониторинга сложных бизнес процессов из коробки. Многое специфическое приходится писать самостоятельно. Для того, что бы быть уверенным, что в случае проблемы заинтересованные сотрудники получат сообщения, приняли решение использовать RabbitMQ. В очереди помещаем сообщения, которые являются результатом работы самописных скриптов, которые по сложной логике генерят сообщения в случае отклонения каких-либо показателей бизнес процессов от нормы. 

Для того, что бы как можно быстрее поддержка была оповещена о проблемах, был написан скрипт на Python, который запускается как служба Windows. Скрипт выполняет следующие задачи:

  1. Получает сообщения из очереди RMQ.
  2. Обрабатывает полученное сообщение и отправляет сообщения в канал в Teams.

 

Получение сообщений из очереди:

Для начала требуется настроить входящий веб перехватчик в канале Teams:

1. Зайдем в настройки канала Teams

 

 

2. Добавим "Входящий веб-перехватчик"

 

 

Добавляем имя соединителя, получаем ссылку и сохраняем ее. Ссылку на соединитель нужно будет указать в файле config.py

Если Входящий веб-перехватчик  уже добавлялся, то ссылку на него можно найти в "УПРАВЛЕНИЕ" - "Настроено"

 

Заполним значения переменных в конфигурационном файлике.

Файл config.py выглядит так:

# rmq
rmq_server = 'имя сервера rabbitmq'
rmq_port = порт
rmq_queue_name = 'имя очереди'
rmq_user_name = 'имя пользователя'
rmq_user_password = 'пароль пользователя'
# teams
teams_channel = 'url адрес настроенного соединителя в канале Teams'
# service
service_name = 'Имя службы'
service_display_name = 'Видимое имя службы'

 

Для получения сообщения из нужной очереди требуется выполнить следующий код

# Импортируем нужные модули
import pika
import pymsteams
import time
# Импортируем файл конфигурации
import config
 
 
# Задаем имя пользователя и пароль для Connection
credentials = pika.PlainCredentials(config.rmq_user_name, config.rmq_user_password)
# Создаем Connection с RMQ
connection = pika.BlockingConnection(pika.ConnectionParameters(host=config.rmq_server, port=config.rmq_port, credentials=credentials))
# Создаем оболочку channel для взаимодействия с RabbitMQ, реализующую методы и поведение для канала AMQP
channel = connection.channel()
# Получаем method_frame, header_frame и body, нас будут интересовать наличие method_frame и содержимое body
method_frame, header_frame, body = channel.basic_get(config.rmq_queue_name)

 

Обработка и отправка сообщений:

Для отправки сообщения в Teams требуется выполнить следующий код

# Начинаем бесконечный цикл
while 1:
# Проверяем наличие method_frame
    if method_frame:
        # Разбираем бинарную строку в body и делаем из нее словарь. Здесь может быть все, что угодно, мое сообщение удобнее сделать словарем
        body = dict((a.strip(), b.strip()) for a, b in (element.split('":') for element in body.decode("utf-8").split(',"')))
        # Задаем адрес соединителя с каналом в Teams
        teams_channel = config.teams_channel
        # Подключаемся к каналу
        myTeamsMessage = pymsteams.connectorcard(hookurl=teams_channel, verify=False)
        # Редактируем текст: убираем лишние слэши и меняем символы юникода, у которых удвоились слэши. Здесь тоже может быть все, что угодно
        myTeamsMessage.text(str(body["message"]).replace('\\r', '\r').replace('\\n', '\n').replace('\\u0027', "'").replace('\\u003e', '>'))
        # Задаем цвет текста
        myTeamsMessage.color("#003333")
        # Задаем заголовок сообщения
        myTeamsMessage.title("¡alarm!")
        # Отправляем сообщение
        myTeamsMessage.send()
        # Сообщаем RMQ, что мы забрали сообщение, после этого сообщение из очереди удаляется
        channel.basic_ack(method_frame.delivery_tag)
        # Спим 10 секунд
        time.sleep(10)
    else:
        # Если method_frame нет спим 10 секунд
        time.sleep(10)

 

Создание службы Windows

Для того, что бы данный код выполнялся как служба Windows, требуется использовать библиотеки pywin32 и добавить код для объявления, запуска и остановки службы. Окончательно код должен выглядеть так

import pika
import pymsteams
import time
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import config
 
 
class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = config.service_name
    _svc_display_name_ = config.service_display_name
 
    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)
 
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
 
    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()
 
    def main(self):
        # Здесь находится код из п.1 и п. 2 инструкции
        while 1:
            credentials = pika.PlainCredentials(config.rmq_user_name, config.rmq_user_password)
            connection = pika.BlockingConnection(pika.ConnectionParameters(
                host=config.rmq_server, port=config.rmq_port, credentials=credentials))
            channel = connection.channel()
            method_frame, header_frame, body = channel.basic_get(config.rmq_queue_name)
            if method_frame:
                body = dict((a.strip(), b.strip()) for a, b in (element.split('":') for element in body.decode("utf-8").split(',"')))
                teams_channel = config.teams_channel
                myTeamsMessage = pymsteams.connectorcard(hookurl=teams_channel, verify=False)
                myTeamsMessage.text(str(body["message"]).replace('\\r', '\r').replace('\\n', '\n').replace('\\u0027', "'").replace('\\u003e', '>'))
                myTeamsMessage.color("#003333")
                myTeamsMessage.title("¡alarm!")
                myTeamsMessage.send()
                channel.basic_ack(method_frame.delivery_tag)
                channel.basic_ack(method_frame.delivery_tag)
                connection.close()
                time.sleep(10)
            else:
                connection.close()
                time.sleep(10)
 
 
if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

 

Для того, что бы создать службу Windows, требуется запустить в cmd, открытой под администратором следующую команду

<"путь к python.exe"> <"путь к python файлу со скриптом"> install

При запуске возможны проблемы, т.к. в папке, где находится "pythonservice.exe", по умолчанию это "C:\Program Files\Python<XX>\Lib\site-packages\win32" может не быть библиотек python<XX>.dll, pythoncom<XX>.dll и pywintypes<XX>.dll.

XX - версия Python(например python39.dll, pythoncom39.dll, pywintypes39.dll)

Эти файлы можно найти в папках:
python<XX>.dll  - C:\Program Files\Python<XX>

pythoncom<XX>.dll и pywintypes<XX>.dll - C:\Program Files\Python<XX>\Lib\site-packages\pywin32_system32

Достаточно просто скопировать эти файлы  в папку "C:\Program Files\Python<XX>\Lib\site-packages\win32"

Teams rmq rabbit python pywin32 pika pymsteams

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22658    19    1    

22

Экстрактор данных 1С в BI - выгрузка данных из 1С в BI-аналитику

Внешние источники данных Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    13884    12    SQV0    47    

29

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9325    9    8    

11

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48908    97    163    

86

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30099    20    31    

21

Загрузка в БГУ из УРМ "Криста"

Внешние источники данных Банковские операции Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия государственного учреждения Россия Бухгалтерский учет Платные (руб)

Обработки для загрузки данных из УРМ "Криста" в бухгалтерию государственного учреждения редакция 2.0. Есть Демо доступ на вкладке Бесплатные файлы на 1 месяц со дня получения демонстрационного ключа регистрации. Поддерживает ПО "Web-исполнение" от НПО "Криста".

4800 руб.

19.06.2013    38564    136    90    

30
Оставьте свое сообщение