What problem does this solve?
deploy/grafana/provisioning/dashboards/ exists but is empty. The Prometheus datasource is already provisioned and all metrics are already being emitted by the app (app/core/metrics.py), but when a user starts the observability stack they get a blank Grafana instance with no dashboards. They have to build every panel by hand.
The docs show a screenshot of a working dashboard and say it ships pre-provisioned — adding that part.
Proposed solution
Add two files:
deploy/grafana/provisioning/dashboards/dashboards.yml — the Grafana dashboard provider config that tells Grafana to load JSON files from the provisioning directory. Without this file Grafana ignores any JSON placed there.
deploy/grafana/provisioning/dashboards/inference-engine.json — a Grafana dashboard JSON covering all metrics already defined in app/core/metrics.py:
| Panel |
Metric |
Type |
| Request rate |
inference_requests_total |
Time series, by model/tenant |
| Error rate |
inference_errors_total |
Time series, by error_type |
| p50 / p95 / p99 latency |
inference_latency_seconds |
Time series (histogram_quantile) |
| Executor in-flight |
executor_inflight |
Gauge, by device |
| Executor timeouts |
executor_timeouts_total |
Time series, by device |
| Job queue depth |
job_queue_depth |
Time series, by model/version |
| Error % stat |
errors / requests ratio |
Stat panel |
No changes to docker-compose.yml are needed — the Grafana service already mounts ./deploy/grafana/provisioning:/etc/grafana/provisioning:ro.
Expected result: docker compose --profile observability up -d → Grafana at localhost:3000 shows the "Inference Engine" dashboard with all panels populated after the first scrape (15s). No manual import step.
Alternatives considered
No response
Area
Observability (metrics / logs / tracing)
What problem does this solve?
deploy/grafana/provisioning/dashboards/exists but is empty. The Prometheus datasource is already provisioned and all metrics are already being emitted by the app (app/core/metrics.py), but when a user starts the observability stack they get a blank Grafana instance with no dashboards. They have to build every panel by hand.The docs show a screenshot of a working dashboard and say it ships pre-provisioned — adding that part.
Proposed solution
Add two files:
deploy/grafana/provisioning/dashboards/dashboards.yml— the Grafana dashboard provider config that tells Grafana to load JSON files from the provisioning directory. Without this file Grafana ignores any JSON placed there.deploy/grafana/provisioning/dashboards/inference-engine.json— a Grafana dashboard JSON covering all metrics already defined inapp/core/metrics.py:inference_requests_totalmodel/tenantinference_errors_totalerror_typeinference_latency_secondsexecutor_inflightdeviceexecutor_timeouts_totaldevicejob_queue_depthmodel/versionNo changes to
docker-compose.ymlare needed — the Grafana service already mounts./deploy/grafana/provisioning:/etc/grafana/provisioning:ro.Expected result:
docker compose --profile observability up -d→ Grafana atlocalhost:3000shows the "Inference Engine" dashboard with all panels populated after the first scrape (15s). No manual import step.Alternatives considered
No response
Area
Observability (metrics / logs / tracing)