Dashboard Guide

The Bloop dashboard is a single-page application served at the root URL of your Bloop instance.

Main View

Bloop dashboard main view showing stats bar, trend chart, filters, and error list

Error Detail

Error detail panel showing stack trace, metadata, and action buttons

Click any error row to see the detail view:

Settings

Settings panel showing projects, alerts, and admin controls

Click the gear icon in the header to open the settings panel (admin only):

Insights Panel

When the analytics feature is enabled (--features analytics), an Insights button appears in the header. The button is hidden when analytics is not compiled in — the dashboard probes /v1/analytics/spikes on load and only shows the button if it gets a 200 response.

The Insights panel has five sub-tabs:

Results are cached for 60 seconds (configurable via cache_ttl_secs). All queries respect the active project filter.

LLM Tracing Panel

When LLM tracing is enabled (--features llm-tracing), an LLM button appears in the header. Like Insights, it auto-detects by probing /v1/llm/overview?hours=1 on load.

Bloop is provider-agnostic — it works with any LLM you use: OpenAI (GPT-4o, o1, etc.), Anthropic (Claude), Google (Gemini), Mistral, Cohere, LLaMA, or any local/self-hosted model. You pass the model name and provider as strings when creating traces, so Bloop tracks whatever your code reports.

The LLM panel has eight sub-tabs:

Overview

LLM Overview tab showing total traces, tokens, cost, and error rate

Summary cards showing total traces, total spans, tokens consumed, cost in dollars, average latency, and error rate for the selected time window.

Usage

LLM Usage tab showing hourly token and cost breakdown by model

Hourly breakdown of token consumption and cost, grouped by model. Each row shows the hour bucket, model name, request count, input/output tokens, and total cost.

Latency

Latency percentiles (p50, p90, p99) by model, plus average time-to-first-token. Useful for identifying slow models or degraded performance.

Models

Per-model comparison table: total calls, tokens consumed, cost, average latency, and error rate. Sorted by cost to quickly identify the most expensive models.

Traces

LLM Traces tab showing paginated trace list with expandable span details

Paginated list of all LLM traces with status badges, model info, token counts, cost, and latency. Click any trace to expand its full span hierarchy with parent-child relationships.

Search

LLM Search tab with full-text search across trace names and content

Full-text search across trace names, input, and output content. Results show matching traces with highlighted context.

Prompts

LLM Prompts tab showing prompt version tracking with metrics

Prompt version tracking table: prompt name, latest version, total traces, average latency, average tokens, cost, and error rate. Useful for comparing prompt performance across versions.

Scores

LLM Scores tab showing quality scores with color-coded bars

Score cards showing quality metrics attached to traces. Each card displays the score name, count, average value (with color-coded bar: red < 0.3, amber 0.3–0.7, green > 0.7), min, and max values.

Enabling LLM Tracing

bash
# Build with LLM tracing enabled
docker build --build-arg FEATURES=llm-tracing -t bloop .

# Or enable both analytics and LLM tracing
docker build --build-arg FEATURES=analytics,llm-tracing -t bloop .

# Configure in config.toml
[llm_tracing]
enabled = true
default_content_storage = "metadata_only"

Content storage policies control what gets persisted: none (no prompts/completions), metadata_only (tokens and costs only), or full (everything). Set per-project via the Settings panel or API.

Error Lifecycle

Every error in Bloop has a status that tracks its lifecycle:

StatusMeaningAlerts fire?
unresolvedActive issue that needs attentionYes
resolvedFixed and deployedYes (regression)
ignoredKnown issue, not worth fixingNo
mutedTemporarily silencedNo

Status Transitions

All status changes are recorded in an audit trail visible in the error detail view.

Regression Detection

If a resolved error receives a new occurrence, Bloop can detect the regression. The error appears again in the unresolved list with its full history preserved.

API

bash
# Resolve
curl -X POST http://localhost:5332/v1/errors/FINGERPRINT/resolve \
  -H "Cookie: session=YOUR_SESSION_TOKEN"

# Mute
curl -X POST http://localhost:5332/v1/errors/FINGERPRINT/mute \
  -H "Cookie: session=YOUR_SESSION_TOKEN"

# Unresolve
curl -X POST http://localhost:5332/v1/errors/FINGERPRINT/unresolve \
  -H "Cookie: session=YOUR_SESSION_TOKEN"

# View status history
curl http://localhost:5332/v1/errors/FINGERPRINT/history \
  -H "Cookie: session=YOUR_SESSION_TOKEN"

Troubleshooting

Common Issues

ProblemCauseSolution
401 Unauthorized on ingest HMAC signature doesn't match Ensure you're signing the exact request body with the correct API key. The signature must be a hex-encoded HMAC-SHA256 of the raw JSON body.
401 invalid project key API key not recognized Check the X-Project-Key header matches a project's API key in Settings → Projects. Keys are case-sensitive.
Events accepted but not appearing Buffer full or processing delay Check /health endpoint — if buffer_usage is near 1.0, the pipeline is backed up. Events are batched every 2 seconds.
Passkey registration fails rp_id / rp_origin mismatch The rp_id must match your domain (e.g., errors.myapp.com) and rp_origin must match the full URL including protocol.
Source maps not deobfuscating Release version mismatch The release in the source map upload must exactly match the release field sent with the error event.
Slack notifications not arriving Webhook URL expired or channel archived Test the alert via Settings → Alerts → Test. Check that the Slack app is still installed and the channel exists.
Dashboard shows stale data Browser caching Hard refresh (Cmd+Shift+R / Ctrl+Shift+R). Stats auto-refresh every 30 seconds.
High memory usage Large moka cache Source maps and aggregates are cached in memory. Restart the server to clear caches, or reduce the number of uploaded source maps.
500 Unable To Extract Key! Rate limiter can't determine client IP This happens when running behind a reverse proxy (Traefik, Nginx) that doesn't forward client IP headers. Upgrade to the latest Bloop release, which uses SmartIpKeyExtractor to read X-Forwarded-For and X-Real-IP headers automatically.
403 Forbidden with bearer token Token lacks required scope Check the token's scopes. Read operations require *:read scopes, write operations require *:write scopes. Create a new token with the needed scopes.

Checking Server Health

bash
curl http://localhost:5332/health | jq .

# Response:
# {
#   "status": "ok",
#   "db_ok": true,
#   "buffer_usage": 0.002
# }

buffer_usage shows the MPSC channel fill ratio (0.0 = empty, 1.0 = full). If consistently above 0.5, consider increasing ingest.channel_capacity or pipeline.flush_batch_size.

Debug Logging

bash
# Enable detailed logging
RUST_LOG=bloop=debug cargo run

# Or in Docker
docker run -e RUST_LOG=bloop=debug ...

Debug logging shows every ingested event, fingerprint computation, batch write, and alert evaluation.