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).
Цепочка ролей:
ResourceDiscovery— EC2, S3, Lambda, IAM, security groups, API Gateway, DynamoDBSecurityScanner— открытые порты, публичные бакеты, admin-роли, небезопасные конфигиComplianceChecker— CIS AWS Foundations BenchmarkRiskScorer— severity × blast radius × exploitabilityRemediationPlanner— готовые 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.
Три изменения:
- Пагинация
list_roles, сортировка поRoleLastUsed, анализ top 20 самых активных ролей - Пропуск 31 service-linked role с префиксом
/aws-service-role/ - 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