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

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

Одно остается неизменным:

  • Сбор данных из разных источников

    • Метрики

    • Логи

    • Трэйсы

    • Графики релизов и тех. работ

  • Анализ на основе собственных знаний и опыта

  • Выработка возможных решений

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

Писать/обновлять runbook под каждый алерт достаточно утомительное занятие, именно поэтому опытный инженер всегда будет эффективней базы из сотен ранбуков.

А что, если функция инженера выполняется, даже когда самого инженера физически нет?

Проектируем ассистента: что нужно определить заранее

Тем кто очень спешит, может мотать вниз, чтобы увидеть итоговую реализацию.

А мы переходим к подготовке. Прежде чем писать код, стоит ответить на четыре вопроса:

  • Какие события и в каком формате предоставлять агенту?

  • Какие источники и данные могут понадобиться?

  • Как манипулировать этими данными, чтобы определить корень проблемы?

  • Каким будет результат диагностики по форме и содержанию?

Разберем каждый пункт. А ссылку на сам workflow можно найти ниже

События и формат

Как правило достаточным для начала диагностики является событие, в котором описано

  • Alertname

  • Description

  • Labels/Tags

  • namespace

  • instance

  • env

  • region

  • Grafana Dashboard

  • Runbook Url

Источники данных

Наиболее часто мы обращаемся к:

  • Метрикам, вышедшим за рамки допустимых значений

  • Метрикам потребления ресурсов и нагрузки

  • Логам ошибок

  • Платформе будь то k8s или отдельный сервер

  • Связанным релизам в CI/CD 

  • Описанию алерта и условия его сработки

Анализ данных

Пожалуй нельзя создать эталонный порядок действий для анализа. Порядок диагностики и анализа имеет вариативность и поэтому еще никто не смог создать скрипт покрывающий все возможные варианты, но мы постараемся.

Прежде всего попытаемся понять, как мы сами подходим к диагностике инцидента.

  1. Смотрим, что происходит с метрикой, по которой сработал алерт, и определяем характер аномалии: спайка, монотонный рост, стабильно критическое значение

  2. Выясняем, программный ли это сбой или он вызван проблемами уровнем ниже

  3. Проверяем метрики инфраструктуры: ресурсы, сеть, системные лимиты

  4. Изучаем логи в точке, где происходит проблема

  5. Определяем, как давно обновлялись проблемные компоненты и что менялось

  6. Пытаемся взаимодействовать с компонентами напрямую — через оркестратор или оболочку Linux

Формат отчета

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

Архитектура решения

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

AI агент согласно своему системному промту и доступным mcp производит диагностику и генерирует заключение в установленном виде.

Заключение отправляется в командный чат.

Реализация

В качестве среды реализации подобных workflow я выбираю n8n. Так как позволяет

  • достаточно быстро создавать легко читаемые механики 

  • легко делиться результатами работы

  • отделять логику от секретов и прочих хардкодов

  • имеет бесплатную self-hosted версию

  • огромное комьюнити

Лично мне он напоминает Jenkins лет 10 назад, а Jenkins был хорош. Вы можете установить n8n любым из доступных способов по документации, например через docker-compose

Далее реализация будет зависеть от используемых систем, у меня это

Препроцессинг входящих событий

Alertmanager умеет отправлять алерты на кастомный вебхук. В n8n достаточно создать для этого триггер ноду webhook и можно также указать параметры аутентификации.

Добавить данные о созданном вебхуке в новый receiver n8n в alertmanager

После этого мы сможем отправлять алерты из Alertmanager в наш workflow. Но в получаемых сообщениях есть лишние данные, а также формат не совсем подходящий. Из-за этого LLM будет хуже понимать, что от нее хотят и тратить больше токенов. Поэтому мы делаем небольшое преобразование с помощью Code node.

Вам скорее всего захочется сложить некоторые значения в переменные: например uid вашего Prometheus в Grafana

AI Agent

Обязательным условиям для работы узла AI Agent это подключенная LLM. Можно подключить практически любую нейросеть, но из опыта Codex и Opus справляются лучше всего

Memory мы здесь не используем, т.к. каждый алерт отдельное событие, не связанное с другими.

Одним из важных моментов является написание системного промта. Что стоит там написать?

  • Назначение Агента

  • Краткое описание вашей инфраструктуры и типа предоставляемого вами сервиса

  • Описание для чего нужен каждый MCP, например использовать kubernetes mcp для получения статуса пода, событий связанных с ним и т.д.

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

  • Рекомендации по ходу диагностики, это как раз то, что мы обсуждали в разделе про Анализ данных

MCP — глаза и уши агента

MCP являются глазами и ушами агента, давая ему возможность взаимодействовать предметом диагностики. Здесь список может варьироваться в зависимости от конкретной инфраструктуры, но основные виды источников данных (которые, мы рассмотрели в начале ) остаются неизменными. В моем случае список выглядит так

При запуске ваших mcp убедитесь, что они работают в режиме remote http streaming

Vector store

Отдельно стоит остановиться на базе знаний. Сюда можно класть большие объемы информации и осуществлять быстрый поиск по ним. Это экономит токены и время на запросы к внешним системам. В качестве такой базы я использую Qdrant. Настоятельно советую задать Service API token для аутентификации

Далее необходимо создать коллекцию, где будут хранится знания. Создать можно через веб интерфейс http://<your-host>:6333/dashboard

Создайте QdrantApi аккаунт и используйте его для подключения.

Как только база подключена к агенту, как tool, самое время загрузить в него знания. Для этого я использую отдельный workflow

Здесь можно загрузить в появившуюся форму ваш файл/файлы со знаниями и они будут сохранены в базу.

Отправка в чат

После того, как AI агент сделает свое дело, нам нужно отправить результаты его работы в чат, где их будут видеть инженеры. Цепочка отправки состоит из 3х узлов, 

  • Поиск последних сообщений в канале с алертами. К сожалению не все группы чаты позволяют делать поиск по ключевым словам через API, поэтому берутся последние 10 сообщений. 

  • Нахождение среди сообщений, того который соответствует нашему алерту

  • Отправка результатов диагностики в тред найденного сообщения

Для отправки взаимодействия со Slack, вам нужно будет настроить аутентификацию по этой инструкции 

Тестирование и примеры работы

Итоговый workflow выглядит так.

Я тестировал его небольшие модификации на нескольких проектах и вот, что получилось

одна из первых версий
одна из первых версий

В среднем анализ алерта тратится 30 секунд. За это время он успевает посмотреть метрики, логи, обстановку в k8s кластере и дать заключение.

Заключение

Таким образом мы имеет ассистента, который приступает к работе, как только сработал алерт. Время анализа невелико и это гарантирует, что к тому времени как алерт увидит инженер первичная диагностика будет проведена.

Это лишь одно из направлений, где AI способен существенно упростить жизнь инфраструктурным командам — и командам разработчиков, которые вынуждены сами заниматься поддержкой. Агент не заменяет инженера, но берёт на себя первичную диагностику и сокращает время от «алерт сработал» до «понятно, в чём дело». А ночью — когда дежурный спит — это может оказаться бесценным.


Базовую версию workflow можно найти тут: https://github.com/javdet/automagicops-workflows/tree/main/workflows/AlertAssistant

Хочешь быстро реализовать похожий flow у себя? Читай полный гайд на Boosty с подробными примерами, практическими советами.

Автор статьи: https://linkedin.com/in/sergeybyvshev