Metrics & OpenTelemetry
See review activity, finding outcomes, latency, token usage, and recorded cost in Bubo’s local HTML dashboard. OpenTelemetry provides the accompanying operational measurements.
Open your dashboard
For a live local view:
bubo ui-serve --root /path/to/bubo-rootOpen the printed localhost URL. Activity refreshes every five seconds while this command runs. Stop it with Ctrl-C. It reads your database without changing it. Automatic package updates wait until this command closes.
For a portable offline snapshot:
bubo ui-export --root /path/to/bubo-root --out ./bubo-metricsOpen bubo-metrics/index.html in your browser. The page works offline and reads a
snapshot of your local review history. Re-run the command to refresh it; no server
or collector setup is needed.
- Dashboard — live recorded activity, model families and usage, duration statistics, security and finding classifications, observed outcomes, governance evidence, reconciliation, database inventory, and an editable potential ROI scenario.
- Reports — compare the last 24 hours, 7 days, or 30 days; inspect finding outcomes and review efficiency.
- Reviews — open an individual review for findings, provenance, and usage.
The export stays local and works regardless of telemetry preferences. It can
contain repository names and review details, so share it as you would a review
report. For JSON or CSV, use bubo report.
Reading the numbers
Dashboard comparisons use finished successful production runs; dry runs and
unknown or unfinished states are excluded from terminal success/failure rates.
Successful duration uses non-negative finish-minus-start spans. Percentiles
interpolate at (n − 1) × p; sample count and population standard deviation
make the coverage visible. Detailed reports also retain all-run summaries. Missing observations
and zero denominators display as unavailable, not zero success.
Outcome percentages divide each flag count by observed outcomes for the selected finding cohort. Flags overlap; a resolved discussion does not prove a code fix. Security counts use Bubo’s canonical category taxonomy. Governance and provenance are recorded evidence, not compliance certification.
Cost and token totals show how many runs have recorded values. Missing cost is unknown, not free usage. Model families are inferred from stored model names, not the API host. Potential ROI uses successful production runs and your explicit minutes, hourly value and other cost assumptions; its formulas and incomplete-cost warning are visible beside it.
Runs are selected by start time, findings/reconciliations by latest update, and policy decisions by creation time. The dashboard lists every application table’s all-time row count. It summarizes stored structured fields; it does not dump credentials, prompt text or raw provenance signals. It cannot reconstruct history that the database overwrites or infer unrecorded vulnerabilities. Very large cohorts show an explicit unavailable notice instead of partial statistics; the three windows share a 50,000-row processing budget.
OpenTelemetry measurements carry the installed Bubo version. The installation identity stays consistent across upgrades.
Preferences
Delivery follows your telemetry preferences. The local HTML dashboard remains available with delivery disabled.
Cost
Bubo reads usage from the agent CLI’s machine-readable output (codex exec --json,
claude -p --output-format json) and adds that flag to a known reviewer command
itself.
- Claude: each run records the cost Claude Code reports for it.
- Codex: Codex reports tokens but no cost. Bubo prices them for
llm_modelfrom LiteLLM’s public price list, fetched at most once a day and cached next to the database. If the download fails, the cached copy is used.
A review’s cost covers every agent call it makes: the review itself, finding
verification, fixed-finding reconciliation, and the classifier that later reads
developer replies to its findings. Each call is also logged as an agent_usage
event with its operation.
Optional measurement and pricing settings:
[telemetry]
export_interval_seconds = 30
emit_finding_events = true
emit_outcome_sync = true
# Set false to skip the price list download and use the prices below for every model.
live_pricing = true
# Used for models the price list does not know, or always when live_pricing = false.
input_per_1m = 1.0
output_per_1m = 2.0Prices are illustrative USD per million tokens. See the configuration reference for all settings.