В этом руководстве описывается подход к созданию простого бота 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:

  1. Убедитесь, что переменные среды KAFKA_JMX_OPTS и JMX_PORT установлены в контейнере kafka.
  2. Убедитесь, что контейнеры kafka-jmx-exporter и kafka находятся в одной сети (backend).
  3. Убедитесь, что значение JMX_HOST для контейнера kafka-jmx-exporter совпадает со значением KAFKA_ADVERTISED_HOST_NAME в контейнере kafka.
  4. Убедитесь, что KAFKA_ADVERTISED_HOST_NAME имеет соответствующую запись в /etc/hosts.
  5. Закрепить wurstmeister/kafka к версии 1.0.0. При настройке JMX с более ранними версиями образа wurstmeister/kafka может возникнуть проблема.
  6. Пин prom/prometheus к версии v2.0.0
  7. Это обновление требует одного изменения совместимости, а именно переименования 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.