В этом руководстве описывается подход к созданию простого бота ChatOps, который использует Slack и Grafana для запроса состояния системы. Идея состоит в том, чтобы иметь возможность проверять состояние вашей системы с помощью диалогового интерфейса, если вы находитесь далеко от своего рабочего места, но все еще имеете базовые возможности подключения, например на вашем телефоне:
Это руководство разделено на две части: в первой части будет настроена инфраструктура для мониторинга Kafka с помощью Prometheus и Grafana, а во второй части будет создан простой бот с Python, который может отвечать на вопросы и возвращать графики Grafana через Slack.
Уведомления - это встроенная функция Grafana, то есть возможность отправлять предупреждающие сообщения на канал Slack, если условия нарушаются. Бот Slack - это немного другой инструмент. Он сможет ответить на простые вопросы о состоянии системы, чтобы помочь в устранении неполадок.
Цель состоит в том, чтобы спроектировать что-то, что работает в среде с брандмауэром, не требуя доступа прокси или доступа к каким-либо сторонним сервисам, таким как Amazon S3. Поэтому изображения графиков создаются в локальной файловой системе и выгружаются в виде вложений в Slack, чтобы избежать размещения в общедоступной инфраструктуре.
Компоненты
Основными составляющими здесь являются:
Kafka: платформа для потоковой передачи сообщений. Это система, в мониторинге которой мы заинтересованы.
Prometheus: система мониторинга для сбора показателей с заданными интервалами, оценки правил и запуска предупреждений.
prometheus-jmx-exporter: сборщик Prometheus, который может очищать и открывать данные JMX, позволяя нам собирать метрики из Kafka.
Grafana: платформа визуализации, обычно используемая для визуализации данных временных рядов для анализа инфраструктуры и приложений. Это позволяет нам графически отображать собранные метрики.
Slack: приложение для обмена сообщениями, которое позволит нам взаимодействовать с нашим чат-ботом.
Slack-бот: описанный во второй части ниже простой скрипт Python, который может извлекать графики из Grafana и загружать их в Slack.
Эти шаги основаны на мониторинге Kafka, но тот же общий подход можно использовать для интеграции с другими сервисами.
Давайте начнем
Полный исходный код доступен здесь.
Предварительные требования
- Базовые знания Python: код написан для Python 3.6.
- Docker: docker-compose используется для запуска брокера Kafka.
- Kafkacat: это полезный инструмент для взаимодействия с Kafka (например, публикация сообщений в темах).
Примечание: если вы торопитесь все запустить, просто клонируйте проект по ссылке выше и запустите docker-compose up -d
.
Оставшаяся часть этого руководства состоит из двух частей. В первой части описывается, как настроить инфраструктуру мониторинга, а во второй рассматривается код Python для бота Slack.
Часть первая: сборка контрольного стека
Мы будем использовать Grafana и Prometheus, чтобы настроить стек мониторинга. Отслеживаемая служба - Kafka, а это значит, что нам понадобится мост для экспорта данных JMX из Kafka в Prometheus. Образ докера prometheus-jmx-exporter отлично выполняет эту роль. Эта служба извлекает метрики с JMX-сервера Kafka и предоставляет их по протоколу HTTP, чтобы их мог опрашивать Prometheus.
Чтобы включить метрики JMX на сервере Kafka, нам необходимо применить некоторые параметры конфигурации к серверу Kafka и связать kafka-jmx-exporter
container с сервером Kafka:
- Убедитесь, что переменные среды
KAFKA_JMX_OPTS
иJMX_PORT
установлены в контейнере kafka. - Убедитесь, что контейнеры kafka-jmx-exporter и kafka находятся в одной сети (
backend
). - Убедитесь, что значение
JMX_HOST
для контейнера kafka-jmx-exporter совпадает со значениемKAFKA_ADVERTISED_HOST_NAME
в контейнере kafka. - Убедитесь, что
KAFKA_ADVERTISED_HOST_NAME
имеет соответствующую запись в/etc/hosts
. - Закрепить
wurstmeister/kafka
к версии1.0.0
. При настройке JMX с более ранними версиями образаwurstmeister/kafka
может возникнуть проблема. - Пин
prom/prometheus
к версииv2.0.0
- Это обновление требует одного изменения совместимости, а именно переименования
target_groups
вstatic_configs
вprometheus.yml
файле.
Результирующие разделы docker-compose.yml должны выглядеть так:
Grafana можно настроить для чтения файла панели инструментов JSON при запуске - он есть в etc/Kafka.json
, предварительно настроенный с некоторыми образцами информации мониторинга Kafka.
Запустите стек мониторинга
Если все настроено должным образом, вы сможете запустить стек с docker-compose up -d
. Затем отправьте несколько сообщений Кафке с помощью kafkacat:
for i in `seq 1 3`; do echo "hello" | kafkacat -b kafka:9092 -t transactions done
Просмотрите панель управления Kafka по адресу http: // localhost: 3000, и вы должны увидеть что-то вроде этого:
Часть вторая: создание Slack-бота
Теперь, когда инфраструктура мониторинга создана, мы можем написать нашего простого бота для Slack. В этом разделе описаны шаги по созданию бота и некоторые соответствующие фрагменты кода.
Первый шаг - создать и зарегистрировать бота на веб-сайте Slack, что вы можете сделать, войдя в Slack, перейдя на страницу https://api.slack.com/bot-users, а затем выполнив поиск на этой странице. для интеграции нового пользователя бота:
На следующем экране вы можете настроить детали, например добавить иконку и описание бота.
Когда ваш бот будет создан, приглашайте его куда-нибудь. Вы можете создать приватный канал для тестирования:
Затем пригласите бота в тестовый канал с /invite @handy_bot
:
Наш бот ответит на несколько простых вопросов, которые мы определим в строках 1–3:
В app.py
мы прочитаем наш файл конфигурации и запустим бота:
Метод start
выглядит так:
строка 2: подключается к Slack API.
строка 5: при заданной частоте опроса (1 секунда) проверьте, есть ли какие-либо новые события.
строка 7: если событие представляет собой сообщение, перейдите к методу on_message
, и если мы получим ответ от этого метода, распечатайте его в канале, в котором было опубликовано сообщение:
Метод on_message
- это то место, где мы решаем, как отвечать на сообщения, которые получает бот. Метод generate_and_upload_graph
- самый интересный ответ. Идея состоит в том, чтобы запустить временный контейнер Docker, чтобы сделать снимок экрана.
У Grafana есть возможность отображать любой график как файл PNG. Однако в последней версии Grafana, похоже, есть ошибка с внутренней библиотекой phantomjs для генерации изображений.
Более надежной утилитой для просмотра без головы является Puppeteer, основанная на Google Chrome, и кто-то услужливо уже обернул ее в образ Docker. Это дает нам возможность поэкспериментировать с Docker Python API:
строки 6:16: используйте Docker Python API для динамического создания контейнера на основе alekzonder/puppeteer
образа.
строка 13: привязывает текущий каталог к /screenshots
в контейнере, чтобы мы могли записать файл в доступное место
строка 15: устанавливает network_mode=host
, чтобы контейнер мог получить доступ к Grafana на локальном хосте.
строки 23:38 будут следить за добавлением новых изображений в каталог и загружать их
Запустить бота
Когда стек мониторинга запущен, вы сможете запустить бота. Из каталога slackbot
:
$ python bot.py --config=config.yaml Bot is alive and listening for messages...
Бот может отвечать на несколько базовых запросов, как показано ниже, и вы, конечно, можете адаптировать возможности бота к конкретным системам, которые вы хотите отслеживать.
Заключение
Боты ChatOps могут быть полезными помощниками, которые помогут вам управлять работающей системой. Это упрощенный вариант использования, но общая концепция может быть расширена для поддержки более сложных требований.
Использование Docker API для динамического создания контейнеров представляет собой сложный механизм для создания снимков экрана, но этот метод может быть особенно полезен, когда вам нужно быстро добавить функцию в собственное приложение, которое уже было упаковано как образ Docker.