Як побудувати AI агентів для on-call

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Ця стаття пояснює, як ми розробили ієрархічного AI агента за допомогою Claude Skills + Grafana MCP, який автономно діагностує несправності нашого пайплайну збору історії. Він агрегує складну телеметрію — метрики, логи та внутрішні API-дані — у зрозумілі та практичні інсайти (всього за 3 хв).

Щось не працює, але де?

«Наш збір історії виконується вже 15 годин, і він все ще на 25%. Це блокує наш квартальний звіт. Що відбувається?»

Це повідомлення від одного з наших найбільших клієнтів. Наш on-call інженер — який працює всього кілька місяців — дивиться на екран. Який це сервіс? Які логи перевірити? Яка панель на дашборді показує... стоп, яка саме панель у Grafana?

Черговий інженер має не лише знати, де шукати релевантну інформацію — логи, дашборди, метрики — а й уміти пов’язати ці дані між собою. Саме це зазвичай і є найскладнішою частиною. У розподілених системах відповідь може ховатися у будь-якій частині. А клієнт чекає...

І тут мене осінило: а що, якби runbook міг сам себе виконувати?

Проблема: надто багато рухомих частин

Збір історії в YouScan дозволяє клієнтам отримувати згадки в соціальних мережах аж до 2014 року. Під капотом це доволі складний танець розподілених систем:

Фаза 1: Пошук

Знайти релевантні згадки в нашому масивному історичному кластері Elasticsearch розміром 2,48 петабайта. Продуктивність залежить від:

  • Поточного навантаження на кластер (скільки паралельних зборів виконується?)
  • Глибини пошуку (ми тримаємо останній рік даних на SSD, а інші на HDD для економії)
  • Складність пошукового запиту
  • Стан кластера (неприсвоєні шарди? проблеми на нодах еластіка?)

Фаза 2: Збереження

Обробка знайдених згадок у пайплайні збагачення.

Типові проблеми:

  • стан зовнішніх сервісів (тональність, сутності, розпізнавання зображень і багато інших)
  • бекпрешер у пайплайні (чи заповнені блоки?)

Класичний runbook порадив би: «Перевір API зборів → потім дашборд A → потім ці логи → потім звір із дашбордом B...»

Але в якому порядку? Що важливіше? Як корелювати знахідки з різних джерел?

Рішення: Claude Skills як ваш експерт з Observability

Claude Skills — це AI-агенти для конкретних задач. Ви створюєте файл SKILL.md, в якому описуєте, що саме повинен робити агент, коли це робити і якими інструментами (API, MCP) користуватися. Це автоматизовані процедури, які справді розуміють контекст.

To activate skills, all you need to do is write a SKILL.md file with custom guidance for your agent.

Для нашої задачі це було ідеально. Нам потрібен був агент, який міг би:

  • досліджувати кілька напрямів паралельно, а не послідовно;
  • синтезувати результати з різних джерел;
  • пріоритизувати рекомендації;
  • пояснювати свою логіку, навчаючи нових інженерів;

Ключова ідея: ієрархічна мультиагентна архітектура.

Побудова оркестратора : агенти, агенти, агенти

Замість одного монолітного агента, який намагається робити все (і роздувати контекстне вікно кожним рядком логу), ми побудували координовану команду:

Головний Оркестратор (SKILL.md)
├── Координатор фази пошуку (search-subagent.md)
│   ├── Агент аналізу зборів (API запити)
│   ├── Агент стану кластера (метрики Grafana)
│   └── Агент логів помилок (логи Elasticsearch)
└── Координатор фази збереження (save-subagent.md)
    ├── Агент аналізу повільного збереження (логи Elasticsearch)
    └── Агент зовнішніх сервісів (показники помилок Grafana)

Ось поточна версія нашого головного оркестратора: 👉 SKILL.MD 👈

Ці агенти працюють паралельно: один дістає метрики, інший — логи, третій — API-дані. Кожен повертає стислий і структурований висновок.

Переваги такої архітектури:

  1. Швидкість — результат за хвилини замість довгої послідовної діагностики.
  2. Контроль контексту — кожен агент працює з малим, чистим контекстом.

Потім фазові координатори збирають результати, а головний оркестратор визначає корінну проблему: Пошук? Збереження? Обидві фази? Чи вони блокують одна одну?

Коли ми запустили skill на реальному інциденті, ось що він знайшов менш ніж за 3 хвилини:

Executive Summary:
History collection health: Degraded (Search bottleneck)
Primary issue: 208 active collections (HIGH), 1 power users
Cluster load: 17.4 avg (elevated), search latency: 2800ms (2.5x baseline)
External services: All healthy
Severity: High
...

Prioritized Actions:
CRITICAL (immediate):
1. Check collections from *** account, launched by *** user.
2. Stop 5 lowest-priority collections targeting 2022 data.

HIGH (urgent):
1. Monitor cluster load after reduction

MEDIUM (short-term):
1. Implement per-account limit: max 20 concurrent collections

Це конкретна інформація з конкретними email користувачів і конкретними ID збірок для зупинки. Не просто «перевір логи і подивись, чи щось виглядає дивно».

Структуроване виведення є критичним

Кожен субагент повертає структуровані знахідки, а не сирі дані. Це підтримує контекстні вікна керованими та робить консолідацію можливою:

Agent Output Format:
  summary: "2-3 sentence assessment"
  key_findings: ["bullet", "point", "list"]
  root_cause: "What's actually wrong"
  severity: "LOW/MEDIUM/HIGH/CRITICAL"
  recommendations: ["Specific", "Actionable", "Prioritized"] 

Контекст є критичним для ефективної роботи агентів; ось гарна стаття від Anthropic про стратегії управління контекстом.

Навчай, а не просто розповідай

Наш skill не просто каже «зупини ці збори». Він пояснює:

  • Чому вони проблемні (Warm nodes, 2+ років, у користувача 190 одночасних зборів)
  • Який вплив вони мають (навантаження на кластер 17,4, затримка пошуку 2,5x від базової)
  • Як запобігти повторенню (впровадити ліміти на акаунт, розподіляти збори на теплих нодах)

Це перетворює кожен інцидент на можливість навчання для нових інженерів.

А що далі?

Збір історії — це лише один сценарій усунення несправностей; ми можемо мати окремий Claude skill для будь-чого.

Але ось де це стає дійсно цікавим: агентам не треба чекати, поки ви запитаєте.

Уявіть собі, що ваш діагностувач історії запускається автоматично, коли навантаження кластера перевищує пороги. Або ваш агент затримки API спрацьовує, коли p95 час відповіді перетинає 500ms.

Вони розслідують, синтезують знахідки і або:

  • Автоматично вирішують прості проблеми (перезапустити застряглий сервіс, очистити кеш)
  • Представляють діагностовані знахідки інженерам (повністю пропускаючи фазу розслідування)
  • Ескалують із вже зібраним повним контекстом

Для досвідчених інженерів Агенти для Observability — це економія часу та мультиплікатори сили. Для нових інженерів вони — прискорене навчання: спостереження експертних патернів усунення несправностей в дії, з поясненнями. А для всіх вони — невтомні спостерігачі, які можуть моніторити та діагностувати 24/7.

А як у вас?

  • Які сценарії чергування у вас найскладніші?
  • Експериментуєте з AI-асистованим інцидент-респонсом?
  • Що би ви автоматизували першочергово?

AI-агенти — це вже не просто хайп. Це реальний інструмент Observability і Troubleshooting.

👍ПодобаєтьсяСподобалось9
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дякую за статтю!

Поясни будь ласка — скіли так само з’їдають токени як основний процес? Чи менше?

То опис вашого агента виконується в тому SKILL.md файлі? цього достатньо щоь описати агента в клод?
агент це один з скілів? Получається коден скіл може створбвати паралельні процеси і стати агентом?

То опис вашого агента виконується в тому SKILL.md файлі?

Саме так — ось це головний файл gist.github.com/...​724a656507f8966bdb05d0ee0.

Там описано, коли викликати цей Skill, і послідовність інструкцій для виконання. Також я для зручності виніс саб-агентів в окремі папки та файли, і головний SKILL має референси на них в описі. Ось як виглядає структура цього скіла:
res.cloudinary.com/...​/whwvw2ocrlb19gz4qlgb.png

Це всі агенти в клод так описуються? Тобто нема ще якогось окремого спаціального синтаксису для агентів?

Ви можете описати свого агента в будь-якому файлі у вашому репозиторії. Наприклад файл зветься «Instructions.md», а всередині файлі щось типу: «Клод, подивися на логи ось тут, а також використай grafana mcp, щоб подивитися на ось цей дашборд, потім прочитай такий-то файл, а потім ....».

Тут виникає питання: Як клод дізнається коли використати ці інструкції? Вам потрібно буде кожного разу додати цей файл в контекст руками, і казати виконувати ці інструкції.

Синтаксис склів це спрощує. Обовʼязхково вказати name, description, ну і саме тіло скіла.

цього достатньо щоь описати агента в клод?

SKILL.md достатньо, щоб описати якийсь конкретний скіл, для виконання якоїсь конктретної задачі.

агент це один з скілів?

Агент — це Claude code. Він вміє виконувати доволі комплексні завдання, ранити тести, шукати щось в інтернеті, працювати з файловою системою.

Скіл — це опис інструкцій, скриптів, ресурсів і знань які агент може використовувати для виконання певного завдання.

Моя ментальна модель така:
Claude code — це ерудована і дуже працьовита людина, яка може виконувати різні завдання, якщо їй все гарно пояснити. Для кращих результатів потрібно дати Клоду можливість перевіряти результати своєї праці (feedback loop).
Skill — це Claude code з проф-підготовкою в якійсь конкретній області. Він чітко знає коли починати роботу, що саме робити, які інструменти використовувати, і що очікують в результаті.

Дякую за статтю!

SKILL.md достатньо, щоб описати якийсь конкретний скіл, для виконання якоїсь конктретної задачі.

Поясни будь ласка — якщо треба декілька скілів, їх всі описувати в одному файлі? Чи треба створювати їх в директоріях?

Получається коден скіл може створбвати паралельні процеси і стати агентом?

Паралельні процеси можна запускати і без скілів, напряму в Claude Code. Просто скажіть клоду щось типу: Launch subagent to research this part of the system. Subagent should present a comprehensive review in result.

Таким чином, ви, через головного агента, запускаєте під-агента.
Для чого це? Швидкість (якщо можна запустити агентів в паралелі) + незабите контекстне вікно головного агента.

Скіл — це просто інструкції для виконання клодом, тому там також можна сказати щоб запустити агентів в паралелі. Ось так: gist.github.com/...​d0ee0#main-agent-workflow

Дякую. Зрозуміло.
Я думав для агентів є якась спеціальна папка подібно як для скілів.
Але тепер зрозуміло, що клод розуміє про запуск саб-агента "«зі слів».

Щось подібне зараз роблю за допомогою Langgraph multi-agents
blog.langchain.com/...​ph-multi-agent-workflows

Я правильно розумію що взаємодія агентів з вашою інфраструктурою відбувається через public internet?

Гарне питання!
У нас зараз з цим менше проблем, бо ранимо агента на локальних машинах, а не в клауді. Для Grafana mcp кожен інженер має свій токен, а логи еластіка та внутрішній API доступні через закриті внутрішні ендпоінти.

А ви як це вирішуєте ?

бо ранимо агента на локальних машинах, а не в клауді.

А можна з цього моменту детальніше? :)
Я думав скіли завантажуються через Claude API і раняться на Claude VM.

У нас все в AWS. Цікаво б було порівняти але треба щоб все було в AWS без зовнішніх конекшенів.

І ще питання, ці агенти трейсяться, наприклад подивитись виклики LLM? Ну і взагалі, що розуміти що відбувається під капотом.

Я думав скіли завантажуються через Claude API і раняться на Claude VM.

Ні — скіли живуть поруч з агентом, їх можна додати як і в звичайний додаток Claude Desktop так і використовувати в Claude Code.
Тобто який процес:
1. Ви встановлюєте на машині Claude Code — agentic coding assistant. Claude Code вміє робити якісь базові речі: читати/писати файли, шукати в інтернеті, робити запити на external api через curl і тд. Ви також можете розширити його вміння встановиши різні MCP — наприклад Grafana MCP.
2. Якщо у вас є якась повторювана задача (протестувати UI, траблшутити історичний кластер, перевірити PR і тд) — вам більше не треба описувати всю послідовність дій щоразу в новому контекстному вікні. Ви створюєте SKILL.md, з описом і інструкціями для клода, що він повинен зробити в якійсь ситуації (візьми такі-то логи, перевір те і те, і зроби висновок)

Наприклад в нас, я описав у файлі (gist.github.com/...​724a656507f8966bdb05d0ee0), що скіл Клод має заюзати цей скіл, якщо в нього запитають про history collection pipeline. І він буде виконувати ці інструкції.

Дякую, зрозуміло. Погрався з Claude Agents SDK. В принципі цікава задумка. Так не зовсім оптимально, робить багато запитів до моделі, не зовсім швидко, але дає змогу людям з мінімальними навичками в программуванні або зовсім без них, автоматизувати рутинні речі за допомогою агентів.
Враховуючи те, що кількість MCP серверів і скілів буде збільшуватись, багато хто в майбутньому залишиться без роботи.

І ще питання, ці агенти трейсяться, наприклад подивитись виклики LLM? Ну і взагалі, що розуміти що відбувається під капотом.

Так, можна (і деколи дуже корисно, щоб зрозуміти його поведінку).
На моєму скріншоті (в пункті Переваги такої архітектури) Клод каже що можна натиснути ctrl-o, щоб подивитися повний хід виконання, із запитами, відповідями, reasoning і тд

Чому? Для моніторінгу у нас є логи, метрики, алерти і тд, а цей пост про те, що Агент може це все взяти, синтезувати, повʼязати між собою — і визначати корінну проблему. Це ж якраз про Observability.

Потім фазові координатори збирають результати, а головний оркестратор визначає корінну проблему: Пошук? Збереження? Обидві фази? Чи вони блокують одна одну?

Підписатись на коментарі