Monitoring Pack (Grafana)
OpenTremor Core exposes a /metrics endpoint on its own — see Metrics for the catalogue. This package is the pre-built Grafana dashboard and Prometheus/Grafana provisioning stack that turns those metrics into something you look at rather than query by hand.
Quick start with Docker Compose
Section titled “Quick start with Docker Compose”prometheus: image: prom/prometheus:v3.13.0 volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
grafana: image: grafana/grafana:13.1.0 environment: GF_SECURITY_ADMIN_PASSWORD: admin volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro - ./grafana/dashboards:/var/lib/grafana/dashboards:ro| Service | URL | Credentials |
|---|---|---|
| OpenTremor Core | http://localhost:8000 | — |
| Prometheus | http://localhost:9090 | — |
| Grafana | http://localhost:3000 | admin / admin |
The Grafana dashboard is provisioned automatically — open Dashboards → OpenTremor.
Organization filtering
Section titled “Organization filtering”Every metric carries an org_id label. The dashboard includes an Organization template variable (multi-select, defaults to “All”) at the top — every panel’s query is already scoped to it (org_id=~"$org_id"), so picking one or more orgs from the dropdown filters the entire dashboard at once, no per-panel editing needed. Requests that never resolve an org (health checks, public report links, the GitHub webhook, SSO callbacks before login) show up under _none.
Stack layout
Section titled “Stack layout”opentremor-monitoring/├── prometheus/│ └── prometheus.yml Scrape config (target: opentremor-core:8000)└── grafana/ ├── provisioning/ │ ├── datasources/prometheus.yml Auto-registers Prometheus datasource │ └── dashboards/dashboard.yml Points Grafana at the dashboards folder └── dashboards/ └── opentremor.json Pre-built dashboard (import manually if needed)Manual Grafana setup (existing instance)
Section titled “Manual Grafana setup (existing instance)”1 — Add the Prometheus datasource
Section titled “1 — Add the Prometheus datasource”In Grafana → Connections → Data sources → Add → Prometheus. Set the URL to where your Prometheus instance is reachable, e.g. http://prometheus:9090.
2 — Import the dashboard
Section titled “2 — Import the dashboard”In Grafana → Dashboards → Import → Upload JSON file. Upload grafana/dashboards/opentremor.json. Select the Prometheus datasource created in step 1, then click Import.
Dashboard panels
Section titled “Dashboard panels”| Section | Panel | PromQL highlight |
|---|---|---|
| HTTP Traffic | Request rate | rate(http_request_duration_seconds_count[2m]) |
| HTTP Traffic | Latency p50/p95/p99 | histogram_quantile(0.95, ...) |
| HTTP Traffic | 5xx error rate | ratio of status=~"5.." to total |
| HTTP Traffic | Rate by endpoint | grouped by handler |
| HTTP Traffic | Rate by status code | grouped by status |
| Analysis Pipeline | Ingest rate | rate(mcp_ingest_total[2m]) |
| Analysis Pipeline | Resources ingested/s | rate(mcp_ingested_resources_total[2m]) |
| Analysis Pipeline | Analysis submissions/s | rate(mcp_analysis_total[2m]) |
| Analysis Pipeline | LLM response time (p50/p95/p99) | histogram_quantile(0.95, rate(mcp_llm_analysis_duration_seconds_bucket[5m])) |
| Findings | By severity (stacked) | rate(mcp_findings_total[5m]) per severity |
| Findings | By resource type | rate(mcp_findings_total[5m]) per resource_type |
| Totals | Stat panels | Cumulative counters since last restart |
Kubernetes
Section titled “Kubernetes”Add a ServiceMonitor (if you use the Prometheus Operator) or annotate the pod for scraping:
podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "8000" prometheus.io/path: /metricsSee Helm (Kubernetes) for the full values reference.