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-доступа — симулируем:
- Установить локальный mock-сервер (Flask), который эмулирует затраты по токенам с заданным тарифом (например, $0.03 за 1K токенов).
- Написать скрипт-генератор запросов от имени разных команд, отправляющих запросы к mock-серверу.
- Собрать логи затрат в CSV-файл с полями: timestamp, team_id, tokens_used, cost.
- Импортировать эти данные в Prometheus через node_exporter с текстовым collector или через Pushgateway.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| LLM Gateway / Proxy | Envoy, Kong, или Flask mock | Проксирование и логирование запросов |
| Мониторинг | Prometheus + Grafana | Сбор метрик, визуализация, алерты |
| Система алертов | Alertmanager / Grafana Alerting / Slack Webhook | Отправка уведомлений при превышении порогов |
| Хранилище конфигураций | YAML/JSON файлы (команды, лимиты) | Базовое управление budget mapping |
| Python | pandas, requests | Генерация тестовых запросов, анализ логов |
| Terraform / Ansible (опционально) | — | Декларативная настройка правил мониторинга |
4. Этапы выполнения
Этап 1: Определение команд и лимитов (15-20 минут)
Действия
- Составить файл конфигурации 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" - Создать mapping metric для Prometheus (например,
team_monthly_budget{team="team-alpha"} 500). Можно хранить как static config в конфигурации Prometheus (target с__meta). - Определить, как получать team_id из запросов:
- Если используется Gateway — добавить заголовок
X-Team-Id. - Если логирование через stdout — распарсить в логах.
- Если используется Gateway — добавить заголовок
Ожидаемый результат этапа Файл team_budgets.yaml с 2-3 командами, тестовые пром-метрики лимитов.
Этап 2: Метрики потребления и накопления (1-2 часа)
Действия
- Разработать счетчик затрат (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']) - Экспортировать метрики через HTTP endpoint (
/metrics). - Настроить Prometheus на сбор метрик с Gateway:
scrape_configs: - job_name: 'llm-gateway' static_configs: - targets: ['localhost:8000'] - Создать Gauge для running cost — пересчитывается каждые 5 минут как сумма за текущий месяц.
- Проверить, что метрики появляются в Prometheus (PromQL:
llm_cost_dollars_total{team="team-alpha"}).
Ожидаемый результат этапа Prometheus собирает метрики llm_cost_dollars_total и llm_monthly_running_cost для каждой команды.
Этап 3: Установка алертов на 80% utilization (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 }} бюджета" - Добавить team_monthly_budget метрику как static metric (можно через
static_configв Prometheus илиtextfilecollector). - Настроить Alertmanager (или Grafana Alerting) для отправки уведомлений в Slack/email.
- Создать дашборд в Grafana:
- Панели: Running cost per team, Budget utilization %, Budget remaining days.
- Использовать variables для выбора команды.
Ожидаемый результат этапа Алерт срабатывает при достижении 80% использования бюджета (можно проверить тестовым запуском, сгенерировав трафик до порога).
Этап 4: Тестирование и верификация (45-60 минут)
Действия
- Сгенерировать нагрузку от каждой команды до 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}) - Проверить, что метрики
llm_monthly_running_costобновляются. - Довести трафик до 80%+: увеличить количество запросов для одной команды.
- Подтвердить получение алерта в канале Slack (или email).
- Проверить, что другие команды алерт не получили (false positive).
Ожидаемый результат этапа Алерт приходит только при превышении 80% лимита конкретной команды; метрики корректны.
Этап 5: Документирование и автоматизация (30-45 минут)
Действия
- Написать README к конфигурации: как добавить новую команду, изменить лимит, изменить порог алерта.
- Упаковать всю конфигурацию (Prometheus rule, dashboard JSON, скрипт генерации) в Git-репозиторий.
- Добавить IaC (терраформ или ansible) для воспроизводимости (опционально).
- Провести ревью с коллегами (имитация 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% utilization | 1 час |
| Этап 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 в облачных сервисах |
| 410 | PromQL: функции 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%, — алерт не пришёл.