Перейти к содержимому
Экосистема AI Vibe
← Назад к AI Vibe News

Редакция 26 июля 2026 г.

Разборы

22,6 секунды — и вся пятёрка агентов ждёт один IAM-tool

22,6 секунды — и вся пятёрка агентов ждёт один IAM-tool.

22,6 секунды на одном агенте — остальные в цепочке около пяти: если вы собираете соло-конвейер с вызовом инструментов в CrewAI, LangGraph или агентном режиме IDE, такой разрыв в логах не светится, retry срабатывает внутри фреймворка, а токены сгорают молча. В разборе кейса автор AWS Security Posture Agent показал, как иерархия spans Sentry с gen_ai.invoke_agent вскрыла «тихий» повтор вызова LLM — и как пагинация плюс лимит на размер JSON сняли лишние 42% вывода без потери находок.

Пять агентов CrewAI — Bedrock Nova Pro на boto3-tools

Проект — AWS Security Posture Agent: пять специализированных AI-агентов сканируют аккаунт на misconfiguration, маппят на CIS benchmarks, считают риск и генерируют AWS CLI fix-команды. Оркестрация — CrewAI, агенты идут последовательно. Модель — Amazon Bedrock Nova Pro (amazon.nova-pro-v1:0 в метаданных span).

Цепочка ролей:

  1. ResourceDiscovery — EC2, S3, Lambda, IAM, security groups, API Gateway, DynamoDB
  2. SecurityScanner — открытые порты, публичные бакеты, admin-роли, небезопасные конфиги
  3. ComplianceChecker — CIS AWS Foundations Benchmark
  4. RiskScorer — severity × blast radius × exploitability
  5. RemediationPlanner — готовые AWS CLI fix-команды

Инструменты — кастомные boto3-tools с реальными AWS API. Тестовый аккаунт автора: 90 IAM roles, 14 S3 buckets, 9 security groups, 7 Lambda functions. Код — в репозитории simplynadaf/aws-security-posture-agent.

Не generic APM: автор с нуля инструментировал multi-agent pipeline через Sentry AI Agent Monitoring — submission к DEV Summer Bug Smash: Clear the Lineup powered by Sentry.

Span-дерево вместо time.time() в каждом агенте

Симптом простой. SecurityScanner — 22,6 s. Соседние агенты — 5–10 s в среднем, в заголовке поста — «~5 s».

Первая гипотеза — Bedrock. Без трейсинга план был классический: обернуть вызовы в time.time() и гадать.

В Sentry waterfall span SecurityScanner визуально вдвое шире остальных. Внутри — tool-span iam_analyzer с атрибутом result_length_chars: 26980.

Иерархия после инструментирования:

Transaction: "Security Posture Scan"
├── gen_ai.invoke_agent  (ResourceDiscovery)
├── gen_ai.invoke_agent  (SecurityScanner)
│   └── gen_ai.execute_tool  (iam_analyzer, s3_config_checker, …)
├── gen_ai.invoke_agent  (ComplianceChecker)
├── gen_ai.invoke_agent  (RiskScorer)
└── gen_ai.invoke_agent  (RemediationPlanner)

На агенте — op="gen_ai.invoke_agent", атрибуты gen_ai.agent.name, gen_ai.request.model, gen_ai.pipeline.name (security-posture-scan), плюс duration_seconds и output_length_chars. На tool — декоратор trace_tool: gen_ai.execute_tool, gen_ai.tool.name, result_length_chars; для JSON-output — findings_count, если есть.

26 980 символов JSON — и внутренний retry CrewAI

Корневая причина не в модели. Tool IAMAnalyzer (iam_analyzer) отдавал 26 980 символов JSON — все IAM roles после фильтра service-linked, 59 из 90.

Соседние tools на порядок скромнее:

Tool Размер output (chars)
iam_analyzer 26 980
security_group_analyzer ~4 200
s3_config_checker ~3 800

Соотношение — примерно 7× к siblings. LLM не переваривал payload с первой попытки. Срабатывала внутренняя retry-логика CrewAI — второй проход с ещё большим контекстом, токены сгорают, в логах тишина.

Один раздутый tool output → retry → латентность всей агентной цепочки. Span result_length_chars здесь не косметика — диагностический сигнал для любого pipeline с tool-calling.

Пагинация, top-20 и guard на 4000 символов

Фикс лег в src/security_posture/tools/iam_analyzer.py — PR #1 от 20 июля 2026.

Три изменения:

  1. Пагинация list_roles, сортировка по RoleLastUsed, анализ top 20 самых активных ролей
  2. Пропуск 31 service-linked role с префиксом /aws-service-role/
  3. Token budget guard: если JSON > 4000 chars — урезание role_summary до имён ролей и списков policies

Результат по таблице автора:

Метрика До После Δ
IAM tool output 26 980 chars 15 532 chars −42%
SecurityScanner time 22,6 s 17,8 s −21%
IAM API calls 59 20 −66%
Total pipeline 62,0 s 57,7 s −7%
Security findings 97 97 без потери

После фикса SecurityScanner проходит анализ за один проход LLM — без retry. Transaction «Security Posture Scan» — около 57 s против 62 s до правки.

В embed PR автор однажды пишет «Findings: still 27», тогда как основная таблица и раздел «What It Finds» фиксируют 97. Для выводов опираемся на 97 — покрытие не просело.

Что переносить в свой агентный конвейер

Паттерн из поста не привязан к AWS: ограничивать объём ответа tool до того, как контекст уйдёт в LLM, и смотреть на длину output в трейсе — не только на wall-clock агента.

Для соло-workflow с цепочкой субагентов или tool-calling в IDE логика та же:

  • пагинация и отбор релевантных сущностей вместо «выгрузить всё в JSON»;
  • жёсткий budget на размер payload tool (здесь — 4000 chars);
  • span на каждый execute_tool с result_length_chars, чтобы sibling-tools сравнивались на одном графике.

Автор в конце спрашивает сообщество про CrewAI и LangGraph — свой стек он на LangGraph не переключал. Вопрос открытый. Практический вывод для сборщика агентных pipeline: observability с gen_ai.* spans окупается на первом «тихом» retry, который таймеры в коде не ловят.

Когда в последний раз вы смотрели не на среднее время агента, а на самый жирный tool в span-дереве?


Источники

  • Sarvar (@sarvar_04), «Sentry's Span Hierarchy Exposed a Silent Retry in My 5-Agent Pipeline. One Agent Took 22.6s, the Others Took 5.» — Dev.to, 24 июля 2026: Dev.to
  • PR #1: pagination и token budget guard в iam_analyzer.py — https://github.com/simplynadaf/aws-security-posture-agent/pull/1