Трекеры расходов Claude Code: сравнение методов
Сравните парсеры локальных журналов, встроенные экраны использования и стек OpenTelemetry: они считают разные показатели и отвечают на разные вопросы.
Что на самом деле считывает трекер расходов Claude Code
Каждый трекер расходов Claude Code считывает один из трёх источников данных. Источник определяет, на какой вопрос он может ответить. Парсер журналов считывает файлы с расшифровками сеансов на вашем диске. Дашборд считывает записи об использовании, которые Anthropic хранит для вашей учётной записи или организации. Система метрик считывает поток OpenTelemetry (OTel), который Claude Code передаёт после включения этой функции. Все три источника могут быть корректными одновременно и при этом показывать разные значения, поскольку они считают разные показатели.
В этом руководстве токены повторно не рассматриваются. В материале как Claude Code считает использование токенов описаны входные и выходные токены, записи в кэш и чтения из кэша. Без понимания этой части любой дашборд мало что объясняет. Здесь рассматривается более узкий вопрос: что может видеть каждый тип инструмента и чего он никогда не сможет увидеть.
Почему в один день появились три трекера расходов Claude Code
В один день опубликовали три отдельных трекера расходов Claude Code. Это были не три версии одного инструмента, и именно это важно. Один анализировал локальные файлы сессий. Другой обрабатывал экраны использования аккаунта. Третий был размещаемым backend для трассировки, который вы запускаете самостоятельно.
Они появились одновременно, потому что стоимость сеанса агента перестала быть очевидной. Стоимость чата примерно соответствует тому, что отображается на экране. Агент читает двадцать файлов, запускает набор тестов и повторно отправляет весь диалог при каждом ходе, поэтому счёт формируется за счёт контекста, который вы не вводили. При подписке долларовая сумма вообще не отображается: есть только индикатор использования, который в одни дни заполняется быстрее, чем в другие. Каждый из трёх инструментов закрывает отдельную часть этого пробела.
Форма 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 --jsondaily группирует данные по датам. --breakdown разделяет каждую строку по моделям. Так можно определить, что один день с Opus составляет большую часть расходов за неделю. blocks группирует данные по пятичасовому окну, после которого подписка сбрасывается. session подсчитывает данные по каждому диалогу, а --instances группирует их по проектам, чтобы показать, какой репозиторий обходится дороже. Добавьте --since и --until, чтобы ограничить диапазон, и выполните npx ccusage@latest daily --help, чтобы узнать формат даты, который ожидает ваша версия. По состоянию на August 2026 инструмент также читает данные других CLI для AI-агентов, включая Codex и OpenCode. Это важно, если вы сравниваете их.
Стоимость берётся из таблицы цен моделей. Инструмент поддерживает три режима расчёта. --mode auto использует значение costUSD, записанное Claude Code в файл, если оно присутствует, а при его отсутствии рассчитывает стоимость по количеству токенов. --mode calculate всегда рассчитывает стоимость по токенам и игнорирует записанную стоимость. --mode display показывает только записанную стоимость и выводит $0.00 для строк без неё. Если итог выглядит неправильно, выполните тот же отчёт с calculate, а затем с display. Большая разница между результатами означает, что в большинстве записей нет сохранённой стоимости, поэтому все показанные значения являются оценкой.
Эти же данные можно использовать в вашем промпте. ccusage statusline выводит компактную строку для строки состояния Claude Code. Её можно подключить к ~/.claude/settings.json так же, как любую другую команду строки состояния. В разделе создание строки состояния Claude Code описаны блок настроек и передаваемые ему поля.
Парсер журналов не видит данные, которые не были созданы на этом компьютере. Диалоги со второго ноутбука, сессии на claude.ai и работа другого сотрудника хранятся на соответствующих дисках. Старые данные также могут отсутствовать: по умолчанию транскрипты удаляются через 30 дней согласно настройке cleanupPeriodDays. Поэтому данные за прошлый квартал будут недоступны, если вы не создали их архив.
Есть ещё один риск, связанный со структурой данных. В документации Anthropic указано, что формат записей является внутренним форматом Claude Code и изменяется между версиями. Поэтому скрипты, которые напрямую разбирают эти файлы, могут перестать работать после любого обновления. Это относится ко всем инструментам такого типа. По этой же причине написанный вручную однострочный jq для обработки JSONL хуже, чем кажется: сопровождаемые парсеры отслеживают изменения формата, а ваш однострочный скрипт в день переименования поля выдаст уверенно выглядящее, но неправильное значение.
Наконец, сумму в долларах нужно рассматривать с учётом подписки. В Pro и Max оплата не зависит от количества токенов, поэтому эта сумма показывает, сколько ваши токены стоили бы по стандартным тарифам API. Она измеряет интенсивность использования. Это не сумма вашего счёта. Если вы хотите определить, какой тариф выбрать, это отдельная задача. См. раздел сравнение оплаты API с подпиской Claude.
Форма 2: встроенные экраны статистики показывают, какая модель израсходовала бюджет
Claude Code формирует собственные отчёты, но большинство пользователей их не открывает. Выполните /usage внутри сессии. Блок Session в верхней части показывает количество токенов по моделям и сумму в долларах для текущей сессии. Расчёт выполняется локально на основе количества токенов и стандартных тарифов. Эта сумма не учитывает скидки и специальные цены, поэтому может отличаться от суммы в счёте. Итоговые значения сбрасываются, когда /clear начинает новый разговор.
На тарифах Pro, Max, Team и Enterprise этот экран также показывает, какую долю лимита тарифа вы использовали. Недавнее использование распределяется между skills, subagents, plugins и отдельными MCP servers в процентах от общего объёма. Экран отмечает виды активности, на которые приходится 10% или более недавнего использования, например длинный контекст или промахи кэша. Нажмите d или w, чтобы переключаться между последними 24 часами и последними 7 днями. Эти значения являются приблизительными и рассчитываются по локальной истории сессий на этом компьютере, поэтому использование на втором устройстве не учитывается.
Если разработчиков больше одного, статистика относится к аккаунту. Организация API получает страницу Console usage, панель Claude Code с расходами и принятыми строками кода по каждому участнику, а также Claude Code Analytics API, который с административным ключом возвращает те же ежедневные метрики по пользователям. Тарифы Team и Enterprise предоставляют отчёт о расходах в административной консоли с экспортом в CSV и ежедневным обновлением. Enterprise дополнительно предоставляет analytics API. Набор доступных данных зависит от способа входа каждого разработчика, поэтому в организации со смешанными способами входа приходится просматривать два отчёта и вручную складывать значения.
Для планирования бюджета опубликованные в документации Anthropic по стоимости данные по состоянию на August 2026 указывают среднее значение около $13 на разработчика за активный день и от $150 до $250 на разработчика в месяц. Для 90% пользователей расход не превышает $30 за активный день. Считайте это опубликованным ориентиром для корпоративных внедрений, а не прогнозом для вашей команды. Сначала запустите пилотную группу и выполните измерения, а затем экстраполируйте результаты.
Панели не показывают данные с детализацией меньше дня и отдельного пользователя. Они покажут, что во вторник большую часть времени использовалась Opus. Но они не покажут, какой prompt, репозиторий или CI job вызвал этот расход. Кроме того, данные появляются с задержкой, поскольку отчёты организации обновляются ежедневно. Поэтому это инструмент анализа, а не способ обнаружить runaway agent в тот же день. Для остановки runaway agent нужны лимиты, а не отчёты. Этой теме посвящён раздел ограничение расходов агента на VPS.
Вариант 3: собственный стек OpenTelemetry показывает, какой prompt вызвал регрессию
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. Этого достаточно, чтобы ответить на вопросы, на которые не ответит ни одна dashboard: какая часть счёта приходится на subagents, а не на ваши собственные запросы; удвоил ли один MCP server количество входных токенов; не сократилось ли чтение из кэша после изменения CLAUDE.md. Именно поведение кэша чаще всего становится неожиданностью. В материале когда prompt caching окупается объясняется, что именно следует проверять.
Стоит уточнить один момент, который возникает почти в каждом обсуждении этой темы. Langfuse — подходящий self-hosted backend для трассировки. Запуск Langfuse на VPS описан в материале самостоятельный запуск Langfuse для трассировки агентов. Его OTLP endpoint принимает только traces. Claude Code экспортирует метрики и log events, а не spans. Поэтому указание OTEL_EXPORTER_OTLP_ENDPOINT на Langfuse оставит проект пустым и не даст полезной ошибки. Langfuse подходит для агентов, которых вы создаёте самостоятельно через API, когда ваш код создаёт каждый span с его prompt, model и cost. Для Claude Code CLI подходит хранилище метрик.
Настройка отслеживания расходов Claude Code на собственном VPS
Достаточно двух сервисов: collector для приёма метрик и 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. Поэтому collector доступен с ваших машин и недоступен откуда-либо ещё. Адрес перед портом здесь действительно важен, поскольку опубликованные Docker-порты не фильтруются через ufw: см. почему опубликованные Docker-порты обходят ufw. Настройка самого туннеля описана в разделе VPN WireGuard на собственном 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 обращается к collector по имени сервиса в сети 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Лог 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_. Exporter заменяет точки на символы подчёркивания и добавляет единицу измерения, поэтому точные строки зависят от версии collector. Пустой результат означает, что данные не поступили. Проверьте соответствие протокола и порта: http/protobuf использует порт 4318, а grpc — порт 4317. Несоответствие приводит к тихому сбою. Выполните claude --debug, и debug log покажет ошибки экспорта OTel.
Для одной машины без сервера пропустите все описанные шаги. Установите OTEL_METRICS_EXPORTER=prometheus, и Claude Code сам предоставит endpoint для сбора метрик по адресу http://localhost:9464/metrics. Если prometheus — единственный указанный exporter, Claude Code удаляет единицы USD, tokens и s из имён метрик, чтобы результат оставался корректным текстом в формате 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 может записывать собственные расходы без dashboard. Добавьте значение в файл или передайте его как метрику в указанный выше collector. Это самый простой полезный способ отслеживать расходы, и для него требуется один вызов jq на каждый запуск.
Режимы отказа и наблюдаемые признаки
Отчёт пуст. npx ccusage@latest daily не выводит строки, значит, он читает не то место, куда Claude Code записывает данные. CLAUDE_CONFIG_DIR изменяет это расположение, поэтому парсеру нужно сообщить новый путь. Если строки есть, но заканчиваются примерно месяц назад, это означает, что cleanupPeriodDays работает штатно: по умолчанию транскрипты удаляются через 30 дней.
На двух машинах отображаются разные итоговые значения. Это ожидаемое поведение, а не ошибка. И /usage, и любой парсер журналов читают только локальную историю сеансов, поэтому использование с другого устройства или из claude.ai отсутствует в обоих источниках.
Локальное итоговое значение не совпадает со счётом. Локальные значения рассчитываются по числу токенов и стандартным розничным тарифам. Они не учитывают промо-тарифы или согласованную скидку. При подписке токены вообще не оплачиваются по отдельности. Страница использования в Console является источником данных для расчётов API.
Стоимость выросла, хотя вы выполняли ту же работу. Сначала проверьте столбцы кэша. Длительный сеанс повторно отправляет всю историю при каждом запросе. Пока кэш прогрет, применяется тариф для кэшированных данных. После его очистки применяется полный тариф для входных данных. Поэтому после длительного перерыва повторно обрабатывается весь разговор. Это отображается как большое значение входных данных рядом с небольшим значением выходных данных. В разделе тарифы для входных и выходных токенов объясняется, почему эти значения изменяются независимо.
День с subagents выглядит неправдоподобно. Каждый subagent использует собственное контекстное окно. Поэтому расход токенов зависит от количества запущенных subagents и продолжительности работы каждого из них. Только данные OTel позволяют разделить их по атрибуту query_source в claude_code.token.usage. Парсер журналов покажет общее значение, но не позволит определить его составляющие.
FAQ
Показывает ли ccusage, сколько с меня фактически списывают на плане Max?
Нет. При подписке оплата не рассчитывается по числу токенов. Поэтому анализатор журналов оценивает токены по стандартным тарифам API и показывает, во сколько та же работа обошлась бы через API. Это удобный относительный показатель загрузки за день. Он также подходит для сравнения проектов или моделей между собой. Чтобы узнать фактическую сумму, используйте страницу использования Console для биллинга API и страницу биллинга плана для подписки.
Где Claude Code хранит файлы сеансов, которые читают эти инструменты?
В ~/.claude/projects/<project>/<session-id>.jsonl. В этом пути <project> — рабочий каталог, где неалфавитно-цифровые символы заменены на -. Каждая строка содержит объект JSON для одного сообщения, вызова инструмента или записи метаданных. CLAUDE_CONFIG_DIR перемещает весь каталог. Параметр cleanupPeriodDays в settings.json управляет хранением данных в течение 30 дней. Anthropic описывает формат записей как внутренний и подлежащий изменению между версиями. Поэтому используйте поддерживаемый инструмент, а не собственный скрипт.
Можно ли отправлять телеметрию Claude Code в Langfuse?
Не напрямую. Конечная точка OTLP в Langfuse принимает трассировки. Claude Code экспортирует метрики и события журналов, а не spans. Поэтому этим данным некуда поступать. Отправляйте метрики Claude Code в коллектор OpenTelemetry и храните их в Prometheus. Langfuse используйте для агентов, которых вы создаёте самостоятельно через API. В этом случае ваш код формирует spans с prompt, моделью и стоимостью.
Почему локальные значения не совпадают со страницей использования Console?
Потому что они рассчитываются по-разному. /usage и анализаторы журналов суммируют количество токенов в файлах сеансов на текущем компьютере, а затем оценивают их по стандартным тарифам. Console показывает фактически списанную с вашей организации сумму по всем компьютерам и ключам с учётом скидок. Несовпадение нормально. Большая разница обычно означает, что с этим же аккаунтом работает второе устройство, CI runner или другой сотрудник.
Как отслеживать стоимость запуска claude -p в CI?
Запустите его с --output-format json и прочитайте total_cost_usd из результата, например с помощью claude -p "..." --output-format json | jq '.total_cost_usd'. В тех же данных есть разбивка по моделям и ID сеанса. Записывайте это значение для каждого задания. Так вы получите расходы по каждому pipeline без agent, dashboard или дополнительного сервиса.