Dashboards
Grafana dashboards are auto-provisioned from
configs/grafana/provisioning/dashboards/, so a deployment gets a working set
the moment the stack starts — no manual import. The Grafana file provider has
foldersFromFilesStructure: true, so dashboards placed in a subdirectory land
in a folder named after that subdirectory.
The 9 dashboards are grouped into two folders:
- General folder — 5 service dashboards at the root of
dashboards/. (The file provider creates noapplication/subdirectory, so these land in the defaultGeneralfolder.) - Observability folder — 4 stack-health dashboards in
dashboards/observability/.
First time opening Grafana
You do this once after deploy.
- Browse to
https://<your-domain>/grafana/(the Kong route at/grafana/). - Keycloak SSO redirects you to the realm login — sign in with your normal
realm user (e.g. an
adminrealm role is required to see admin-only dashboards). - The default landing dashboard is Service health (set by
GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH).
The local
GRAFANA_ADMIN_USER/GRAFANA_ADMIN_PASSWORDform is a break-glass login (login form disabled byGF_AUTH_DISABLE_LOGIN_FORM=true). To enable it for emergency access, setGF_AUTH_DISABLE_LOGIN_FORM=falseindocker-compose.yamland restart Grafana.
General folder — service dashboards
Operational views of the GENIE.AI services themselves.
| Dashboard | What it shows |
|---|---|
| Service health | Per-service up/down, replica count, error rate, request rate. The landing view for “is anything broken?”. |
| Application metrics | Business and HTTP metrics: http_requests_total, http_request_duration_seconds, error rates, custom counters. |
| Service logs | Centralised log search across all services (VictoriaLogs). Pivot from a metric spike to the matching logs. |
| Trace explorer | Distributed-trace search (VictoriaTraces via the Jaeger datasource): filter by service, operation, duration, attribute. |
| RAG pipeline trace waterfall | A waterfall charting per-service latency across the RAG pipeline (backend, chatqna, retriever, reranker, dataprep), so the slow stage is immediately visible. |
[Screenshot placeholder — Service health overview]
Observability folder — stack-health dashboards
Health of the observability stack itself — so the monitoring does not fail silently.
| Dashboard | What it shows |
|---|---|
| Observability stack health | Collector up/down, ingestion rates, export errors across all three stores. Powered by the collector’s self-telemetry (otelcol_*) and each Victoria store’s self-metrics. |
| VictoriaMetrics single-node | VM ingestion rate, series count, cache hit rate, free disk. |
| VictoriaLogs single-node | VL ingestion rate, rows indexed, free disk. |
| VictoriaTraces single-node | VT trace ingestion rate, bytes ingested, free disk. |
[Screenshot placeholder — Observability stack health]
Pivoting between dashboards
The dashboards share a common tag set (service.name, service.namespace,
component) so pivots work out of the box:
- A metric spike on Application metrics → the matching trace on Trace explorer (or RAG pipeline trace waterfall for chat queries).
- A trace span on Trace explorer → its logs on Service logs (by trace_id) or its metrics on Application metrics (by service name + time window).
- A panel showing “no data” on Application metrics → the Observability stack health dashboard to confirm the collector is still ingesting.
How to actually pivot
Click any data point in a panel → Inspect or Drilldown → pick the linked datasource (Jaeger, VictoriaLogs, or VictoriaMetrics). The tag set is preserved so the linked query opens with the same service/namespace/time window pre-filled.
Empty panels — the most common new-deploy symptom
Empty panels usually mean the metric has not been emitted yet. Send a few chat queries through the UI, then reload. If panels stay empty after an hour, check the Observability stack health dashboard for ingestion errors and the Alerting page for firing rules.
The backend metrics http_requests_total and http_request_duration_seconds
start at zero on a fresh deploy and only accumulate once Express middleware
has recorded requests.
Customising
Dashboards are JSON files under configs/grafana/provisioning/dashboards/.
The Grafana file provider scans the directory every 30 seconds
(updateIntervalSeconds: 30 in dashboards.yml) — edits to the bind-mounted
JSON appear in Grafana without a restart. To add a net-new dashboard, drop a
JSON file in the folder (or a subdirectory for a custom folder); the
dashboards.yml provider picks it up on the next scan.
If your edit does not appear after a minute, the JSON is invalid — check
Grafana’s container logs (docker service logs genieai_grafana --tail 50)
for parse errors.
Adding a new dashboard
- Export or author a JSON file matching the Grafana schema.
- Save it under
configs/grafana/provisioning/dashboards/(or a subdirectory to control the folder name). - Within 30 seconds it appears in Grafana → Dashboards → Manage.
Next steps
Once dashboards look healthy, wire up alerting — see Alerting for the built-in rules and how to add a contact point.