SSD Nodes Learn 🎉 VPS từ $4.99/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

So sánh công cụ theo dõi chi phí Claude Code

So sánh log parser cục bộ, màn hình usage tích hợp và stack OpenTelemetry tự dựng để biết mỗi công cụ Claude Code đọc gì và trả lời được câu hỏi nào.

Một công cụ theo dõi chi phí Claude Code thực sự đọc gì

Mỗi công cụ theo dõi chi phí Claude Code đọc một trong ba nguồn dữ liệu. Nguồn dữ liệu quyết định công cụ có thể trả lời câu hỏi nào. Log parser đọc các file transcript của session trên chính máy của bạn. Dashboard đọc các bản ghi usage mà Anthropic lưu cho account hoặc tổ chức của bạn. Metrics backend đọc luồng OpenTelemetry (OTel) mà Claude Code phát ra khi bạn bật tính năng này. Cả ba có thể đồng thời đúng nhưng vẫn cho kết quả khác nhau, vì chúng đang đếm những yếu tố khác nhau.

Hướng dẫn này không giải thích lại token. cách Claude Code đếm mức sử dụng token trình bày input, output, cache writes và cache reads. Bạn cần hiểu phần đó trước khi các số liệu trên dashboard có ý nghĩa. Phạm vi ở đây hẹp hơn: với từng loại công cụ, nó nhìn thấy được gì và không bao giờ nhìn thấy được gì.

Vì sao xuất hiện ba công cụ theo dõi chi phí Claude Code trong cùng một ngày

Ba công cụ theo dõi chi phí Claude Code riêng biệt được đăng trong cùng một ngày. Chúng không phải là ba phiên bản của cùng một công cụ. Đây mới là điểm đáng chú ý. Một công cụ phân tích các file session cục bộ. Một công cụ bọc các màn hình usage của account. Công cụ còn lại là một tracing backend được host mà bạn tự vận hành.

Chúng xuất hiện cùng lúc vì chi phí của một agent session không còn dễ nhận biết. Một cuộc trò chuyện thường tốn khoảng mức bạn thấy trên màn hình. Một agent có thể đọc 20 file, chạy test suite và gửi lại toàn bộ conversation trong mỗi lượt. Vì vậy, hóa đơn bị chi phối bởi context mà bạn chưa từng nhập. Với subscription, hoàn toàn không có con số dollar cụ thể. Bạn chỉ thấy một usage bar, và thanh này có thể cạn nhanh hơn vào một số ngày. Mỗi công cụ trong ba công cụ này giải quyết một phần khác nhau của khoảng trống đó.

Cách 1: trình phân tích log cục bộ cho biết hôm nay đã tiêu tốn bao nhiêu

Claude Code lưu mỗi cuộc trò chuyện dưới dạng JSON Lines (JSONL) tại ~/.claude/projects/<project>/<session-id>.jsonl, trong đó <project> là đường dẫn thư mục làm việc của bạn với các ký tự không phải chữ và số được thay bằng -. Mỗi lượt trả lời của assistant trong file đó đều có số lượng token của request. Trình phân tích log cộng các giá trị này và tính chi phí.

ccusage là lựa chọn được nhiều người dùng nhất. Công cụ này không cần cài đặt:

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

daily tính tổng theo ngày. --breakdown tách từng dòng theo model. Đây là cách xác định một buổi chiều dùng Opus đã chiếm phần lớn chi phí trong tuần. blocks nhóm theo khoảng thời gian 5 giờ mà subscription được reset. session tính tổng theo từng cuộc trò chuyện, còn --instances nhóm theo project để bạn biết repository nào tốn kém. Thêm --since--until để giới hạn khoảng thời gian, rồi chạy npx ccusage@latest daily --help để dùng đúng định dạng ngày mà phiên bản của bạn yêu cầu. Tính đến August 2026, công cụ này cũng đọc được các agent CLI khác, gồm Codex và OpenCode. Điều này hữu ích khi bạn so sánh chúng.

Chi phí được lấy từ bảng giá của model, và công cụ có 3 chế độ tính chi phí. --mode auto dùng giá trị costUSD mà Claude Code đã ghi vào file nếu có, và tính từ số lượng token nếu không có giá trị đó. --mode calculate luôn tính từ token và bỏ qua mọi chi phí đã được ghi nhận. --mode display chỉ hiển thị các chi phí đã ghi nhận và in $0.00 cho những dòng không có chi phí. Nếu tổng có vẻ không đúng, hãy chạy cùng báo cáo với calculate, sau đó chạy lại với display. Khoảng chênh lệch lớn giữa hai kết quả có nghĩa là phần lớn entry không có chi phí được ghi nhận, nên toàn bộ số liệu bạn đang xem chỉ là ước tính.

Bạn cũng có thể dùng cùng dữ liệu này cho prompt. ccusage statusline in ra một dòng ngắn gọn cho status bar của Claude Code, được cấu hình trong ~/.claude/settings.json như mọi lệnh status line khác. Xem xây dựng statusline cho Claude Code để biết block settings và các field mà nó nhận.

Trình phân tích log không thể thấy những việc không diễn ra trên máy này. Laptop thứ hai, session trên claude.ai hoặc công việc của đồng đội đều nằm trong các transcript trên những máy đó. Dữ liệu cũ cũng có thể đã mất, vì transcript mặc định được dọn sau 30 ngày theo setting cleanupPeriodDays. Vì vậy, dữ liệu của quý trước sẽ không còn nếu bạn không lưu trữ trước.

Còn một rủi ro khác nằm ở cấu trúc dữ liệu. Tài liệu của Anthropic nêu rằng format của entry là nội bộ của Claude Code và có thể thay đổi giữa các phiên bản. Vì vậy, các script phân tích trực tiếp những file này có thể hỏng sau bất kỳ release nào. Điều này áp dụng cho mọi công cụ cùng loại. Đây cũng là lý do một dòng lệnh jq tự viết để xử lý JSONL có thể tệ hơn vẻ ngoài: các trình phân tích được duy trì sẽ theo kịp thay đổi của format, còn one-liner của bạn sẽ báo một con số sai nhưng có vẻ chắc chắn vào ngày một field bị đổi tên.

Cuối cùng, con số tính bằng dollar cần có một lưu ý khi bạn dùng subscription. Bạn không bị tính phí theo token trên Pro hoặc Max, nên con số này là chi phí token giả định theo giá API niêm yết. Nó đo mức độ sử dụng của bạn. Nó không phải hóa đơn thực tế. Nếu câu hỏi thực sự là nên dùng plan nào, việc so sánh đó cần được thực hiện riêng: xem so sánh billing API với subscription Claude.

Cách 2: màn hình usage tích hợp cho biết model nào đã tiêu tốn ngân sách

Claude Code có sẵn tính năng reporting nhưng hầu hết mọi người không bao giờ mở. Chạy /usage trong một session. Block Session ở đầu màn hình hiển thị số token theo từng model và số tiền của session hiện tại. Số tiền này được tính cục bộ từ số token theo mức giá niêm yết tiêu chuẩn. Số tiền đó không phản ánh discount hoặc giá khuyến mại, nên có thể khác với hóa đơn của bạn. Tổng số sẽ reset khi /clear bắt đầu một cuộc trò chuyện mới.

Trên gói Pro, Max, Team hoặc Enterprise, màn hình này cũng cho biết bạn đã sử dụng bao nhiêu trong giới hạn của gói. Màn hình phân bổ usage gần đây cho skills, subagents, plugins và từng MCP server dưới dạng phần trăm tổng usage. Màn hình đánh dấu các hành vi chiếm từ 10% usage gần đây trở lên, chẳng hạn như context dài hoặc cache miss. Nhấn d hoặc w để chuyển giữa 24 giờ qua và 7 ngày qua. Các số liệu này chỉ mang tính gần đúng và được tính từ lịch sử session cục bộ trên máy này, nên không tính thiết bị thứ hai.

Khi có nhiều hơn một developer, các số liệu được tính ở cấp account. Một tổ chức dùng API sẽ có trang usage trong Console, dashboard Claude Code hiển thị mức chi tiêu và số dòng được chấp nhận của từng member, cùng Claude Code Analytics API trả về các metric hằng ngày theo từng user bằng admin key. Gói Team và Enterprise có spend report trong admin console, hỗ trợ export CSV và được cập nhật hằng ngày. Enterprise còn có analytics API. Những gì bạn thấy phụ thuộc vào cách từng developer đăng nhập. Vì vậy, một tổ chức dùng kết hợp các hình thức này phải đọc hai report rồi tự cộng lại.

Để ước tính ngân sách, số liệu được công bố trong tài liệu chi phí của Anthropic tính đến August 2026 là trung bình gần $13 cho mỗi developer trong một ngày active và $150 đến $250 cho mỗi developer mỗi tháng. 90% user dùng dưới $30 cho mỗi ngày active. Hãy xem đây là benchmark được công bố từ các đợt triển khai enterprise, không phải dự báo cho team của bạn. Hãy chạy pilot với một nhóm nhỏ và đo lường trước khi suy rộng kết quả.

Dashboard không thể cho biết thông tin chi tiết hơn theo ngày và theo người. Dashboard có thể cho biết Opus được dùng nhiều nhất vào Tuesday. Nhưng dashboard không cho biết prompt nào, repository nào hoặc CI job nào gây ra usage đó. Dashboard cũng có độ trễ vì report của tổ chức được cập nhật hằng ngày. Do đó, đây là công cụ review chứ không phải cách phát hiện một agent chạy vượt kiểm soát trong chiều nay. Muốn ngăn agent chạy vượt kiểm soát, bạn cần limits chứ không phải reports. Nội dung đó được trình bày trong giới hạn chi phí agent trên một VPS.

Hình thức 3: stack OpenTelemetry tự quản lý cho biết prompt nào bị regression

Claude Code phát metrics và event OpenTelemetry sau khi bạn đặt một biến môi trường. Đây là lựa chọn duy nhất stream dữ liệu token và chi phí theo từng user vào hệ thống do bạn kiểm soát, gần như theo thời gian thực. Metrics bao gồm claude_code.cost.usage tính bằng USD, claude_code.token.usage tính bằng token, claude_code.session.countclaude_code.active_time.total.

Metric token là phần đáng chú ý vì nó có các attribute. Mỗi data point chứa type, có thể là input, output, cacheRead hoặc cacheCreation, cùng với modelquery_source, có thể là main, subagent hoặc auxiliary. Nó cũng chứa agent.name, skill.name, mcp_server.namemcp_tool.name. Như vậy là đủ để trả lời những câu hỏi mà không dashboard nào cung cấp được: subagent chiếm bao nhiêu trong hóa đơn so với các lượt tương tác của chính bạn, một MCP server có làm số input token tăng gấp đôi không, hoặc số cache read có giảm mạnh sau khi ai đó sửa CLAUDE.md không. Cache thường là nơi phát sinh chi phí bất ngờ. Bài viết khi nào prompt caching tự hoàn vốn giải thích cách đọc các dữ liệu này.

Có một điểm cần đính chính vì nó xuất hiện trong hầu hết các cuộc thảo luận về chủ đề này. Langfuse là tracing backend self-host tốt, và việc chạy nó trên VPS được hướng dẫn trong bài self-host Langfuse để tracing agent. OTLP endpoint của nó chỉ nhận trace. Claude Code export metrics và log event, không export span. Vì vậy, trỏ OTEL_EXPORTER_OTLP_ENDPOINT đến Langfuse sẽ khiến project không có dữ liệu và không cung cấp lỗi hữu ích để đọc. Langfuse phù hợp với các agent do bạn tự xây dựng trên API, trong đó code của bạn tạo từng span cùng prompt, model và chi phí tương ứng. Với Claude Code CLI, metrics store mới là lựa chọn phù hợp.

Thiết lập theo dõi chi phí Claude Code trên VPS của bạn

Chỉ cần 2 service: một collector để nhận metrics và Prometheus để lưu chúng. Giữ cả hai ngoài Internet công cộng, vì một cổng OTLP mở sẽ cho phép bất kỳ ai tìm thấy nó gửi dữ liệu. Ghi /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 là địa chỉ của server bên trong tunnel WireGuard. Nhờ đó, collector có thể được truy cập từ các máy của bạn và không từ nơi nào khác. Địa chỉ đứng trước port thực sự có tác dụng ở đây, vì các port Docker đã publish không bị ufw lọc: xem vì sao các port Docker đã publish bypass ufw. Cách thiết lập tunnel được trình bày tại VPN WireGuard trên VPS của bạn.

/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. Port 8889 không bao giờ được publish ra host, vì Prometheus truy cập collector qua Compose network bằng service name:

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

Log của collector phải kết thúc bằng Everything is ready. Begin running and processing data.. Log dừng tại lỗi cấu hình nghĩa là YAML không parse được và container sẽ restart liên tục.

Bây giờ trỏ Claude Code đến đó. Trên mỗi máy chạy Claude Code, thêm nội dung này vào ~/.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"
  }
}

Khởi động một session, gửi một prompt, chờ đến interval export (10 giây ở đây, mặc định là 60 giây), rồi hỏi Prometheus xem nó đã nhận được gì:

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

Bạn sẽ nhận được một số tên bắt đầu bằng claude_code_. Exporter đổi dấu chấm thành dấu gạch dưới và thêm unit, nên các chuỗi chính xác phụ thuộc vào phiên bản collector của bạn. Kết quả rỗng nghĩa là chưa có dữ liệu nào đến. Kiểm tra protocol và port có khớp không, vì http/protobuf dùng port 4318 còn grpc dùng port 4317; nếu không khớp thì lỗi xảy ra mà không có thông báo rõ ràng. Chạy claude --debug để debug log báo các lỗi OTel export.

Nếu chỉ có một máy và không cần server, bỏ qua toàn bộ phần trên. Đặt OTEL_METRICS_EXPORTER=prometheus để Claude Code tự expose scrape endpoint tại http://localhost:9464/metrics. Khi prometheus là exporter duy nhất được liệt kê, Claude Code bỏ USD, tokenss khỏi tên metric để scrape vẫn đúng định dạng văn bản Prometheus.

Cấu hình này có một quyết định về quyền riêng tư. Mặc định, chỉ các bộ đếm được gửi khỏi máy; không có nội dung prompt và output của tool. OTEL_LOG_USER_PROMPTS=1OTEL_LOG_TOOL_CONTENT=1 sẽ thay đổi điều đó. Khi ấy, máy metrics của bạn sẽ chứa source code và mọi dữ liệu khác nằm trong context. Chỉ bật các tùy chọn này khi đã cân nhắc kỹ, và đọc không để lộ secret trong context của agent trước.

Theo dõi chi phí của các lần chạy bằng script và CI

Các lần chạy không tương tác thường gây bất ngờ vì không có ai theo dõi màn hình. claude -p cùng với --output-format json báo cáo chi phí của lần chạy đó trong result payload:

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

Payload chứa total_cost_usd cùng với bảng phân tích theo từng model. Vì vậy, một CI job có thể tự ghi lại chi phí mà không cần dashboard. Ghi thêm giá trị này vào một file hoặc đẩy nó dưới dạng metric đến collector ở trên. Đây là cách theo dõi chi phí hữu ích với chi phí thấp nhất, và mỗi lần chạy chỉ tốn một lần gọi jq.

Các trường hợp lỗi và những gì bạn sẽ thấy

Báo cáo trống. npx ccusage@latest daily không in ra dòng nào nghĩa là công cụ không đọc đúng nơi Claude Code ghi dữ liệu. CLAUDE_CONFIG_DIR thay đổi vị trí đó, nên phải chỉ cho parser biết vị trí mới. Nếu có dòng dữ liệu nhưng chỉ kéo dài đến khoảng 1 tháng trước, đó là cleanupPeriodDays đang hoạt động đúng thiết kế: theo mặc định, transcript bị xóa sau 30 ngày.

Hai máy báo tổng số khác nhau. Đây là kết quả bình thường, không phải lỗi. Cả /usage và mọi log parser đều chỉ đọc lịch sử session cục bộ, nên usage từ thiết bị khác hoặc từ claude.ai đều không xuất hiện trên cả hai máy.

Tổng cục bộ không khớp với hóa đơn. Các số liệu cục bộ được tính từ số lượng token theo mức giá niêm yết tiêu chuẩn. Chúng không biết về giá khuyến mại hoặc mức chiết khấu theo hợp đồng. Với gói subscription, token cũng không được tính phí riêng lẻ. Trang usage trong Console là nguồn chính thức để kiểm tra việc tính phí API.

Chi phí tăng dù bạn vẫn làm cùng một việc. Trước tiên, hãy kiểm tra các cột cache. Một session dài sẽ gửi lại toàn bộ lịch sử trong mỗi lượt, được tính theo mức giá cached khi cache còn nóng và theo toàn bộ mức giá input khi cache nguội. Vì vậy, chỉ một khoảng dừng dài cũng khiến toàn bộ cuộc hội thoại được xử lý lại. Điều này thường hiện thành số input lớn cạnh số output nhỏ. Mức giá token input và output giải thích vì sao hai con số này thay đổi độc lập.

Một ngày có subagent cho thấy số liệu dường như không thể xảy ra. Mỗi subagent chạy trong context window riêng, nên lượng token sử dụng tăng theo số lượng subagent đã chạy và thời gian chạy của từng subagent. Chỉ dữ liệu OTel mới tách được chúng, thông qua thuộc tính query_source trên claude_code.token.usage. Log parser chỉ hiển thị tổng số và không cho bạn biết chi tiết.

FAQ

ccusage có hiển thị đúng số tiền tôi bị tính trong gói Max không?

Không. Với gói subscription, bạn không bị tính phí theo token. Vì vậy, trình phân tích log sẽ định giá số token của bạn theo mức giá niêm yết tiêu chuẩn của API và hiển thị chi phí nếu cùng phần việc đó được thực hiện qua API. Đây là thước đo tương đối tốt để biết một ngày có khối lượng xử lý lớn đến đâu. Nó cũng hữu ích khi so sánh các project hoặc model với nhau. Để biết số tiền thực tế phải trả, trang sử dụng trong Console áp dụng cho phí API, còn trang tính phí của gói áp dụng cho subscription.

Claude Code lưu các file session mà những tool này đọc ở đâu?

Trong ~/.claude/projects/<project>/<session-id>.jsonl. Ở đây, <project> là đường dẫn thư mục làm việc, trong đó các ký tự không phải chữ và số được thay bằng -. Mỗi dòng là một JSON object đại diện cho một message, lần sử dụng tool hoặc mục metadata. CLAUDE_CONFIG_DIR di chuyển toàn bộ thư mục. Thiết lập cleanupPeriodDays trong settings.json kiểm soát thời gian lưu giữ 30 ngày. Anthropic xem format của các entry là nội bộ và có thể thay đổi giữa các version. Vì vậy, hãy phân tích bằng một tool được duy trì thay vì tự viết script.

Tôi có thể gửi telemetry của Claude Code đến Langfuse không?

Không trực tiếp. Endpoint OTLP của Langfuse nhận trace, còn Claude Code xuất metric và sự kiện log thay vì span, nên không có nơi để dữ liệu đó được ghi nhận. Hãy gửi metric của Claude Code đến một OpenTelemetry collector và lưu chúng trong Prometheus. Dùng Langfuse cho các agent do bạn tự xây dựng trên API, nơi code của bạn phát ra span chứa prompt, model và chi phí.

Vì sao các con số trên máy local không khớp với trang sử dụng trong Console?

Vì chúng được tính theo cách khác nhau. /usage và các trình phân tích log cộng số lượng token từ các file session trên máy bạn đang sử dụng, rồi định giá chúng theo mức giá niêm yết tiêu chuẩn. Console báo cáo số tiền tổ chức của bạn thực tế bị tính, bao gồm mọi máy và mọi key, sau khi áp dụng các khoản giảm giá. Chênh lệch là bình thường. Chênh lệch rất lớn thường có nghĩa là có thêm một thiết bị, một CI runner hoặc một thành viên khác trong team đang tính phí vào cùng account.

Làm thế nào để theo dõi chi phí của một lần chạy claude -p trong CI?

Chạy với --output-format json và đọc total_cost_usd từ kết quả, chẳng hạn bằng claude -p "..." --output-format json | jq '.total_cost_usd'. Payload này cũng chứa phần phân tích theo từng model và session ID. Ghi lại giá trị đó cho từng job để có chi phí theo từng pipeline mà không cần agent, dashboard hoặc service bổ sung.