SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-13

Perbandingan Alat Pelacak Pengeluaran Claude Code

Bandingkan pengurai log lokal, layar penggunaan bawaan, dan stack OpenTelemetry untuk melihat sumber data, cakupan, serta perbedaan hasil pelacakan Claude Code.

Hal yang sebenarnya dibaca oleh pelacak pengeluaran Claude Code

Setiap pelacak pengeluaran Claude Code membaca salah satu dari tiga sumber data, dan sumber tersebut menentukan pertanyaan yang dapat dijawabnya. Pengurai log membaca file transkrip sesi pada disk Anda sendiri. Dasbor membaca catatan penggunaan yang disimpan Anthropic untuk akun atau organisasi Anda. Backend metrik membaca aliran OpenTelemetry (OTel) yang dipancarkan Claude Code setelah Anda mengaktifkannya. Ketiganya dapat benar pada saat yang sama dan tetap menunjukkan hasil berbeda karena masing-masing menghitung hal yang berbeda.

Panduan ini tidak menjelaskan ulang token. cara Claude Code menghitung penggunaan token membahas input, output, penulisan cache, dan pembacaan cache. Tidak ada dasbor yang banyak membantu sebelum bagian tersebut dipahami. Pertanyaannya di sini lebih terbatas: untuk setiap jenis alat, apa yang dapat dilihatnya dan apa yang tidak akan pernah dapat dilihatnya.

Mengapa tiga pelacak penggunaan Claude Code muncul pada hari yang sama

Tiga pelacak penggunaan Claude Code yang berbeda dipublikasikan pada hari yang sama. Ketiganya bukan tiga versi dari alat yang sama. Justru di situlah letak manfaatnya. Salah satunya mengurai file sesi lokal. Salah satunya membungkus halaman penggunaan akun. Salah satunya adalah backend pelacakan ter-host yang Anda jalankan sendiri.

Ketiganya muncul bersamaan karena biaya suatu sesi agen tidak lagi mudah diketahui. Biaya percakapan kira-kira sesuai dengan yang terlihat di layar. Agen membaca dua puluh file, menjalankan rangkaian pengujian, dan mengirim ulang seluruh percakapan pada setiap giliran. Karena itu, tagihan ditentukan oleh konteks yang tidak pernah Anda ketik. Pada langganan, tidak ada angka dalam dolar sama sekali. Yang tersedia hanya bilah penggunaan yang lebih cepat berkurang pada hari-hari tertentu. Ketiga alat tersebut mengisi bagian yang berbeda dari kesenjangan ini.

Bentuk 1: parser log lokal memberi tahu biaya hari ini

Claude Code menyimpan setiap percakapan sebagai JSON Lines (JSONL) di ~/.claude/projects/<project>/<session-id>.jsonl, dengan <project> sebagai path direktori kerja Anda yang karakter nonalfanumeriknya diganti dengan -. Setiap giliran assistant dalam file tersebut memuat jumlah token untuk permintaannya. Parser log menjumlahkannya lalu menghitung harganya.

ccusage adalah pilihan yang paling banyak digunakan. Anda tidak perlu menginstalnya:

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

daily menjumlahkan berdasarkan tanggal. --breakdown memisahkan setiap baris berdasarkan model. Dengan begitu, Anda dapat mengetahui apakah satu sore menggunakan Opus menghabiskan sebagian besar penggunaan selama seminggu. blocks mengelompokkan data berdasarkan jendela lima jam saat subscription direset. session menjumlahkan berdasarkan percakapan, sedangkan --instances mengelompokkan berdasarkan project agar Anda dapat melihat repository mana yang paling mahal. Tambahkan --since dan --until untuk membatasi rentang, lalu jalankan npx ccusage@latest daily --help untuk mengetahui format tanggal yang diharapkan oleh versi Anda. Per Agustus 2026, tool ini juga membaca CLI agent lain, termasuk Codex dan OpenCode. Ini berguna jika Anda membandingkannya.

Harga berasal dari tabel harga model, dan tool ini memiliki tiga mode biaya. --mode auto menggunakan nilai costUSD yang ditulis Claude Code ke dalam file jika nilai tersebut tersedia, lalu menghitungnya dari jumlah token jika tidak tersedia. --mode calculate selalu menghitung dari token dan mengabaikan biaya yang tercatat. --mode display hanya menampilkan biaya yang tercatat dan mencetak $0.00 untuk baris yang tidak memilikinya. Jika total terlihat salah, jalankan laporan yang sama dengan calculate, lalu dengan display. Selisih besar di antara keduanya berarti sebagian besar entri tidak memiliki biaya yang tercatat. Dengan demikian, semua angka yang Anda baca merupakan estimasi.

Data yang sama dapat digunakan untuk prompt Anda. ccusage statusline mencetak satu baris ringkas untuk status bar Claude Code, yang dihubungkan ke ~/.claude/settings.json seperti command status bar lainnya. Lihat membuat statusline Claude Code untuk blok pengaturan dan field yang diterimanya.

Parser log tidak dapat melihat aktivitas yang tidak terjadi di mesin ini. Laptop kedua, sesi di claude.ai, atau pekerjaan rekan satu tim tersimpan di disk masing-masing. Data lama juga dapat hilang karena transcript dibersihkan setelah 30 hari secara default melalui pengaturan cleanupPeriodDays. Karena itu, data kuartal sebelumnya tidak tersedia kecuali Anda mengarsipkannya.

Ada satu risiko lain yang bersifat struktural. Dokumentasi Anthropic menyatakan bahwa format entri bersifat internal bagi Claude Code dan berubah antarversi. Karena itu, script yang langsung mem-parse file ini dapat rusak pada release apa pun. Hal ini berlaku untuk semua tool dengan bentuk seperti ini. Ini juga alasan one-liner jq yang dibuat sendiri untuk memproses JSONL merupakan pilihan yang lebih buruk daripada yang terlihat. Parser yang dipelihara mengikuti perubahan format untuk Anda, sedangkan one-liner Anda dapat melaporkan angka yang salah dengan yakin pada hari ketika suatu field diganti namanya.

Terakhir, angka dalam dolar memerlukan penjelasan jika Anda menggunakan subscription. Anda tidak ditagih berdasarkan jumlah token pada Pro atau Max. Jadi, angka tersebut menunjukkan biaya token Anda jika dihitung berdasarkan tarif API yang tercantum. Angka itu mengukur seberapa berat penggunaan Anda. Angka itu bukan tagihan Anda. Jika pertanyaan sebenarnya adalah paket mana yang sebaiknya digunakan, perbandingan tersebut merupakan pembahasan tersendiri: lihat penagihan API dibandingkan dengan subscription Claude.

Pola 2: layar penggunaan bawaan menunjukkan model yang menghabiskan anggaran

Claude Code menyediakan pelaporan bawaan, tetapi sebagian besar pengguna tidak pernah membukanya. Jalankan /usage dalam sebuah sesi. Blok Session di bagian atas menampilkan jumlah token berdasarkan model dan nilai dalam dolar untuk sesi saat ini. Nilai tersebut dihitung secara lokal berdasarkan jumlah token dengan tarif daftar standar. Nilai itu tidak memperhitungkan diskon atau harga promosi, sehingga dapat berbeda dari tagihan Anda. Total diatur ulang saat /clear memulai percakapan baru.

Pada paket Pro, Max, Team, atau Enterprise, layar yang sama menampilkan jumlah batas paket yang telah Anda gunakan. Layar tersebut juga mengaitkan penggunaan terbaru dengan skills, subagents, plugins, dan server MCP individual sebagai persentase dari total penggunaan. Layar ini menandai perilaku yang mencakup 10% atau lebih dari penggunaan terbaru, seperti konteks panjang atau cache miss. Tekan d atau w untuk beralih antara 24 jam terakhir dan 7 hari terakhir. Angka tersebut bersifat perkiraan dan dihitung dari riwayat sesi lokal pada mesin ini, sehingga penggunaan dari perangkat kedua tidak dihitung. Jika bar tersebut kosong, bukan sekadar rendah, layar akan memberi tahu bahwa jendela penggunaan telah ditutup, tetapi tidak menjelaskan cara melanjutkan pekerjaan. Tindakan setelah Anda mencapai batas merupakan keputusan terpisah terkait model, konteks, dan paket.

Jika jumlah developer lebih dari satu, angka tersebut berpindah ke tingkat akun. Organisasi API mendapatkan halaman penggunaan Console, dasbor Claude Code dengan pengeluaran dan jumlah baris yang diterima untuk setiap anggota, serta Claude Code Analytics API yang mengembalikan metrik harian per pengguna yang sama dengan admin key. Paket Team dan Enterprise mendapatkan laporan pengeluaran di admin console dengan ekspor CSV yang diperbarui setiap hari. Enterprise juga menyediakan analytics API. Laporan yang dapat Anda lihat bergantung pada cara setiap developer melakukan sign-in. Karena itu, organisasi campuran harus membaca dua laporan dan menjumlahkannya secara manual.

Untuk menentukan ukuran anggaran, angka yang dipublikasikan dalam dokumentasi biaya Anthropic per August 2026 adalah rata-rata sekitar $13 per developer per hari aktif dan $150 hingga $250 per developer per bulan. Sebanyak 90% pengguna berada di bawah $30 per hari aktif. Perlakukan angka tersebut sebagai tolok ukur yang dipublikasikan berdasarkan deployment enterprise, bukan sebagai prediksi untuk tim Anda. Jalankan pilot pada sekelompok pengguna dan ukur hasilnya sebelum melakukan ekstrapolasi.

Dasbor tidak dapat melihat perincian di bawah tingkat hari dan individu. Dasbor dapat memberi tahu bahwa Opus digunakan hampir sepanjang hari Selasa. Namun, dasbor tidak dapat memberi tahu prompt, repository, atau pekerjaan CI yang menyebabkannya. Dasbor juga mengalami keterlambatan karena laporan organisasi diperbarui setiap hari. Jadi, dasbor lebih cocok sebagai alat peninjauan daripada sebagai cara untuk mendeteksi agent yang tidak terkendali pada sore ini. Untuk mendeteksi agent yang tidak terkendali, Anda memerlukan limit, bukan laporan. Hal itu dibahas dalam membatasi biaya agent pada VPS.

Bentuk 3: stack OpenTelemetry milik Anda sendiri menunjukkan prompt mana yang mengalami regresi

Claude Code menghasilkan metrik dan event OpenTelemetry setelah Anda menetapkan satu variabel lingkungan. Ini adalah satu-satunya opsi yang mengalirkan data token dan biaya per pengguna ke sistem yang Anda kendalikan hampir secara real time. Metrik tersebut mencakup claude_code.cost.usage dalam USD, claude_code.token.usage dalam token, claude_code.session.count, dan claude_code.active_time.total.

Metrik token adalah bagian yang paling berguna karena memiliki atribut. Setiap titik data memuat type, yaitu input, output, cacheRead, atau cacheCreation, serta model dan query_source, yaitu main, subagent, atau auxiliary. Data tersebut juga memuat agent.name, skill.name, mcp_server.name, dan mcp_tool.name. Informasi ini cukup untuk menjawab pertanyaan yang tidak dapat dijawab oleh dashboard mana pun: berapa bagian tagihan yang berasal dari subagent, bukan dari giliran Anda sendiri; apakah satu server MCP menggandakan token input; dan apakah pembacaan cache menurun setelah seseorang mengedit CLAUDE.md. Perilaku cache biasanya menjadi sumber kejutan. Kapan caching prompt mulai menghemat biaya menjelaskan cara membaca data tersebut.

Ada satu hal yang perlu diluruskan karena sering muncul dalam setiap diskusi tentang hal ini. Langfuse adalah backend tracing self-hosted yang baik, dan cara menjalankannya pada VPS dibahas dalam self-hosting Langfuse untuk tracing agent. Endpoint OTLP-nya hanya menerima trace. Claude Code mengekspor metrik dan event log, bukan span. Karena itu, mengarahkan OTEL_EXPORTER_OTLP_ENDPOINT ke Langfuse akan membuat project tetap kosong dan tidak menghasilkan error yang berguna untuk dibaca. Langfuse adalah pilihan yang tepat untuk agent yang Anda bangun sendiri melalui API, ketika kode Anda membuat setiap span beserta prompt, model, dan biayanya. Untuk CLI Claude Code, metrics store adalah pilihan yang sesuai.

Menyiapkan pelacakan penggunaan Claude Code di VPS sendiri

Dua service sudah cukup: collector untuk menerima metrik dan Prometheus untuk menyimpannya. Jangan expose keduanya ke Internet publik, karena port OTLP yang terbuka menerima penulisan dari siapa pun yang menemukannya. Tulis /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 adalah alamat server di dalam tunnel WireGuard. Dengan demikian, collector dapat diakses dari mesin Anda, tetapi tidak dari tempat lain. Alamat di depan port berperan penting karena port Docker yang dipublikasikan tidak difilter oleh ufw: lihat alasan port Docker yang dipublikasikan melewati ufw. Penyiapan tunnel itu sendiri dijelaskan di VPN WireGuard pada VPS sendiri.

/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 tidak pernah dipublikasikan ke host karena Prometheus mengakses collector melalui jaringan Compose menggunakan nama service:

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 collector seharusnya diakhiri dengan Everything is ready. Begin running and processing data.. Log yang berhenti karena error konfigurasi berarti YAML tidak berhasil di-parse, dan container akan terus restart dalam loop.

Sekarang arahkan Claude Code ke sana. Pada setiap mesin yang menjalankan Claude Code, tambahkan konfigurasi berikut ke ~/.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"
  }
}

Mulai sesi, kirim satu prompt, tunggu interval ekspor (10 detik di sini, 60 detik secara default), lalu minta Prometheus menampilkan data yang telah diterimanya:

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

Anda seharusnya mendapatkan beberapa nama yang diawali dengan claude_code_. Exporter mengubah titik menjadi garis bawah dan menambahkan unit, sehingga string persisnya bergantung pada versi collector Anda. Hasil kosong berarti belum ada data yang masuk. Pastikan protokol dan portnya sesuai, karena http/protobuf menggunakan port 4318 dan grpc menggunakan port 4317. Ketidaksesuaian akan gagal tanpa pesan yang jelas. Jalankan claude --debug. Log debug akan melaporkan error ekspor OTel.

Untuk satu mesin tanpa server, lewati semua langkah di atas. Atur OTEL_METRICS_EXPORTER=prometheus. Claude Code akan menyediakan endpoint scrape pada http://localhost:9464/metrics. Jika prometheus adalah satu-satunya exporter yang tercantum, Claude Code menghilangkan unit USD, tokens, dan s dari nama metrik agar hasil scrape tetap menggunakan format teks Prometheus yang valid.

Bentuk ini juga memiliki satu keputusan privasi. Secara default, hanya jumlah yang dikirim dari mesin. Tidak ada teks prompt atau output tool yang dikirim. OTEL_LOG_USER_PROMPTS=1 dan OTEL_LOG_TOOL_CONTENT=1 mengubah perilaku tersebut. Setelah diaktifkan, server metrik Anda dapat menyimpan source code dan data lain yang ada di dalam context. Aktifkan opsi tersebut secara sengaja, dan baca menjaga rahasia agar tidak masuk ke context agent terlebih dahulu.

Melacak pengeluaran untuk eksekusi skrip dan CI

Eksekusi non-interaktif sering menimbulkan kejutan karena tidak ada orang yang memantau layar. claude -p dengan --output-format json melaporkan biaya eksekusi tersebut dalam payload hasilnya:

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

Payload tersebut memuat total_cost_usd serta perincian per model. Dengan demikian, tugas CI dapat mencatat pengeluarannya sendiri tanpa menggunakan dashboard. Tambahkan nilainya ke file, atau kirimkan sebagai metrik ke collector di atas. Ini adalah pelacakan pengeluaran yang paling hemat dan tetap berguna. Setiap eksekusi hanya memerlukan satu pemanggilan jq.

Mode kegagalan dan hal yang akan Anda lihat

Laporan kosong. npx ccusage@latest daily tidak mencetak baris berarti program tersebut tidak membaca lokasi tempat Claude Code menulis data. CLAUDE_CONFIG_DIR memindahkan lokasi tersebut, dan parser harus diberi tahu tentang lokasi baru itu. Jika ada baris, tetapi datanya berhenti sekitar sebulan lalu, berarti cleanupPeriodDays bekerja sesuai desain: transkrip dihapus setelah 30 hari secara default.

Dua mesin melaporkan total yang berbeda. Hal ini wajar dan bukan bug. Baik /usage maupun parser log hanya membaca riwayat sesi lokal, sehingga penggunaan dari perangkat lain atau dari claude.ai tidak tercatat pada keduanya.

Total lokal tidak sama dengan tagihan. Angka lokal dihitung dari jumlah token menggunakan tarif daftar standar. Angka tersebut tidak memperhitungkan harga promosi atau diskon kontrak. Pada paket langganan, token Anda juga tidak ditagihkan satu per satu. Halaman penggunaan Console menjadi sumber otoritatif untuk penagihan API.

Biaya meningkat meskipun pekerjaan Anda sama. Periksa kolom cache terlebih dahulu. Sesi yang panjang mengirim ulang seluruh riwayatnya pada setiap giliran. Riwayat tersebut dikenai tarif cache selama cache masih aktif, lalu tarif input penuh setelah cache kedaluwarsa. Akibatnya, satu jeda panjang dapat memproses ulang seluruh percakapan. Hal ini terlihat sebagai angka input yang besar di samping angka output yang kecil. harga token input dibandingkan dengan output menjelaskan alasan keduanya dapat berubah secara independen.

Hari dengan subagent terlihat tidak masuk akal. Setiap subagent menjalankan jendela konteksnya sendiri. Karena itu, penggunaan token bergantung pada jumlah subagent yang berjalan dan durasi masing-masing. Hanya data OTel yang dapat memisahkan penggunaan tersebut, melalui atribut query_source pada claude_code.token.usage. Parser log hanya menampilkan total dan membuat Anda harus memperkirakan sisanya.

FAQ

Apakah ccusage menampilkan biaya yang benar-benar saya bayar pada paket Max?

Tidak. Dalam langganan, Anda tidak ditagih berdasarkan token. Karena itu, parser log menghitung harga token Anda menggunakan tarif API standar dan menampilkan biaya yang sama jika pekerjaan tersebut dilakukan melalui API. Nilai ini berguna sebagai ukuran relatif beban penggunaan harian serta untuk membandingkan proyek atau model. Untuk mengetahui jumlah yang harus dibayar, gunakan halaman penggunaan Console untuk penagihan API dan halaman penagihan paket untuk langganan.

Di mana Claude Code menyimpan file sesi yang dibaca oleh alat-alat ini?

Di ~/.claude/projects/<project>/<session-id>.jsonl. Di sana, <project> adalah path direktori kerja dengan karakter non-alfanumerik yang diganti menjadi -. Setiap baris adalah objek JSON untuk satu pesan, penggunaan alat, atau entri metadata. CLAUDE_CONFIG_DIR memindahkan seluruh direktori, sedangkan cleanupPeriodDays di settings.json mengatur retensi selama 30 hari. Anthropic mendokumentasikan format entri tersebut sebagai internal dan dapat berubah antarversi. Karena itu, gunakan alat yang dipelihara untuk menguraikannya, bukan skrip buatan sendiri.

Apakah saya dapat mengirim telemetri Claude Code ke Langfuse?

Tidak secara langsung. Endpoint OTLP Langfuse menerima trace, sedangkan Claude Code mengekspor metrik dan peristiwa log, bukan span. Karena itu, data tersebut tidak memiliki tujuan penyimpanan. Kirim metrik Claude Code ke collector OpenTelemetry, lalu simpan di Prometheus. Gunakan Langfuse untuk agent yang Anda buat sendiri melalui API, karena kode Anda dapat menghasilkan span yang memuat prompt, model, dan biaya.

Mengapa angka lokal saya tidak sama dengan halaman penggunaan Console?

Karena keduanya dihitung dengan cara berbeda. /usage dan parser log menjumlahkan jumlah token dari file sesi pada mesin yang sedang Anda gunakan, lalu menghitung harganya berdasarkan tarif standar. Console melaporkan jumlah yang benar-benar ditagihkan kepada organisasi Anda, dari semua mesin dan semua key, setelah diskon diterapkan. Perbedaan tersebut normal. Perbedaan yang sangat besar biasanya berarti ada perangkat kedua, runner CI, atau anggota tim lain yang menagihkan penggunaan ke akun yang sama.

Bagaimana cara melacak biaya eksekusi claude -p di CI?

Jalankan dengan --output-format json, lalu baca total_cost_usd dari hasilnya, misalnya menggunakan claude -p "..." --output-format json | jq '.total_cost_usd'. Payload yang sama juga memuat rincian per model dan ID sesi. Catat nilai tersebut untuk setiap job agar Anda memperoleh pengeluaran per pipeline tanpa agent, dashboard, atau service tambahan.