English translation is not available yet. Showing Russian content.

Настроить budgeting для команд

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить budgeting для команд

1. Цель задачи

Научиться внедрять систему бюджетных лимитов для AI/ML команд, использующих LLM-сервисы (API, self-hosted, serverless). В результате каждая команда получает ежемесячный лимит расходов на LLM, а инженеры настраивают алерты при достижении 80% использования бюджета. Это позволяет предотвратить неконтролируемый рост cost-ов и оперативно принимать меры.

Ключевой результат Работающий механизм мониторинга расходов на LLM с алертами при 80% утилизации лимита для каждой команды.


2. Исходные данные

Перед началом необходимо иметь:

Что нужноОткуда взять
Список команд и их monthly budgetФинансовый отдел / Product Manager / существующие договорённости
Доступ к логам использования LLM (токены, затраты)API провайдера (OpenAI, Anthropic, Vertex AI) или внутренний gateway
Инфраструктура мониторингаPrometheus + Grafana / Datadog / CloudWatch
Система алертовPagerDuty / Opsgenie / Slack / Email (любой канал)
Идентификатор команды в метаданных запросаЗаголовок запроса (Header: X-Team-Id) или label в metric

Если нет реального LLM-доступа — симулируем:

  1. Установить локальный mock-сервер (Flask), который эмулирует затраты по токенам с заданным тарифом (например, $0.03 за 1K токенов).
  2. Написать скрипт-генератор запросов от имени разных команд, отправляющих запросы к mock-серверу.
  3. Собрать логи затрат в CSV-файл с полями: timestamp, team_id, tokens_used, cost.
  4. Импортировать эти данные в Prometheus через node_exporter с текстовым collector или через Pushgateway.

3. Технологический стек

КомпонентИнструментыНазначение
LLM Gateway / ProxyEnvoy, Kong, или Flask mockПроксирование и логирование запросов
МониторингPrometheus + GrafanaСбор метрик, визуализация, алерты
Система алертовAlertmanager / Grafana Alerting / Slack WebhookОтправка уведомлений при превышении порогов
Хранилище конфигурацийYAML/JSON файлы (команды, лимиты)Базовое управление budget mapping
Pythonpandas, requestsГенерация тестовых запросов, анализ логов
Terraform / Ansible (опционально)Декларативная настройка правил мониторинга

4. Этапы выполнения

Этап 1: Определение команд и лимитов (15-20 минут)

Действия

  1. Составить файл конфигурации team_budgets.yaml со структурой:
    teams:
      - id: "team-alpha"
        name: "Alpha Team"
        monthly_budget_usd: 500
        alert_threshold_pct: 80
        notification_channel: "#alpha-cost"
      - id: "team-beta"
        name: "Beta Team"
        monthly_budget_usd: 1200
        alert_threshold_pct: 80
        notification_channel: "#beta-cost"
    
  2. Создать mapping metric для Prometheus (например, team_monthly_budget{team="team-alpha"} 500). Можно хранить как static config в конфигурации Prometheus (target с __meta).
  3. Определить, как получать team_id из запросов:
    • Если используется Gateway — добавить заголовок X-Team-Id.
    • Если логирование через stdout — распарсить в логах.

Ожидаемый результат этапа Файл team_budgets.yaml с 2-3 командами, тестовые пром-метрики лимитов.


Этап 2: Метрики потребления и накопления (1-2 часа)

Действия

  1. Разработать счетчик затрат (Prometheus Counter) на стороне Gateway:
    # Пример для mock-сервера
    from prometheus_client import Counter, Gauge, generate_latest
    cost_counter = Counter('llm_cost_dollars_total', 'Total LLM cost', ['team'])
    running_cost_gauge = Gauge('llm_monthly_running_cost', 'Running cost this month', ['team'])
    
  2. Экспортировать метрики через HTTP endpoint (/metrics).
  3. Настроить Prometheus на сбор метрик с Gateway:
    scrape_configs:
      - job_name: 'llm-gateway'
        static_configs:
          - targets: ['localhost:8000']
    
  4. Создать Gauge для running cost — пересчитывается каждые 5 минут как сумма за текущий месяц.
  5. Проверить, что метрики появляются в Prometheus (PromQL: llm_cost_dollars_total{team="team-alpha"}).

Ожидаемый результат этапа Prometheus собирает метрики llm_cost_dollars_total и llm_monthly_running_cost для каждой команды.


Этап 3: Установка алертов на 80% utilization (1 час)

Действия

  1. Создать правило алерта в Prometheus (или в Grafana) для каждой команды. Пример PrometheusRule:
    groups:
      - name: llm_budget_alerts
        rules:
          - alert: LLMBudgetWarning
            expr: |
              (llm_monthly_running_cost{team="team-alpha"} / team_monthly_budget{team="team-alpha"}) > 0.8
            for: 5m
            labels:
              severity: warning
            annotations:
              summary: "Команда {{ $labels.team }} использовала {{ $value | humanizePercentage }} бюджета"
    
  2. Добавить team_monthly_budget метрику как static metric (можно через static_config в Prometheus или textfile collector).
  3. Настроить Alertmanager (или Grafana Alerting) для отправки уведомлений в Slack/email.
  4. Создать дашборд в Grafana:
    • Панели: Running cost per team, Budget utilization %, Budget remaining days.
    • Использовать variables для выбора команды.

Ожидаемый результат этапа Алерт срабатывает при достижении 80% использования бюджета (можно проверить тестовым запуском, сгенерировав трафик до порога).


Этап 4: Тестирование и верификация (45-60 минут)

Действия

  1. Сгенерировать нагрузку от каждой команды до 75-85% использования бюджета. Например, скрипт:
    import requests
    team = "team-alpha"
    url = "http://localhost:8000/chat"
    for i in range(100):
        requests.post(url, json={"prompt": "test", "team": team})
    
  2. Проверить, что метрики llm_monthly_running_cost обновляются.
  3. Довести трафик до 80%+: увеличить количество запросов для одной команды.
  4. Подтвердить получение алерта в канале Slack (или email).
  5. Проверить, что другие команды алерт не получили (false positive).

Ожидаемый результат этапа Алерт приходит только при превышении 80% лимита конкретной команды; метрики корректны.


Этап 5: Документирование и автоматизация (30-45 минут)

Действия

  1. Написать README к конфигурации: как добавить новую команду, изменить лимит, изменить порог алерта.
  2. Упаковать всю конфигурацию (Prometheus rule, dashboard JSON, скрипт генерации) в Git-репозиторий.
  3. Добавить IaC (терраформ или ansible) для воспроизводимости (опционально).
  4. Провести ревью с коллегами (имитация code review).

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


5. Критерии приемки (Definition of Done)

  • В Prometheus собираются метрики llm_monthly_running_cost{team=...} и team_monthly_budget{team=...}.
  • В Grafana настроен дашборд с utilisation в % для каждой команды.
  • Правило алерта создано и активно; при utilisation >80% срабатывает оповещение.
  • Уведомление приходит в канал Slack (или другой канал) с указанием команды и процента.
  • Скрипт-генератор нагрузки позволяет симулировать достижение порога.
  • Конфигурация команды хранится в одном файле (например, team_budgets.yaml) и легко изменяется.
  • Документация описывает процесс добавления новой команды менее чем за 5 минут.
  • Проведён тест, в результате которого алерт сработал, а для соседней команды (с utilisation <80%) алерт не пришёл.

6. Ожидаемый результат

Основной артефакт Папка llm-budget-monitoring/, содержащая:

  • team_budgets.yaml — конфигурация команд и лимитов.
  • prometheus_rules.yml — правило алерта.
  • dashboard.json — дашборд Grafana (экспортированный).
  • mock_gateway.py — mock-сервер с метриками.
  • load_generator.py — скрипт для тестовой нагрузки.
  • README.md — инструкция по установке и добавлению команд.

Опционально Инфраструктурный код (Terraform/Docker Compose) для развёртывания Prometheus + Grafana + Alertmanager + Slack bot.


7. Возможные сложности и их решение

СложностьРешение
Нет реального GatewayИспользовать Flask mock, добавив Prometheus client.
Команды не указывают team_id при запросеВвести обязательный заголовок X-Team-Id на уровне Gateway или парсить API ключ.
Бюджет может меняться каждый месяцХранить budget как Gauge метрику с ручным редеплоем конфига или через API.
Алерты не приходят в SlackПроверить Webhook URL, добавить for: 5m чтобы избежать flapping.
Сумма running cost сбрасывается в конце месяцаИспользовать counters и reset в конце месяца; для gauge — вычислять через sum_over_time.
Много команд — сложно поддерживать файлДобавить простой веб-интерфейс (Flask) для CRUD операций с командами, который генерирует конфиг автоматически.

8. Бюджет времени (оценка)

ЭтапВремя
Этап 1: Определение команд и лимитов15-20 мин
Этап 2: Метрики потребления и накопления1-2 часа
Этап 3: Установка алертов на 80% utilization1 час
Этап 4: Тестирование и верификация45-60 мин
Этап 5: Документирование и автоматизация30-45 мин
Итого3,5 – 5 часов

Примечание: При первом выполнении может потребоваться до 6 часов из-за настройки окружения (Docker, Prometheus, Grafana). Используйте готовые docker-compose образы для ускорения.


9. Связанные вопросы из базы знаний

ВопросТема
42Основы Prometheus: Counter vs Gauge
103Настройка Alertmanager и Slack webhook
188Мониторинг затрат на LLM через custom metrics
271Инструменты cost tracking для AI/ML
315Бюджетирование и forecast в облачных сервисах
410PromQL: функции sum, rate, increase, histogram_quantile
522Конфигурация Grafana dashboards as code
638Способы агрегации логов LLM gateway
744Планирование лимитов и алертов для serverless функций
889Интеграция PagerDuty с Prometheus Alertmanager

10. Чек-лист самопроверки

  • Я создал файл team_budgets.yaml с тестовыми командами и лимитами.
  • Я написал mock-сервер, который экспортирует Prometheus метрики llm_cost_dollars_total и llm_monthly_running_cost.
  • Я настроил Prometheus для сбора метрик с mock-сервера.
  • Я создал правило алерта на использование >80% бюджета и проверил, что оно срабатывает.
  • Я настроил нотификацию в Slack (или другой канал) и убедился, что уведомление содержит имя команды и процент.
  • Я написал дашборд в Grafana с utilisation per team.
  • Я сгенерировал нагрузку и убедился, что алерт приходит для верной команды.
  • Я задокументировал процесс добавления новой команды (5 шагов).
  • Я упаковал все конфигурации в Git-репозиторий.
  • Я провёл тест с командой, чей utilisation <80%, — алерт не пришёл.