Adds a committed Grafana dashboard JSON (docs/dashboards/soroban-billing.json) so on-call engineers can see Soroban billing deduction latency (P50/P95), error category breakdown, and call rate out of the box — no manual panel creation required.
docs/dashboards/soroban-billing.json— Grafana 11.5.2 dashboard with three rows: Deduction Latency, Error Category Breakdown, Call Rate & Throughputdocs/dashboards/README.md— Documents metric names, provenance, error category → HTTP status mapping, bucket boundaries, SLO thresholds, and import instructions
README.md— Observability section now links to both dashboards underdocs/dashboards/
| Row | Panels |
|---|---|
| Deduction Latency | P50/P95 line chart, P50 stat, P95 stat, bucket distribution bars |
| Error Category Breakdown | Rate by HTTP status (proxy for SorobanRpcErrorCategory), total error bar chart |
| Call Rate & Throughput | Total call rate, success rate gauge |
| Metric | Source file |
|---|---|
billing_deduct_duration_seconds |
src/metrics/registry.ts — recorded by billingDeductHistogramMiddleware |
http_requests_total |
src/metrics.ts — recorded by metricsMiddleware |
Labels used: route="/api/billing/deduct", status_code (maps to SorobanRpcErrorCategory).
The JSON can be validated with:
# Parse check
node -e "JSON.parse(require('fs').readFileSync('docs/dashboards/soroban-billing.json','utf8')); console.log('valid')"- No private data baked in (no hardcoded IPs, tokens, or secrets)
- Datasource UID is a
$datasourcetemplate variable — resolves at import time - Grafana version pinned to
11.5.2in__requires
closes #415