SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor · Обновлено 2026-08-13

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

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

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

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

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

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

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

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

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

Claude Code сохраняет каждую сессию в формате JSON Lines по пути ~/.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 суммирует расходы по каждой беседе, а --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. Значительный разрыв между результатами означает, что в большинстве записей отсутствует зафиксированная стоимость, поэтому все, что вы видите — это лишь оценка.

Те же данные можно использовать в ваших промптах. 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 этот же экран показывает, какая часть лимита плана уже использована, и распределяет недавнее потребление по навыкам, субагентам, плагинам и отдельным 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.

Вариант 3: собственная инфраструктура 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-серверов к удвоению входных токенов; не сократилось ли количество чтений из кэша после того, как кто-то отредактировал CLAUDE.md. Поведение кэша — это обычно то место, где скрываются неожиданные результаты, а в когда кэширование промптов окупается объясняется, на что именно стоит обращать внимание.

Важное уточнение, так как этот вопрос возникает в каждом обсуждении: Langfuse — это хороший бэкенд для трассировки с возможностью self-hosting, и его развертывание на VPS описано в самостоятельном хостинге Langfuse для трассировки агентов. Его OTLP-эндпоинт принимает только трассы (traces). Claude Code экспортирует метрики и события журналов, а не спаны (spans), поэтому при отправке OTEL_EXPORTER_OTLP_ENDPOINT в Langfuse проект останется пустым, а вы не получите никаких информативных сообщений об ошибках. 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. Настройка самого туннеля описана в разделе 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 обращается к коллектору внутри сети 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, и в отладочном логе появятся ошибки экспорта OTel.

Если у вас одна машина и нет сервера, пропустите всё вышеперечисленное. Установите OTEL_METRICS_EXPORTER=prometheus, и Claude Code сам откроет endpoint для сбора метрик по адресу http://localhost:9464/metrics. Когда prometheus является единственным указанным экспортером, 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-задача может самостоятельно фиксировать свои расходы без использования панели управления. Добавьте полученное значение в файл или отправьте его как метрику в систему сбора данных, описанную выше. Это самый экономичный способ отслеживания расходов, требующий всего один вызов jq на каждый запуск.

Типичные сбои и их признаки

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

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

Локальный итог не совпадает со счетом. Локальные показатели рассчитываются на основе количества токенов по стандартным тарифам из прайс-листа. Они не учитывают акционные цены или договорные скидки, а при наличии подписки токены вообще не тарифицируются по отдельности. Страница использования в Console является единственным достоверным источником для биллинга API.

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

Данные за день с использованием субагентов выглядят нереалистично. Каждый субагент работает в собственном контекстном окне, поэтому потребление токенов масштабируется в зависимости от количества запущенных агентов и длительности работы каждого из них. Разделить их можно только с помощью данных 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 экспортирует метрики и события логов, а не спаны, поэтому данным некуда поступать. Отправляйте метрики Claude Code в коллектор OpenTelemetry и храните их в Prometheus. Используйте Langfuse для агентов, которые вы создаете самостоятельно через API: в этом случае ваш код будет генерировать спаны, содержащие промпт, модель и стоимость.

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

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

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

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