Перейти к содержимому

Рецепт: бюджеты и ограждения FinOps

Бюджеты FinOps и анализ расходов доступны в Business. Community сохраняет учёт затрат по сеансам и экспорт данных. Бюджеты, сохранённые до 0.1, можно читать и удалять; они продолжают применяться, пока модуль FinOps включён. Community не может создавать или изменять бюджеты. Оценки и песочницы остаются в Community.

Цель: “агенты этой команды перестают тратить при $500/месяц” — объявлено один раз, применяется вживую, с порогами оповещений по пути вверх.

Применение бюджета — одна из актуаций, которая жива в бинарнике по умолчанию: применяющий бюджет на своём лимите отказывает в расходе без дополнительного провижининга (каталог модулей помечает её как v1 | v1).

Окно терминала
curl -ks -X POST "$BASE/v1/m/finops/budgets" \
-H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \
-H 'Content-Type: application/json' \
-d '{
"dimension": "team",
"key": "payments",
"limit_micro_usd": 500000000,
"period": "monthly",
"thresholds": [0.5, 0.8, 1.0],
"action": "block"
}'
  • Деньги — в микро-USD (limit_micro_usd: 500000000 = $500), так что в контракте нет неоднозначности с плавающей точкой.
  • dimension + key определяют область бюджета. Областные измерения включают global, model, provider, agent, session, team, project, workspace, api_key, actor, service_tier, context_window, inference_geo, gateway и identity.
  • action — это режим применения:
action На лимите
alert (по умолчанию) только показ — оповещения срабатывают, ничего не отклоняется
throttle шов актуации замедляет новые расходы
block шов актуации отклоняет новые расходы

dimension: "identity" задаёт область по внешнему идентификатору твёрдой личности реестра — личности рабочей нагрузки или агента, зарегистрированной вашими источниками личности:

{ "dimension": "identity", "key": "spiffe://corp/agent/billing-reconciler",
"limit_micro_usd": 50000000, "period": "monthly", "action": "throttle" }

Личность разрешается при приёме затрат из привязки агента сэмпла, API-ключа или актора — так что бюджет следует за личностью через поверхности, а не за одним API-ключом.

Окно терминала
# Live consumption vs limit, with run-rate projection:
curl -ks "$BASE/v1/m/finops/budgets/$BUDGET_ID/status" \
-H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT"
# Threshold crossings (your 50% / 80% / 100% alerts):
curl -ks "$BASE/v1/m/finops/alerts" \
-H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT"

На лимите проверка применяющего бюджета возвращает allowed: false с действием (throttle или block) и сработавшим бюджетом — отказ называет свою причину. Оповещения также идут по потоку уведомлений, так что назначение Slack или PagerDuty услышит пересечение 80% до отказа на 100%.

В консоли Budgets показывает расход относительно каждого лимита с прогнозом по текущему темпу.

Стоимость-на-результат — это то, что делает бюджет деловым разговором. Сообщайте о результатах (решённая заявка, влитый PR, закрытое дело) и читайте панели ценности:

Окно терминала
curl -ks -X POST "$BASE/v1/m/finops/outcomes" \
-H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \
-d '{"kind":"ticket.resolved","subject_ref":"agent:support-triage","count":1}'
curl -ks "$BASE/v1/m/finops/value" \
-H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT"

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

  • Отказ, когда книгу не удаётся прочитать: если допуск по бюджету нельзя установить (FinOps не может прочитать свою книгу), прокси вывода отклоняет вызов с 503, причиной budget store unreachable (deny-closed) и x-should-retry: false, а не пропускает неизмеренную трату. Среди собственных шлюзов движка настраиваемую позицию для этого случая сохраняет только запуск сессии (OLIVARES_SESSION_BUDGET_AVAILABILITY).
  • Зарезервированная ёмкость (reserved_micro_usd) засчитывается в лимит, так что бюджет нельзя обойти предварительным бронированием.
  • cost_type намеренно не является измерением бюджета — строки с оценочным откатом (estimated-fallback) идут по тому измерению, которому принадлежат, а не образуют параллельный пул.