SSD Nodes Learn Hosting plans →
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-10-22

Как отслеживать расходы в Claude Code: сравнение методов

Сравните локальные парсеры логов, встроенную панель Anthropic и OpenTelemetry для контроля затрат. Узнайте, почему эти инструменты показывают разные данные и что они упускают.

Что на самом деле считывает трекер расходов Claude Code

Каждый трекер расходов Claude Code считывает данные из одного из трех источников, и именно источник определяет, на какие вопросы он может ответить. Парсер логов считывает файлы транскриптов сессий на вашем локальном диске. Панель мониторинга (dashboard) считывает записи об использовании, которые Anthropic хранит для вашей учетной записи или организации. Бэкенд метрик считывает поток OpenTelemetry (OTel), который Claude Code генерирует при включении. Все три источника могут быть верными одновременно и при этом показывать разные данные, так как они учитывают разные параметры.

В этом руководстве не приводится повторное объяснение токенов. В разделе как Claude Code подсчитывает использование токенов рассматриваются входные и выходные данные, а также запись и чтение кэша; без понимания этой части панель мониторинга не даст полной картины. Вопрос здесь более узкий: что видит каждый тип инструмента и чего он не может увидеть ни при каких обстоятельствах.

Почему в один день появилось три трекера расходов для Claude Code

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

Они появились одновременно, потому что стоимость агентской сессии перестала быть очевидной. Обычный чат стоит примерно столько, сколько вы видите на экране. Агент читает двадцать файлов, запускает набор тестов и при каждом шаге повторно отправляет всю историю переписки, поэтому счет формируется контекстом, который вы никогда не вводили вручную. При наличии подписки сумма в долларах за сессию, которую показывает Claude Code, является лишь оценкой, которая, по заявлению Anthropic, не имеет отношения к реальному биллингу. Единственный важный показатель — это индикатор использования, который в некоторые дни пустеет быстрее, чем в другие. Каждый из трех инструментов закрывает разные аспекты этого пробела.

Вариант 1: локальный парсер логов для оценки стоимости за день

Claude Code сохраняет каждую беседу в формате JSON Lines (JSONL) по пути ~/.claude/projects/<project>/<session-id>.jsonl, где <project> — это путь к вашей рабочей директории, в котором все небуквенно-цифровые символы заменены на -. Каждый ответ ассистента в этом файле содержит количество токенов для соответствующего запроса. Парсер логов суммирует эти значения и рассчитывает стоимость.

ccusage — это инструмент, который выбирает большинство пользователей. Он не требует установки:

npx ccusage@latest daily
npx ccusage@latest daily --breakdown
npx ccusage@latest blocks
npx ccusage@latest session --json

daily выводит общую сумму по датам. --breakdown разделяет каждую строку по моделям; так можно выяснить, что один день работы с Opus составляет большую часть недельных затрат. blocks группирует данные по пятичасовому окну, в котором происходит сброс лимитов подписки. session суммирует затраты по каждой беседе, а daily --instances группирует их по проектам, чтобы вы могли увидеть, какой репозиторий обходится дороже всего. Добавьте --since и --until, чтобы ограничить диапазон дат, и используйте npx ccusage@latest daily --help для указания формата даты, который ожидает ваша версия. По состоянию на октябрь 2026 года инструмент также считывает логи других CLI-агентов, включая Codex и OpenCode, что важно для их сравнения.

Ценообразование основано на таблице стоимости моделей, и инструмент поддерживает три режима расчета затрат. --mode auto использует значение costUSD, записанное Claude Code в файл (если оно присутствует), и выполняет расчет на основе количества токенов, если его нет. --mode calculate всегда выполняет расчет на основе токенов и игнорирует любые записанные данные о стоимости. --mode display отображает только записанные затраты и выводит $0.00 для строк, где они отсутствуют. Если итоговая сумма кажется неверной, запустите один и тот же отчет с флагом calculate, а затем с display. Большая разница между ними означает, что в большинстве записей отсутствует сохраненная стоимость, поэтому все, что вы видите — это оценка. Если вы работаете по контрактным тарифам, pricingOverrides в разделе defaults конфигурационного файла ccusage.json позволит заменить стандартные цены для отдельных моделей.

Те же данные можно использовать в ваших промптах. ccusage statusline выводит компактную строку для статус-бара Claude Code, которая подключается к ~/.claude/settings.json так же, как и любая другая команда для статус-строки. См. создание статус-строки для Claude Code для настройки блока параметров и списка полей, которые она получает.

Парсер логов не видит того, что происходило на других устройствах. Второй ноутбук, сессия на claude.ai, работа коллеги: эти транскрипты хранятся на соответствующих дисках. Старые данные также отсутствуют, так как транскрипты по умолчанию удаляются через 30 дней согласно настройке cleanupPeriodDays, поэтому данные за прошлый квартал недоступны, если вы их не архивировали.

Существует еще один риск, и он носит структурный характер. В документации Anthropic указано, что формат записей является внутренним для Claude Code и меняется от версии к версии, поэтому скрипты, напрямую парсящие эти файлы, могут сломаться после любого обновления. Это относится к любому инструменту такого типа. Именно поэтому самописная однострочная команда jq для обработки JSONL — плохая идея: поддерживаемые парсеры отслеживают изменения формата за вас, а ваша команда будет выдавать уверенно неверные цифры в тот день, когда поле будет переименовано.

Наконец, денежное выражение требует пояснения в контексте подписки. Использование ресурсов в рамках лимитов вашего плана Pro или Max не тарифицируется по токенам, поэтому полученная цифра показывает, сколько стоили бы ваши токены по стандартным API-тарифам. Это показатель интенсивности использования, а не ваш реальный счет. Исключение составляют кредиты на использование: если вы их активируете, использование сверх лимита плана оплачивается по стандартным API-тарифам как отдельный платеж, а claude.ai отображает расходы за месяц в разделе Settings > Usage. Если вам нужно понять, какой план выбрать, это отдельная задача: см. сравнение биллинга API и подписки Claude.

Форма 2: встроенные экраны использования показывают, какая модель израсходовала бюджет

Claude Code поставляется с собственными средствами отчетности, которые большинство пользователей никогда не открывают. Выполните /usage во время сессии. Блок Session в верхней части отображает количество токенов по моделям и денежную сумму для текущей сессии. Она рассчитывается локально на основе количества токенов по стандартным тарифам, если администратор не задал таблицу modelPricing в управляемых настройках; в этом случае строка Total cost будет содержать at your organization's configured rates. В любом случае эта цифра является оценочной и может отличаться от вашего счета. Для планов Pro или Max компания Anthropic указывает, что эти данные не имеют отношения к биллингу, так как использование уже включено в план. Итоговые значения сбрасываются, когда /clear начинает новый диалог.

В планах Pro, Max, Team или Enterprise с оплатой за рабочее место этот же экран показывает, какая часть лимита плана уже использована. В планах Enterprise с оплатой по факту использования нет включенного объема, который может закончиться, так как каждый токен оплачивается по тарифам API. В этих планах экран также распределяет недавнее использование по навыкам, субагентам, плагинам и отдельным MCP-серверам в процентах от общего объема. Он отмечает действия, на которые приходится 10% или более недавнего использования, например, длинный контекст или промахи кэша. Нажмите d или w для переключения между данными за последние 24 часа и последние 7 дней. Эти цифры являются приблизительными и вычисляются на основе локальной истории сессий на данном устройстве, поэтому использование на втором устройстве не учитывается. Когда индикатор пуст, а не просто находится на низком уровне, экран сообщает, что окно использования закрыто, но не дает инструкций, как продолжить работу. Вопрос о том, что делать после достижения лимита, решается отдельно в зависимости от модели, контекста и плана.

Если в команде больше одного разработчика, данные переносятся на уровень аккаунта. Организация с API получает доступ к странице использования в консоли, панели управления Claude Code с расходами и количеством принятых строк на каждого участника, а также к Claude Code Analytics API, который возвращает те же ежедневные метрики по пользователям с помощью ключа администратора. Планы Teams и Enterprise получают отчет о расходах в консоли администратора с возможностью экспорта в CSV, который обновляется ежедневно, но он охватывает только расходы сверх кредитов: использование в рамках лимита рабочего места в долларах не учитывается. В Enterprise доступен дополнительный API аналитики. То, какой из этих отчетов вы увидите, зависит от способа входа каждого разработчика, поэтому в смешанной организации приходится просматривать два отчета и суммировать их вручную.

Для планирования бюджета можно использовать опубликованные Anthropic данные по стоимости на октябрь 2026 года: средний показатель составляет около $13 на разработчика в активный день и от $150 до $250 на разработчика в месяц, при этом 90% пользователей тратят менее $30 в активный день. Рассматривайте это как опубликованный ориентир для корпоративных внедрений, а не как прогноз для вашей команды. Запустите пилотную группу и проведите измерения, прежде чем делать экстраполяцию.

Панели управления не видят детализацию ниже уровня дня и конкретного человека. Они покажут, что во вторник основной нагрузкой была модель Opus. Они не скажут, какой именно промпт, репозиторий или CI-задача стали причиной этого. Кроме того, отчеты имеют задержку, так как данные по организации обновляются раз в сутки, поэтому они являются инструментом для ретроспективного анализа, а не способом остановить вышедшего из-под контроля агента прямо сейчас. Для предотвращения неконтролируемого расхода нужны лимиты, а не отчеты, что является темой раздела ограничение расходов агента на VPS.

Ваш собственный стек OpenTelemetry позволяет определить, какой промпт вызвал регрессию

Claude Code генерирует метрики и события OpenTelemetry после установки одной переменной окружения. Это единственный способ передавать данные о токенах и расходах на каждого пользователя в систему под вашим контролем практически в реальном времени. Метрики включают claude_code.cost.usage в USD, claude_code.token.usage в токенах, claude_code.session.count и claude_code.active_time.total.

Метрика токенов наиболее показательна благодаря своим атрибутам. Каждая точка данных содержит type, который может быть input, output, cacheRead или cacheCreation, а также model и query_source, которые могут принимать значения main, subagent или auxiliary. Она также содержит agent.name, skill.name, mcp_server.name и mcp_tool.name. Имена MCP-серверов, которые вы настроили самостоятельно, и ваших собственных пользовательских субагентов передаются как custom, если вы не установите OTEL_LOG_TOOL_DETAILS=1, что также добавляет Bash-команды и входные данные инструментов в события инструментов. Этого достаточно, чтобы ответить на вопросы, недоступные стандартным дашбордам: какая часть счета приходится на субагентов, а не на ваши собственные запросы; не привел ли один MCP-сервер к удвоению входных токенов; не сократилось ли количество чтений из кэша после того, как кто-то отредактировал CLAUDE.md. Поведение кэша — это обычно то место, где скрываются неожиданности, а в когда кэширование промптов окупается объясняется, на что именно стоит обратить внимание.

Стоит внести одно уточнение, так как этот вопрос возникает в каждой ветке обсуждения. Langfuse — это хороший бэкенд для трассировки с возможностью self-hosting, и его развертывание на VPS описано в self-hosting Langfuse для трассировки агентов. Его OTLP-эндпоинт принимает только трейсы (spans). По умолчанию Claude Code экспортирует метрики и события логов, а не спаны, поэтому указание OTEL_EXPORTER_OTLP_ENDPOINT на Langfuse оставит проект пустым и не выдаст понятной ошибки. Экспорт спанов существует, но он находится в бета-версии и отключен, пока вы не установите CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 и OTEL_TRACES_EXPORTER. Собственная интеграция Langfuse для Claude Code работает иначе: хук Stop или плагин, который его устанавливает, считывает транскрипты сессии после каждого ответа и преобразует их в трейсы, поэтому он имеет те же ограничения, что и локальный парсер логов. Langfuse — подходящий инструмент для агентов, которые вы создаете на базе API самостоятельно, где ваш собственный код создает каждый спан с указанием промпта, модели и стоимости. Для отслеживания общих расходов через CLI Claude Code лучше использовать хранилище метрик.

Настройка отслеживания расходов Claude Code на собственном VPS

Достаточно двух сервисов: коллектора для сбора метрик и Prometheus для их хранения. Ограничьте доступ к обоим из публичной сети, так как открытый порт OTLP принимает записи от любого, кто его обнаружит. Создайте /opt/ccmetrics/compose.yaml:

services:
  collector:
    image: otel/opentelemetry-collector-contrib:latest
    command: ["--config=/etc/otel/config.yaml"]
    volumes:
      - ./collector.yaml:/etc/otel/config.yaml:ro
    ports:
      - "10.8.0.1:4318:4318"
    restart: unless-stopped
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prom-data:/prometheus
    ports:
      - "127.0.0.1:9090:9090"
    restart: unless-stopped

volumes:
  prom-data:

10.8.0.1 — это адрес сервера внутри туннеля WireGuard, поэтому коллектор доступен только с ваших машин и ниоткуда больше. Адрес перед портом здесь критически важен, так как опубликованные порты Docker не фильтруются через ufw: см. почему опубликованные порты Docker обходят ufw. Настройка самого туннеля описана в настройка WireGuard VPN на собственном VPS.

/opt/ccmetrics/collector.yaml:

receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:

exporters:
  prometheus:
    endpoint: 0.0.0.0:8889

service:
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus]

/opt/ccmetrics/prometheus.yml. Порт 8889 не публикуется на хост, так как Prometheus обращается к коллектору через сеть Compose по имени сервиса:

global:
  scrape_interval: 30s

scrape_configs:
  - job_name: claude-code
    static_configs:
      - targets: ["collector:8889"]
cd /opt/ccmetrics
docker compose up -d
docker compose logs collector

Лог коллектора должен заканчиваться строкой Everything is ready. Begin running and processing data.. Если лог обрывается на ошибке конфигурации, значит, YAML не прошел парсинг, и контейнер будет перезапускаться в цикле.

Теперь укажите на него Claude Code. На каждой машине, где запущен Claude Code, добавьте следующее в ~/.claude/settings.json:

{
  "env": {
    "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
    "OTEL_METRICS_EXPORTER": "otlp",
    "OTEL_LOGS_EXPORTER": "none",
    "OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf",
    "OTEL_EXPORTER_OTLP_ENDPOINT": "http://10.8.0.1:4318",
    "OTEL_METRIC_EXPORT_INTERVAL": "10000"
  }
}

Запустите сессию, отправьте один запрос, подождите интервал экспорта (здесь 10 секунд, по умолчанию 60 секунд), затем запросите у Prometheus полученные данные:

curl -s http://localhost:9090/api/v1/label/__name__/values | grep -o 'claude_code[a-z_]*'

Вы должны получить несколько имен, начинающихся с claude_code_. Экспортер заменяет точки на подчеркивания и добавляет единицы измерения, поэтому точные строки зависят от версии вашего коллектора. Пустой результат означает, что данные не поступили. Проверьте соответствие протокола и порта, так как http/protobuf использует 4318, а grpc использует 4317; несоответствие приводит к тихой ошибке. Выполните claude --debug-file /tmp/claude-debug.log и поищите в этом файле строки [3P telemetry]: именно там Claude Code сообщает об ошибках экспорта OTel.

Для одной машины без сервера пропустите всё вышеперечисленное. Установите OTEL_METRICS_EXPORTER=prometheus, и Claude Code сам откроет endpoint для сбора данных по адресу http://localhost:9464/metrics. Когда prometheus является единственным указанным экспортером, Claude Code опускает единицы измерения USD, tokens и s из экспортируемых метрик, чтобы данные оставались в валидном текстовом формате Prometheus. Имена метрик не меняются, а настройка, объединяющая экспортеры, например otlp,prometheus, сохраняет единицы измерения.

С такой конфигурацией связан один вопрос конфиденциальности. По умолчанию с машины уходят только счетчики и метаданные, без текста промптов и вывода инструментов. OTEL_LOG_USER_PROMPTS=1 добавляет текст промпта в экспортируемые события, а OTEL_LOG_TOOL_CONTENT=1 добавляет вывод инструментов в трассировочные спаны. Таким образом, как только вы начнете экспортировать любой из этих сигналов, ваш сервер телеметрии будет хранить исходный код и всё, что находилось в контексте. Включайте эти параметры осознанно и сначала ознакомьтесь с как не допустить попадания секретов в контекст агента.

Отслеживание расходов для скриптовых запусков и CI

Неинтерактивные запуски часто становятся неожиданностью, так как никто не следит за экраном. claude -p с помощью --output-format json сообщает стоимость такого запуска в полезной нагрузке результата:

claude -p "summarise the failing tests" --output-format json | jq '.total_cost_usd'

Полезная нагрузка содержит total_cost_usd и детализацию по каждой модели, поэтому CI-задача может записывать собственные расходы без использования панели мониторинга. Как и любой локальный показатель, это клиентская оценка. Если запуск продолжает диалог с --continue или --resume, отчет будет содержать общую сумму для всего диалога, включая предыдущие запуски. Добавьте полученное значение в файл или отправьте его как метрику в коллектор, упомянутый выше. Это самый дешевый способ отслеживания расходов, который требует всего один вызов jq на каждый запуск.

Режимы сбоев и что вы увидите

Отчет пуст. npx ccusage@latest daily отсутствие строк в выводе означает, что программа не считывает данные из места, куда пишет Claude Code. CLAUDE_CONFIG_DIR меняет это расположение, и парсер должен быть уведомлен об этом изменении. Если строки существуют, но обрываются примерно месяц назад, это cleanupPeriodDays работает согласно проекту: транскрипты по умолчанию удаляются через 30 дней.

Две машины показывают разные итоговые значения. Это ожидаемое поведение, а не ошибка. И /usage, и любой парсер логов считывают только локальную историю сессий, поэтому данные об использовании с другого устройства или из claude.ai отсутствуют в обоих случаях.

Локальный итог не совпадает со счетом. Локальные показатели рассчитываются на основе количества токенов по стандартным тарифным ставкам, если вы не настроили контрактные тарифы: таблицу modelPricing в управляемых настройках для /usage или pricingOverrides для ccusage. При наличии подписки использование в рамках лимита плана не тарифицируется за каждый токен, а учитываются только кредиты на использование. Страница использования в Console является достоверным источником для биллинга API.

Стоимость выросла при выполнении той же работы. Прежде всего проверьте столбцы кэша. Длительная сессия повторно отправляет всю свою историю на каждом шаге; она тарифицируется по ставке кэширования, пока кэш активен, и по полной ставке за ввод, когда он становится неактуальным, поэтому один длительный перерыв приводит к повторной обработке всей беседы. Это отображается как большое число входных токенов рядом с малым числом выходных, а ценообразование входных и выходных токенов объясняет, почему эти показатели меняются независимо друг от друга.

День с использованием субагентов выглядит неправдоподобно. Каждый субагент использует собственное окно контекста, поэтому потребление токенов масштабируется в зависимости от того, сколько субагентов было запущено и как долго работал каждый из них. В рамках плана атрибуция /usage показывает долю субагентов для этой машины в процентах. Для получения детализации по каждому запросу данные OTel разделяют их с помощью атрибута query_source в claude_code.token.usage. Парсер логов покажет вам только итоговое значение, оставив детали за рамками анализа.

FAQ

Показывает ли ccusage сумму, которую с меня спишут по тарифу Max?

Нет. Использование ресурсов в рамках лимита подписки не тарифицируется по количеству токенов, поэтому парсер логов рассчитывает стоимость токенов по стандартным API-тарифам. Это позволяет оценить нагрузку за день и сравнить интенсивность использования разных проектов или моделей. Актуальные данные о расходах доступны на странице Console: API-биллинг отображается в разделе использования, а подписка — на странице биллинга плана. Если у вас включены кредиты, использование сверх лимита оплачивается по стандартным API-тарифам, а расходы в claude.ai отображаются в разделе Settings > Usage.

Где Claude Code хранит файлы сессий, которые считывают эти инструменты?

В ~/.claude/projects/<project>/<session-id>.jsonl, где <project> — это путь к рабочей директории, в котором все небуквенно-цифровые символы заменены на -. Каждая строка представляет собой JSON-объект с данными об одном сообщении, вызове инструмента или метаданными. CLAUDE_CONFIG_DIR перемещает весь каталог, а cleanupPeriodDays в settings.json управляет 30-дневным сроком хранения. Anthropic определяет формат записей как внутренний, поэтому он может меняться в разных версиях. Используйте для парсинга поддерживаемый инструмент, а не собственные скрипты.

Можно ли отправлять телеметрию Claude Code в Langfuse?

Не через стандартную телеметрию. Конечная точка Langfuse OTLP принимает трассировки, а Claude Code по умолчанию экспортирует метрики и события логов, а не спаны, поэтому данным некуда поступать. Экспорт спанов находится в стадии бета-тестирования и требует включения. Интеграция Langfuse для Claude Code использует хук Stop, который преобразует транскрипты сессий в трассировки. Для отслеживания общих расходов отправляйте метрики Claude Code в коллектор OpenTelemetry и храните их в Prometheus. Используйте Langfuse для агентов, созданных вами на базе API, где ваш код самостоятельно генерирует спаны с информацией о промпте, модели и стоимости.

Почему мои локальные расчеты не совпадают с данными на странице использования в Console?

Потому что они вычисляются по-разному. /usage и парсеры логов суммируют количество токенов из файлов сессий на локальной машине и оценивают их по стандартным тарифам (если не настроены контрактные цены через modelPricing в управляемых настройках для /usage или pricingOverrides для ccusage). Console показывает сумму, которая была фактически списана с вашей организации по всем машинам и ключам, с учетом всех скидок. Несоответствие — это норма. Значительная разница обычно означает, что с того же аккаунта работает другое устройство, CI-раннер или другой участник команды.

Как отследить стоимость запуска claude -p в CI?

Запустите его с флагом --output-format json и считайте total_cost_usd из результата, например, с помощью claude -p "..." --output-format json | jq '.total_cost_usd'. Тот же payload содержит разбивку по моделям и ID сессии. Записывайте это значение для каждого задания, чтобы получать данные о расходах на конвейер без использования агентов, дашбордов или дополнительных сервисов.

Была ли эта статья полезной?