AI-агенты для DevOps: автоматизация CI/CD и управление инцидентами


title: "AI-агенты для DevOps: автоматизация CI/CD и управление инцидентами" slug: agents-devops-cicd-incident-response-2026-ru date: 2026-02-21 lang: ru tags: [devops, ci-cd, incident-response, llm-agents, automation, infrastructure] description: "Как AI-агенты автоматизируют CI/CD-конвейеры, диагностируют production-инциденты, генерируют runbook'и и управляют изменениями инфраструктуры с approval-gate'ами."

AI-агенты для DevOps: автоматизация CI/CD и управление инцидентами

Ключевые факты

  • anthropic: 0.84.0 (последняя стабильная версия, Messages API с поддержкой tool use)
  • openai: 2.24.0 (поддерживает Assistants API v2 с function calling)
  • langchain: 1.2.10 (фреймворк оркестрации агентов, поддержка LCEL)
  • langgraph: 1.0.10 (stateful графы мультиагентных систем, persistence layer)
  • slack-sdk: 3.40.1 (WebClient для публикации сообщений, поддержка blocks и attachments)
  • pdpyras: 5.4.1 (обёртка REST API v2 PagerDuty, управление инцидентами)
  • PagerDuty Events API v2 endpoint: https://events.pagerduty.com/v2/enqueue (payload: routing_key, event_action, payload.summary, payload.severity, payload.source)
  • Slack WebClient method: client.chat_postMessage(channel='#incidents', text='...', blocks=[...])
  • GitHub Actions OIDC: Настройка permissions: id-token: write, получение JWT с помощью ${{ github.token }}, обмен через aws-actions/configure-aws-credentials@v4
  • workflow_dispatch event: Ручной триггер с параметром inputs для окружения, версии и т.д.
  • Incident severity P1: Критический отказ системы, требуется немедленный отклик, SLA: 15 мин подтверждения, 1 час на разрешение
  • Incident severity P2: Серьёзное снижение производительности, 30 мин подтверждения, 4 часа на разрешение
  • Incident severity P3: Незначительное воздействие, 4 часа подтверждения, 24 часа на разрешение
  • Incident severity P4: Минимальное воздействие, подтверждение на следующий рабочий день, 7 дней на разрешение
  • Log regex patterns: r'ERROR|FATAL|CRITICAL|panic|exception', r'connection refused|timeout|deadline exceeded', r'out of memory|OOM|killed', r'rate limit|quota exceeded|throttled'
  • Terraform plan parsing: Извлечение resources_added, resources_modified, resources_deleted из вывода плана
  • CI/CD pipeline stages: unit-tests (3 мин), integration-tests (12 мин), security-scan (8 мин), performance-tests (25 мин), e2e-tests (20 мин)
  • Approval gate triggers: production-окружение, любое удаление ресурса, risk_level >= high, >5 изменённых ресурсов, >20% прироста стоимости
  • Agent model selection: Claude Opus 4.6 для сложной логики (диагностика инцидентов, оценка risk инфраструктуры), Claude Sonnet для ускоренной триажа
  • Tool call timeout: 300 секунд для runbook-шагов, 60 секунд для запросов логов, 600 секунд для terraform apply
  • Auto-remediation confidence threshold: 0.7 (70%) минимальная уверенность для автономного действия без эскалации

Сценарии использования DevOps-агента

Обнаружение и триаж инцидентов: Агенты поглощают алерты из PagerDuty/Prometheus/DataDog, параллельно собирают логи и метрики, коррелируют с недавними deployment-ами и классифицируют severity. Они различают реальные инциденты и ложные срабатывания, анализируя исторические паттерны.

Исполнение runbook'ов: Для известных типов инцидентов (нехватка памяти, исчерпание пула соединений, истечение сертификата) агенты автономно исполняют шаги remediation: перезагружают сервисы, масштабируют deployment-ы, ротируют credentials, очищают кэши. Они проверяют успешность после каждого шага и эскалируют при неудаче.

Маршрутизация oncall и эскалация: Агенты обогащают контекст инцидента перед вызовом людей. Они прикрепляют диагностические данные, вероятную root cause, рекомендуемые действия и релевантные ссылки на runbook'ы к инцидентам PagerDuty. Это снижает mean time to diagnosis с 23 минут до менее чем 5 минут.

Оптимизация CI/CD-конвейера: Агенты анализируют изменённые файлы и решают, какие test suite'ы запустить. Для изменений только документации они пропускают дорогие e2e-тесты. Для изменений сервиса платежей они триггерят полные security-scan'ы и performance-тесты. Это снижает среднюю длительность конвейера при сохранении покрытия.

Диагностика отказа тестов: Когда конвейеры падают, агенты парсят логи тестов, категоризируют ошибки (ошибка компиляции, нестабильный тест, реальная регрессия, проблема зависимостей), предлагают исправления и определяют, нужно ли блокировать merge или позволить retry.

Генерация post-mortem: После разрешения инцидента агенты черновой вариант blameless post-mortem'ов из timeline data, метрик и выполненных действий. Они применяют анализ 5-Whys root cause и генерируют SMART action item'ы, экономя 2-3 часа инженерного времени на инцидент.

Утверждение изменений инфраструктуры: Terraform-агенты запускают plan, оценивают risk на основе deletions и cost impact, определяют необходимых одобрителей, запрашивают human approval для high-risk изменений и исполняют apply только после одобрения.

Рамка принятия решений

Rule-based автоматизация (без LLM): Используйте для детерминированных задач с чёткими триггерами: renewal сертификата когда истечение < 7 дней, auto-scaling когда CPU > 80% в течение 5 минут, log rotation при 90% использования диска. Быстро, предсказуемо, ноль стоимости API.

LLM-агент (автономное действие): Используйте когда задача требует рассуждения над неструктурированными данными: диагностика novel error pattern'ов в логах, решение какие pipeline stage'ы запустить на основе изменённых файлов, оценка risk инфраструктурного изменения, классификация incident severity из текста алерта. Агент должен работать в рамках safety границ: confidence threshold'ы, approval gate'ы, circuit breaker'ы.

Human-in-the-loop: Требуется для: production infrastructure deletion'ов, инцидентов затрагивающих >10k пользователей, изменений с rollback_complexity = impossible, любого действия когда confidence агента < 70%, первого deployment'а в новое окружение (всегда dry-run сначала).

Критерии триггера activation агента:

  • Alert severity >= P2 → активируйте incident response agent
  • CI/CD pipeline failure → активируйте test diagnosis agent
  • Terraform plan с >3 изменениями ресурса → активируйте infrastructure risk agent
  • Log error rate > 10 ошибок/мин sustained за 5 мин → активируйте log analysis agent
  • PagerDuty incident создан → прикрепите agent-generated diagnostic context

Критерии эскалации:

  • Agent confidence < 0.7 → эскалируйте немедленно
  • 3 последовательных неудачных попытки remediation → остановитесь и эскалируйте
  • Инцидент не разрешён после 30 минут работы агента → эскалируйте senior engineer
  • Любое infrastructure изменение deleting production ресурсы → требуйте CTO одобрение

Таблица справки параметров

Параметр Значение Замечания
model claude-opus-4-6 Для диагностики инцидентов, оценки risk инфраструктуры
model claude-sonnet-4-0 Для ускоренного parsing логов, категоризации отказов тестов
max_tokens 8096 Loops рассуждений агента с tool call'ами
max_tokens 2048 Single-shot диагностика или оценка risk
max_tokens 1024 Бинарные решения (пропустить тест? одобрить?)
temperature 0 Не конфигурируется в Anthropic Messages API (всегда 1.0)
tool_choice {"type": "auto"} Позвольте модели решить когда использовать инструменты
tool_choice {"type": "tool", "name": "..."} Форсируйте определённый инструмент для следующего вызова
timeout_seconds 300 По умолчанию для исполнения runbook-шагов
timeout_seconds 60 Запросы логов/метрик к observability stack
timeout_seconds 600 Операции terraform apply
time_range_minutes 30 Окно query логов по умолчанию для контекста инцидента
time_range_minutes 60 Metric query для анализа trend
log_limit 500 Макс линий логов до deduplication
confidence_threshold 0.7 Минимум для auto-remediation без одобрения
approval_timeout_minutes 30 Default timeout для approval request
approval_timeout_minutes 60 Infrastructure изменения (больше времени на review)
retry_attempts 3 Макс retry'и для flaky тестов перед эскалацией
circuit_breaker_threshold 3 Failed actions перед остановкой агента
cost_increase_threshold_percent 20 Terraform изменения требующие одобрения
resources_modified_threshold 5 Terraform изменения требующие одобрения

Частые ошибки

Ошибка 1: Отправка полных логов в LLM без фильтрации

Воздействие: Переполнение контекста, высокая стоимость, медленный отклик. 1 миллион строк логов примерно ~4 токена/строка = 4M токенов = $30 за анализ с Claude Opus.

Антипаттерн:

# Отправляет ВСЕ логи в LLM - упадёт на больших объёмах
logs = get_logs(service="api-gateway", hours=24)
diagnosis = client.messages.create(
    model="claude-opus-4-6",
    messages=[{"role": "user", "content": f"Analyze: {logs}"}]
)

Правильный подход:

# Двухэтапный: быстрая фильтрация regex, затем LLM анализ deduplicated подмножества
ERROR_PATTERNS = [
    re.compile(r'ERROR|FATAL|CRITICAL', re.IGNORECASE),
    re.compile(r'connection refused|timeout'),
]

def filter_logs(log_stream):
    errors = []
    for line in log_stream:
        if any(p.search(line) for p in ERROR_PATTERNS):
            errors.append(line)
        if len(errors) > 500:
            break
    return deduplicate_errors(errors)  # Удалить повторяющиеся паттерны

filtered = filter_logs(get_logs("api-gateway", hours=24))
diagnosis = client.messages.create(
    model="claude-opus-4-6",
    messages=[{"role": "user", "content": f"Analyze: {filtered[:50]}"}]
)

Ошибка 2: Отсутствие approval gate для production инфраструктурных изменений

Воздействие: Production outage из-за автоматического удаления ресурса. Время восстановления: часы или дни если требуются backup'ы.

Антипаттерн:

# Автоматически применяет ВСЕ terraform изменения
plan_result = run_terraform_plan(workspace="production")
run_terraform_apply(workspace="production", auto_approve=True)

Правильный подход:

plan = run_terraform_plan(workspace="production")
risk = assess_risk(plan)  # LLM анализирует plan вывод

if (plan.resources_deleted or
    risk.level >= "high" or
    env == "production"):
    approval = request_approval(
        change=plan.summary,
        risk=risk,
        approvers=["cto", "platform-lead"],
        timeout_minutes=60
    )
    if not approval.approved:
        return {"status": "blocked"}

run_terraform_apply(workspace="production", auto_approve=True)

Ошибка 3: Отсутствие обработки LLM hallucination'ов в параметрах tool'ов

Воздействие: Агент вызывает инструменты с неверными параметрами (неправильное имя сервиса, несуществующий конвейер), вызывая каскадирующиеся ошибки.

Антипаттерн:

# Слепо исполняет tool call'ы без валидации
for tool_call in response.content:
    if tool_call.type == "tool_use":
        result = execute_tool(tool_call.name, tool_call.input)

Правильный подход:

# Валидируйте параметры инструмента против известных entities
VALID_SERVICES = ["api-gateway", "auth-service", "payment-service"]
VALID_ENVIRONMENTS = ["dev", "staging", "production"]

for tool_call in response.content:
    if tool_call.type == "tool_use":
        # Валидируйте сервис существует
        if "service" in tool_call.input:
            if tool_call.input["service"] not in VALID_SERVICES:
                return error_result(
                    f"Unknown service: {tool_call.input['service']}. "
                    f"Valid: {VALID_SERVICES}"
                )

        # Валидируйте окружение
        if "environment" in tool_call.input:
            if tool_call.input["environment"] not in VALID_ENVIRONMENTS:
                return error_result(f"Invalid environment")

        result = execute_tool(tool_call.name, tool_call.input)

Ошибка 4: Отсутствие circuit breaker'а на последовательные отказы

Воздействие: Агент усугубляет ошибки, делает production хуже. Пример: агент перезагружает сервис 10 раз в цикле, каждая перезагрузка вызывает краткий outage.

Антипаттерн:

# Бесконечный retry цикл без лимита отказов
while not incident_resolved:
    action = agent.decide_next_action(incident)
    execute_remediation(action)

Правильный подход:

MAX_FAILURES = 3
failures = 0

while not incident_resolved and failures < MAX_FAILURES:
    action = agent.decide_next_action(incident)
    result = execute_remediation(action)

    if not result.success:
        failures += 1
        if failures >= MAX_FAILURES:
            escalate_to_human(
                incident=incident,
                reason=f"Agent failed {MAX_FAILURES} consecutive actions",
                actions_attempted=action_log
            )
            break
    else:
        failures = 0  # Резет на успех

Ошибка 5: Отсутствие обогащения контекста инцидента перед вызовом людей

Воздействие: Oncall инженер просыпается, тратит 15-20 минут собирая те же диагностические данные которые агент уже собрал.

Антипаттерн:

# Немедленно вызывает человека с raw алертом
if alert.severity == "P1":
    pagerduty.create_incident(title=alert.title, severity="P1")

Правильный подход:

# Агент сначала собирает контекст, затем вызывает с обогащёнными данными
if alert.severity == "P1":
    context = await gather_diagnostic_context(alert)  # Параллельные запросы логов/метрик
    diagnosis = await diagnose_incident(alert, context)

    summary = generate_incident_summary(
        alert=alert,
        diagnosis=diagnosis,
        recent_deployments=context.deployments,
        recommended_actions=diagnosis.actions
    )

    pagerduty.create_incident(
        title=f"[AI-Triaged] {alert.title}",
        severity="P1",
        body=summary,
        custom_fields={
            "probable_cause": diagnosis.cause,
            "confidence": diagnosis.confidence,
            "logs_url": context.logs_link,
            "runbook_url": diagnosis.runbook_url
        }
    )

Incident Response Agent

Архитектура: Alert ingestion → context gathering → LLM диагностика → решение (remediate vs escalate) → исполнение → верификация.

Alert ingestion (PagerDuty webhook → агент):

from dataclasses import dataclass
from enum import Enum
from datetime import datetime

class IncidentSeverity(Enum):
    P1 = "P1"  # Critical - 15 мин ACK, 1 час разрешения
    P2 = "P2"  # High - 30 мин ACK, 4 часа разрешения
    P3 = "P3"  # Medium - 4 часа ACK, 24 часа разрешения
    P4 = "P4"  # Low - следующий рабочий день

@dataclass
class Alert:
    id: str
    title: str
    service: str
    severity: IncidentSeverity
    timestamp: datetime
    metrics: dict  # {"error_rate": 0.15, "latency_p99": 2500}
    labels: dict   # {"team": "platform", "region": "us-east-1"}

Context gathering (параллельные запросы к observability stack):

async def gather_context(alert: Alert) -> dict:
    tasks = [
        get_recent_logs(alert.service, minutes=30),
        get_metrics(alert.service, minutes=60),
        get_recent_deployments(alert.service, hours=24),
        get_dependency_health(alert.service),
    ]

    results = await asyncio.gather(*tasks, return_exceptions=True)

    return {
        "logs": results[0] if not isinstance(results[0], Exception) else [],
        "metrics": results[1] if not isinstance(results[1], Exception) else {},
        "recent_deployments": results[2],
        "dependency_health": results[3],
    }

LLM диагностика (structured output с confidence):

async def diagnose_incident(alert: Alert, context: dict) -> Diagnosis:
    prompt = f"""Диагностируйте production инцидент как expert SRE.

Alert: {alert.title}
Service: {alert.service}
Severity: {alert.severity.value}
Current Metrics: {json.dumps(alert.metrics)}

Logs (last 30 min): {str(context['logs'][:4000])}
Recent Deployments: {json.dumps(context['recent_deployments'])}
Dependency Health: {json.dumps(context['dependency_health'])}

Рассмотрите:
1. Deployment корреляция (совпадение timing с началом ошибки)
2. Каскадирующийся отказ из зависимости
3. Истощение ресурса (память/диск/соединения)
4. Всплеск трафика или DDoS
5. Изменение конфигурации

JSON output:
{{
    "probable_cause": "specific description",
    "confidence": 0.0-1.0,
    "evidence": ["deployment at 14:23 correlates", "OOM in logs"],
    "recommended_actions": ["rollback v1.2.3", "scale to 10 replicas"],
    "requires_human": true/false,
    "estimated_resolution_minutes": 15
}}

Установите requires_human=true если confidence < 0.7 или действие затрагивает >10k пользователей."""

    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}]
    )

    data = json.loads(response.content[0].text)
    return Diagnosis(**data)

Автоматический remediation (исполнение runbook-шагов):

async def auto_remediate(alert: Alert, diagnosis: Diagnosis) -> dict:
    actions_taken = []

    for action in diagnosis.recommended_actions:
        result = await execute_action(action, alert.service)
        actions_taken.append({
            "action": action,
            "result": result,
            "timestamp": datetime.now().isoformat()
        })

        # Проверьте разрешена ли проблема после каждого действия
        if await check_metrics_healthy(alert.service):
            return {
                "status": "remediated",
                "actions": actions_taken,
                "resolution_time_minutes": (datetime.now() - alert.timestamp).total_seconds() / 60
            }

    return {"status": "remediation_incomplete", "actions": actions_taken}

Эскалация с контекстом (создание PagerDuty инцидента):

async def escalate_to_human(alert: Alert, diagnosis: Diagnosis, context: dict):
    summary = f"""**Impact**: {alert.title}
**Probable Cause** ({diagnosis.confidence:.0%} confidence): {diagnosis.probable_cause}

**Evidence**:
{chr(10).join(f'- {e}' for e in diagnosis.evidence)}

**Recommended Actions**:
{chr(10).join(f'{i+1}. {a}' for i, a in enumerate(diagnosis.recommended_actions))}

**Recent Deployments**: {len(context['recent_deployments'])} in last 24h
Latest: {context['recent_deployments'][0] if context['recent_deployments'] else 'None'}

**Logs**: [View in Kibana](https://kibana.example.com/...)
**Metrics**: [View in Grafana](https://grafana.example.com/...)
"""

    incident = pagerduty_client.create_incident(
        title=f"[AI-Triaged] {alert.title}",
        severity=alert.severity.value,
        body=summary,
        custom_fields={
            "ai_diagnosis": diagnosis.probable_cause,
            "ai_confidence": str(diagnosis.confidence),
        }
    )

    # Also post to Slack
    slack_client.chat_postMessage(
        channel="#incidents",
        text=f"🚨 {alert.severity.value} Incident: {alert.title}",
        blocks=[
            {"type": "section", "text": {"type": "mrkdwn", "text": summary}},
            {"type": "actions", "elements": [
                {"type": "button", "text": {"type": "plain_text", "text": "View in PagerDuty"}, "url": incident.html_url}
            ]}
        ]
    )

CI/CD Pipeline Agent

Pipeline decision logic (интеллектуальный выбор stage'ов):

from dataclasses import dataclass

@dataclass
class PipelineDecision:
    should_run: bool
    pipeline_config: str  # "full", "targeted", "minimal"
    rationale: str
    estimated_duration_minutes: int
    skip_stages: list[str]

def analyze_changeset(changed_files: list[str], branch: str, commit_msg: str) -> PipelineDecision:
    # Map файлов на затронутые сервисы
    affected = set()
    for file in changed_files:
        if file.startswith("services/payment/"):
            affected.add("payment-service")
        elif file.startswith("services/auth/"):
            affected.add("auth-service")
        elif file.startswith("docs/"):
            affected.add("docs-only")

    prompt = f"""Решите какие CI/CD stage'ы запустить.

Changed files: {', '.join(changed_files[:20])}
Affected services: {', '.join(affected)}
Branch: {branch}
Commit: {commit_msg}

Доступные pipeline stage'ы:
- unit-tests: 3 мин, per-service
- integration-tests: 12 мин, требует running сервисов
- security-scan: 8 мин, SAST/dependency check
- performance-tests: 25 мин, только для payment/auth/api изменений
- e2e-tests: 20 мин, full stack

JSON output:
{{
    "should_run": true,
    "pipeline_config": "full|targeted|minimal",
    "skip_stages": ["performance-tests", "e2e-tests"],
    "estimated_duration_minutes": 23,
    "rationale": "Skip perf tests - only docs changed"
}}

Правила:
- docs-only изменения: пропустите e2e-tests, performance-tests
- payment/auth изменения: запустите ВСЕ stage'ы включая performance-tests
- infrastructure изменения: запустите full конвейер"""

    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )

    data = json.loads(response.content[0].text)
    return PipelineDecision(**data)

GitHub Actions интеграция (workflow_dispatch с динамической матрицей):

# .github/workflows/ai-pipeline.yml
name: AI-Orchestrated CI/CD

on:
  push:
    branches: [main, 'release/**']
  pull_request:
  workflow_dispatch:
    inputs:
      environment:
        description: 'Target environment'
        required: true
        type: choice
        options: [dev, staging, production]

permissions:
  id-token: write  # For OIDC token
  contents: read

jobs:
  analyze:
    runs-on: ubuntu-latest
    outputs:
      pipeline_config: ${{ steps.decide.outputs.config }}
      skip_stages: ${{ steps.decide.outputs.skip }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get changed files
        id: changes
        run: |
          git diff --name-only ${{ github.event.before }}..${{ github.sha }} > changed.txt
          echo "files=$(cat changed.txt | tr '\n' ',')" >> $GITHUB_OUTPUT

      - name: AI Pipeline Decision
        id: decide
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          python3 .github/scripts/pipeline_decision.py \
            --files changed.txt \
            --branch ${{ github.ref_name }} \
            --output decision.json

          echo "config=$(jq -r .pipeline_config decision.json)" >> $GITHUB_OUTPUT
          echo "skip=$(jq -r '.skip_stages | join(",")' decision.json)" >> $GITHUB_OUTPUT

Диагностика отказа теста (категоризируйте и предложите fix):

def diagnose_test_failure(service: str, test_output: str) -> dict:
    prompt = f"""Диагностируйте CI/CD test отказ для {service}.

Test output:

{test_output[:8000]}


Предоставьте JSON:
{{
    "root_cause": "specific error description",
    "category": "compilation|test-logic|dependency|environment|flaky",
    "fix_suggestion": "specific code/config change",
    "is_flaky": true/false,
    "flaky_reasoning": "test passed in previous 3 runs, timeout-based",
    "priority": "block-merge|warn-only|ignore"
}}

Category определения:
- compilation: syntax error, type error, import error
- test-logic: assertion failure, wrong expected value
- dependency: missing package, version mismatch, network timeout
- environment: missing env var, wrong filesystem path
- flaky: non-deterministic, timeout-based, race condition"""

    response = client.messages.create(
        model="claude-sonnet-4-0",  # Более быстрая модель для quick triаж
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )

    return json.loads(response.content[0].text)

Auto-revert решение (откатитесь на регрессии):

def should_auto_revert(test_failures: list[dict], deployment_info: dict) -> bool:
    """Решите если deployment должен быть auto-reverted на основе test отказов."""

    # Никогда не auto-revert если flaky тесты
    if all(f["is_flaky"] for f in test_failures):
        return False

    # Auto-revert если любые block-merge отказы
    if any(f["priority"] == "block-merge" for f in test_failures):
        return True

    # Auto-revert если error rate увеличился >10% post-deployment
    if deployment_info.get("error_rate_increase", 0) > 0.10:
        return True

    return False

On-Call маршрутизация

PagerDuty интеграция (Events API v2):

import httpx

PAGERDUTY_EVENTS_URL = "https://events.pagerduty.com/v2/enqueue"

def create_pagerduty_incident(alert: Alert, diagnosis: dict):
    payload = {
        "routing_key": "YOUR_INTEGRATION_KEY",
        "event_action": "trigger",
        "payload": {
            "summary": f"{alert.title} - {diagnosis['probable_cause']}",
            "severity": alert.severity.value.lower(),  # p1 → critical
            "source": alert.service,
            "custom_details": {
                "confidence": diagnosis["confidence"],
                "recommended_actions": diagnosis["recommended_actions"],
                "evidence": diagnosis["evidence"],
            }
        }
    }

    response = httpx.post(PAGERDUTY_EVENTS_URL, json=payload)
    return response.json()["dedup_key"]

Классификация severity (LLM определяет P-level):

def classify_incident_severity(alert_text: str, metrics: dict) -> IncidentSeverity:
    prompt = f"""Классифицируйте incident severity (P1/P2/P3/P4).

Alert: {alert_text}
Metrics: {json.dumps(metrics)}

Severity определения:
- P1: Complete service outage, data loss, security breach, >50% error rate
- P2: Major degradation, >10% error rate, critical feature down, <5% users affected
- P3: Minor degradation, <5% error rate, non-critical feature, workaround exists
- P4: Cosmetic issue, logging noise, no user impact

JSON: {{"severity": "P1|P2|P3|P4", "reasoning": "..."}}"""

    response = client.messages.create(
        model="claude-sonnet-4-0",
        max_tokens=256,
        messages=[{"role": "user", "content": prompt}]
    )

    data = json.loads(response.content[0].text)
    return IncidentSeverity[data["severity"]]

Human escalation path (маршрутизируйте по severity и времени):

def determine_escalation_path(severity: IncidentSeverity, hour: int) -> list[str]:
    """Определите кого вызывать на основе severity и времени суток."""

    if severity == IncidentSeverity.P1:
        # Вызовите несколько людей немедленно для P1
        return ["oncall-primary", "oncall-secondary", "team-lead"]
    elif severity == IncidentSeverity.P2:
        # Вызовите primary, эскалируйте secondary после 15 мин
        return ["oncall-primary"]
    elif severity == IncidentSeverity.P3:
        # Вызовите только в рабочие часы
        if 9 <= hour <= 17:
            return ["oncall-primary"]
        else:
            return []  # Создайте инцидент но не вызывайте
    else:  # P4
        return []  # Создайте тикет, без вызова

Производительность и benchmark'и

Примечание: Приведённые ниже цифры являются иллюстративными оценками на основе типичных production-конфигураций, а не измерениями конкретной системы.

Agent response latency:

  • Context gathering (параллельные запросы логов/метрик): 2-5 секунд
  • LLM диагностика (Claude Opus, 8K токенов): 8-15 секунд
  • Общее время incident triаж: 15-25 секунд (vs 15-20 минут вручную)
  • Auto-remediation исполнение: 30-90 секунд (зависит от действия: перезагрузка сервиса vs масштабирование deployment)

Анализ стоимости (за инцидент):

  • Context gathering (без LLM): $0
  • Diagnosis prompt (~6K input, 1K output): ~$0.20 с Claude Opus
  • Follow-up рассуждение (если требуется): ~$0.10
  • Итого за P2 инцидент: ~$0.30 (vs $150 возможность стоимости инженера за 20 мин ручной triаж)

Пропускная способность:

  • Single agent инстанс: 10-15 инцидентов в минуту (параллельное context gathering, sequential LLM calls)
  • Bottleneck: LLM API rate limit'ы (Anthropic: 4000 запросов/мин на tier 4)
  • Горизонтальное масштабирование: Запустите несколько agent replica'ы с shared state в Redis/Postgres

Точность (на основе типичных production agent deployment'ов):

  • Incident severity классификация: Правильно классифицирует P1 vs P2 в большинстве случаев, имеет тенденцию over-escalate edge case'ы (более безопасный default)
  • Root cause диагностика: Определяет вероятную root cause для common failure mode'ов (deployment регрессия, истощение ресурса, отказ зависимости)
  • Auto-remediation успех: Успешно разрешает инциденты matching известным runbook pattern'ам без human вмешательства в типичных случаях

Потребление ресурса:

  • Agent сервис: 512MB RAM, 0.5 CPU baseline, 2 CPU под нагрузкой
  • Log хранилище для контекста: 50MB за инцидент (30 мин фильтрованных логов)
  • Metric хранилище: 5MB за инцидент (1 час time-series данных)

Экономия времени (за type инцидента):

  • P1 инцидент с auto-remediation: 15-20 минут сэкономлено (agent triаж + исполнение runbook vs вручную)
  • P2 инцидент с diagnostic контекстом: 10-15 минут сэкономлено (agent pre-собирает весь контекст)
  • Pipeline отказ диагностика: 5-10 минут сэкономлено (agent категоризирует ошибку, предлагает fix)
  • Post-mortem генерация: 2-3 часа сэкономлено (agent draft'ит из timeline данных)

Reliability метрики:

  • Agent uptime requirement: 99.9% (более критична чем большинство сервисов - обрабатывает все инциденты)
  • Circuit breaker activation rate: Design для <1% инцидентов (agent падает и эскалирует)
  • False positive rate (agent remediate'ит неправильное): Target <0.1% (опасно, реализуйте approval gate'ы)
  • Escalation rate: 30-40% инцидентов эскалируются человеку (agent устанавливает requires_human=true или hit confidence threshold)