fix(observability): finish Jaeger→Tempo migration across satellite files

The Jaeger→Tempo swap landed in the authoritative places (compose.yml,
stack.toml, infra/grafana) but several satellites still referenced the
removed `jaeger` service:

- deploy.sh Tier-4 ran `up jaeger loki prometheus` — `jaeger` no longer
  exists, so `docker compose up` errored ("no such service") and aborted
  the observability tier, taking loki/prometheus on that line with it.
- bootstrap_certs.py provisioned a cert for the dead jaeger.fhirworx.io
  and never provisioned tempo.fhirworx.io.
- README (template + generated), the nginx dashboard tile, and the Gitea
  home tile all advertised a Jaeger URL that no longer resolves.
- dev/seeds/grafana/ was a stale, unmounted, unreferenced duplicate of
  infra/grafana still carrying a jaeger datasource — removed as dead.

All now point at tempo. README regenerated from the template.
This commit is contained in:
kert
2026-07-08 10:08:08 -04:00
parent cc6feca253
commit 58f49cb293
11 changed files with 15 additions and 1088 deletions

View File

@@ -2,7 +2,7 @@
![coverage](assets/icons/coverage.svg) ![coverage](assets/icons/coverage.svg)
Healthcare analytics platform on self-hosted infrastructure. Replaces dbt SQL models with narwhals DataFrame-agnostic expression functions, backed by DuckDB locally and Iceberg/Trino in the lakehouse. 29 services, 14 data pipelines, 13,844 tests at 99% coverage. Healthcare analytics platform on self-hosted infrastructure. Replaces dbt SQL models with narwhals DataFrame-agnostic expression functions, backed by DuckDB locally and Iceberg/Trino in the lakehouse. 29 services, 14 data pipelines, 13,847 tests at 99% coverage.
## Quick start ## Quick start
@@ -57,7 +57,7 @@ All services route through Traefik at `*.fhirworx.io`.
| Trino | `trino.fhirworx.io` | Distributed SQL engine | | Trino | `trino.fhirworx.io` | Distributed SQL engine |
| Grafana | `grafana.fhirworx.io` | Dashboards | | Grafana | `grafana.fhirworx.io` | Dashboards |
| Prometheus | `prometheus.fhirworx.io` | Metrics | | Prometheus | `prometheus.fhirworx.io` | Metrics |
| Jaeger | `jaeger.fhirworx.io` | Distributed tracing | | Tempo | `tempo.fhirworx.io` | Distributed tracing |
| Loki | `loki.fhirworx.io` | Log aggregation | | Loki | `loki.fhirworx.io` | Log aggregation |
## Analytics platform ## Analytics platform
@@ -165,6 +165,7 @@ The generator reads image definitions from `stack.toml [images]`, dispatches to
| `infra-ci.yml` | Path-filtered push | Hadolint Dockerfiles, dry-run builds | | `infra-ci.yml` | Path-filtered push | Hadolint Dockerfiles, dry-run builds |
| `release.yml` | Tag (`v*`) | `uv build` + release | | `release.yml` | Tag (`v*`) | `uv build` + release |
| `pkg-supply-chain.yml` | Daily / push | Package inventory, mirror sync, drift detection, vuln scan | | `pkg-supply-chain.yml` | Daily / push | Package inventory, mirror sync, drift detection, vuln scan |
| `renovate.yml` | Cron / manual | Renovate dependency-update PRs |
### Secret mapping ### Secret mapping
@@ -222,7 +223,7 @@ ROOT_KEY=$KEY uv run python -m api.auth derive $COMMIT_SHA --redact
| `gateway` | external | Traefik, all public-facing | | `gateway` | external | Traefik, all public-facing |
| `storage` | internal | PostgreSQL, RustFS | | `storage` | internal | PostgreSQL, RustFS |
| `data` | internal | Nessie, Trino, Polaris | | `data` | internal | Nessie, Trino, Polaris |
| `observability` | internal | Grafana, Prometheus, Jaeger, Loki | | `observability` | internal | Grafana, Prometheus, Tempo, Loki |
| `ci` | external | Gitea, Act Runner, RustFS | | `ci` | external | Gitea, Act Runner, RustFS |
## Design system ## Design system
@@ -417,7 +418,7 @@ The hook classifies staged files and runs only what is relevant:
| `src/sem/*.py` | `tests/sem/` + `test_ast_coverage.py` | Module tests + structural invariants | | `src/sem/*.py` | `tests/sem/` + `test_ast_coverage.py` | Module tests + structural invariants |
| `src/aco/*.py` + `src/sem/*.py` | `tests/aco/` + `tests/sem/` + structural | Both module test dirs | | `src/aco/*.py` + `src/sem/*.py` | `tests/aco/` + `tests/sem/` + structural | Both module test dirs |
| `tests/bib/test_sync.py` | `tests/bib/` | Changed test dir | | `tests/bib/test_sync.py` | `tests/bib/` | Changed test dir |
| `pyproject.toml` or `conftest.py` | Full suite (13,844+ tests) | Infrastructure change | | `pyproject.toml` or `conftest.py` | Full suite (13,847+ tests) | Infrastructure change |
| `notebooks/pfs_calcs.py` | `marimo check` + notebook execution | Notebook validation only | | `notebooks/pfs_calcs.py` | `marimo check` + notebook execution | Notebook validation only |
| `README.md` only | Nothing | No testable changes | | `README.md` only | Nothing | No testable changes |
@@ -512,7 +513,7 @@ stack/
│ ├── hooks/ Git hooks (tracked, core.hooksPath = dev/hooks) │ ├── hooks/ Git hooks (tracked, core.hooksPath = dev/hooks)
│ ├── seeds/ Reference data (BCDA samples, CMS docs) │ ├── seeds/ Reference data (BCDA samples, CMS docs)
│ └── pipelines/ CI-agnostic pipeline specs │ └── pipelines/ CI-agnostic pipeline specs
├── tests/ 13,844 tests at 99% coverage ├── tests/ 13,847 tests at 99% coverage
├── notebooks/ Marimo notebooks ├── notebooks/ Marimo notebooks
├── docs/ Docusaurus site ├── docs/ Docusaurus site
├── data/ DuckDB, bib.sqlite, BCDA/CMS data, zotero (gitignored) ├── data/ DuckDB, bib.sqlite, BCDA/CMS data, zotero (gitignored)

View File

@@ -61,7 +61,7 @@ All services route through Traefik at `*.fhirworx.io`.
| Trino | `trino.fhirworx.io` | Distributed SQL engine | | Trino | `trino.fhirworx.io` | Distributed SQL engine |
| Grafana | `grafana.fhirworx.io` | Dashboards | | Grafana | `grafana.fhirworx.io` | Dashboards |
| Prometheus | `prometheus.fhirworx.io` | Metrics | | Prometheus | `prometheus.fhirworx.io` | Metrics |
| Jaeger | `jaeger.fhirworx.io` | Distributed tracing | | Tempo | `tempo.fhirworx.io` | Distributed tracing |
| Loki | `loki.fhirworx.io` | Log aggregation | | Loki | `loki.fhirworx.io` | Log aggregation |
## Analytics platform ## Analytics platform
@@ -158,6 +158,7 @@ The generator reads image definitions from `stack.toml [images]`, dispatches to
| `infra-ci.yml` | Path-filtered push | Hadolint Dockerfiles, dry-run builds | | `infra-ci.yml` | Path-filtered push | Hadolint Dockerfiles, dry-run builds |
| `release.yml` | Tag (`v*`) | `uv build` + release | | `release.yml` | Tag (`v*`) | `uv build` + release |
| `pkg-supply-chain.yml` | Daily / push | Package inventory, mirror sync, drift detection, vuln scan | | `pkg-supply-chain.yml` | Daily / push | Package inventory, mirror sync, drift detection, vuln scan |
| `renovate.yml` | Cron / manual | Renovate dependency-update PRs |
### Secret mapping ### Secret mapping
@@ -215,7 +216,7 @@ ROOT_KEY=$KEY uv run python -m api.auth derive $COMMIT_SHA --redact
| `gateway` | external | Traefik, all public-facing | | `gateway` | external | Traefik, all public-facing |
| `storage` | internal | PostgreSQL, RustFS | | `storage` | internal | PostgreSQL, RustFS |
| `data` | internal | Nessie, Trino, Polaris | | `data` | internal | Nessie, Trino, Polaris |
| `observability` | internal | Grafana, Prometheus, Jaeger, Loki | | `observability` | internal | Grafana, Prometheus, Tempo, Loki |
| `ci` | external | Gitea, Act Runner, RustFS | | `ci` | external | Gitea, Act Runner, RustFS |
## Design system ## Design system

View File

@@ -129,7 +129,7 @@ up act-runner
# ── Tier 4: Observability ────────────────────────────────────────── # ── Tier 4: Observability ──────────────────────────────────────────
log "Tier 4: Observability" log "Tier 4: Observability"
up jaeger loki prometheus up tempo loki prometheus
up promtail otel-collector grafana up promtail otel-collector grafana
# ── Tier 5: Remaining services ───────────────────────────────────── # ── Tier 5: Remaining services ─────────────────────────────────────

View File

@@ -51,7 +51,7 @@ HOSTS_SUBDOMAINS = [
"zotero", "zotero",
"webdav", "webdav",
"prometheus", "prometheus",
"jaeger", "tempo",
"loki", "loki",
"nessie", "nessie",
"trino", "trino",

View File

@@ -1,22 +0,0 @@
[server]
root_url = http://localhost:3001
[security]
admin_user = admin
admin_password = admin
[users]
allow_sign_up = false
[auth.anonymous]
enabled = true
org_role = Viewer
[dashboards]
default_home_dashboard_path = /var/lib/grafana/dashboards/homelab-overview.json
[unified_alerting]
enabled = true
[feature_toggles]
enable = traceqlEditor tempoServiceGraph traceQLStreaming

View File

@@ -1,356 +0,0 @@
{
"annotations": {
"list": []
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": null,
"links": [],
"panels": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 4,
"w": 24,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"dedupStrategy": "none",
"enableLogDetails": true,
"prettifyLogMessage": false,
"showCommonLabels": false,
"showLabels": false,
"showTime": true,
"sortOrder": "Descending",
"wrapLogMessage": false
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "builder",
"expr": "{job=\"containerlogs\"} |= ``",
"queryType": "range",
"refId": "A"
}
],
"title": "All Container Logs",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 6,
"w": 12,
"x": 0,
"y": 4
},
"id": 2,
"options": {
"dedupStrategy": "none",
"enableLogDetails": true,
"prettifyLogMessage": false,
"showCommonLabels": false,
"showLabels": true,
"showTime": true,
"sortOrder": "Descending",
"wrapLogMessage": false
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{container_name=~\"gitea.*\"} |= ``",
"queryType": "range",
"refId": "A"
}
],
"title": "Git & CI Logs",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 4
},
"id": 3,
"options": {
"dedupStrategy": "none",
"enableLogDetails": true,
"prettifyLogMessage": false,
"showCommonLabels": false,
"showLabels": true,
"showTime": true,
"sortOrder": "Descending",
"wrapLogMessage": false
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{container_name=~\"nessie|trino\"} |= ``",
"queryType": "range",
"refId": "A"
}
],
"title": "Data Lake Logs",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 6,
"w": 12,
"x": 0,
"y": 10
},
"id": 4,
"options": {
"dedupStrategy": "none",
"enableLogDetails": true,
"prettifyLogMessage": false,
"showCommonLabels": false,
"showLabels": true,
"showTime": true,
"sortOrder": "Descending",
"wrapLogMessage": false
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{container_name=~\"postgres|rustfs\"} |= ``",
"queryType": "range",
"refId": "A"
}
],
"title": "Storage Logs",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 6,
"w": 12,
"x": 12,
"y": 10
},
"id": 5,
"options": {
"dedupStrategy": "none",
"enableLogDetails": true,
"prettifyLogMessage": false,
"showCommonLabels": false,
"showLabels": true,
"showTime": true,
"sortOrder": "Descending",
"wrapLogMessage": false
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{job=\"containerlogs\"} |~ \"error|Error|ERROR|exception|Exception|EXCEPTION|failed|Failed|FAILED\"",
"queryType": "range",
"refId": "A"
}
],
"title": "Errors Across All Services",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "bars",
"fillOpacity": 50,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "normal"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 24,
"x": 0,
"y": 16
},
"id": 6,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (container_name) (count_over_time({job=\"containerlogs\"} [1m]))",
"queryType": "range",
"refId": "A"
}
],
"title": "Log Volume by Container",
"type": "timeseries"
},
{
"datasource": {
"type": "jaeger",
"uid": "jaeger"
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 22
},
"id": 7,
"options": {},
"targets": [
{
"datasource": {
"type": "jaeger",
"uid": "jaeger"
},
"queryType": "search",
"refId": "A",
"service": "$service",
"limit": 20
}
],
"title": "Recent Traces",
"type": "traces"
}
],
"refresh": "5s",
"schemaVersion": 39,
"tags": ["homelab", "observability"],
"templating": {
"list": [
{
"current": {
"selected": true,
"text": "nessie",
"value": "nessie"
},
"datasource": {
"type": "jaeger",
"uid": "jaeger"
},
"definition": "services",
"hide": 0,
"includeAll": false,
"label": "Service",
"multi": false,
"name": "service",
"options": [],
"query": "services",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"sort": 1,
"type": "query"
}
]
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "browser",
"title": "Homelab Overview",
"uid": "homelab-overview",
"version": 1,
"weekStart": ""
}

View File

@@ -1,652 +0,0 @@
{
"annotations": {
"list": []
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 1,
"links": [],
"panels": [
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 },
"id": 100,
"title": "Overview",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null }
]
},
"unit": "reqps"
},
"overrides": []
},
"gridPos": { "h": 4, "w": 6, "x": 0, "y": 1 },
"id": 1,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": ["lastNotNull"],
"fields": "",
"values": false
},
"textMode": "auto"
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_entrypoint_requests_total[5m]))",
"refId": "A"
}
],
"title": "Requests / sec",
"type": "stat"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null }
]
},
"unit": "short"
},
"overrides": []
},
"gridPos": { "h": 4, "w": 6, "x": 6, "y": 1 },
"id": 2,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": ["lastNotNull"],
"fields": "",
"values": false
},
"textMode": "auto"
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(traefik_open_connections)",
"refId": "A"
}
],
"title": "Open Connections",
"type": "stat"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "thresholds" },
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null },
{ "color": "yellow", "value": 0.01 },
{ "color": "red", "value": 0.05 }
]
},
"unit": "percentunit"
},
"overrides": []
},
"gridPos": { "h": 4, "w": 6, "x": 12, "y": 1 },
"id": 3,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": ["lastNotNull"],
"fields": "",
"values": false
},
"textMode": "auto"
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_entrypoint_requests_total{code=~\"5..\"}[5m])) / sum(rate(traefik_entrypoint_requests_total[5m])) or vector(0)",
"refId": "A"
}
],
"title": "Error Rate (5xx)",
"type": "stat"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{ "color": "green", "value": null }
]
},
"unit": "s"
},
"overrides": []
},
"gridPos": { "h": 4, "w": 6, "x": 18, "y": 1 },
"id": 4,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": ["lastNotNull"],
"fields": "",
"values": false
},
"textMode": "auto"
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "histogram_quantile(0.95, sum(rate(traefik_entrypoint_request_duration_seconds_bucket[5m])) by (le))",
"refId": "A"
}
],
"title": "P95 Latency",
"type": "stat"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 },
"id": 101,
"title": "Requests",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "reqps"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 },
"id": 5,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_entrypoint_requests_total[5m])) by (entrypoint)",
"legendFormat": "{{entrypoint}}",
"refId": "A"
}
],
"title": "Requests by Entrypoint",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "normal" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "reqps"
},
"overrides": [
{ "matcher": { "id": "byRegexp", "options": "2.." }, "properties": [{ "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }] },
{ "matcher": { "id": "byRegexp", "options": "3.." }, "properties": [{ "id": "color", "value": { "fixedColor": "blue", "mode": "fixed" } }] },
{ "matcher": { "id": "byRegexp", "options": "4.." }, "properties": [{ "id": "color", "value": { "fixedColor": "yellow", "mode": "fixed" } }] },
{ "matcher": { "id": "byRegexp", "options": "5.." }, "properties": [{ "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } }] }
]
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 },
"id": 6,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_entrypoint_requests_total[5m])) by (code)",
"legendFormat": "{{code}}",
"refId": "A"
}
],
"title": "Requests by Status Code",
"type": "timeseries"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 14 },
"id": 102,
"title": "Services",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "reqps"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 15 },
"id": 7,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_service_requests_total[5m])) by (service)",
"legendFormat": "{{service}}",
"refId": "A"
}
],
"title": "Requests by Service",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "s"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 15 },
"id": 8,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "histogram_quantile(0.95, sum(rate(traefik_service_request_duration_seconds_bucket[5m])) by (le, service))",
"legendFormat": "{{service}}",
"refId": "A"
}
],
"title": "P95 Latency by Service",
"type": "timeseries"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 23 },
"id": 103,
"title": "Routers",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "reqps"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 24 },
"id": 9,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_router_requests_total[5m])) by (router)",
"legendFormat": "{{router}}",
"refId": "A"
}
],
"title": "Requests by Router",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "s"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 24 },
"id": 10,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "right", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "histogram_quantile(0.95, sum(rate(traefik_router_request_duration_seconds_bucket[5m])) by (le, router))",
"legendFormat": "{{router}}",
"refId": "A"
}
],
"title": "P95 Latency by Router",
"type": "timeseries"
},
{
"gridPos": { "h": 1, "w": 24, "x": 0, "y": 32 },
"id": 104,
"title": "Bandwidth",
"type": "row"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "Bps"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 33 },
"id": 11,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_entrypoint_requests_bytes_total[5m])) by (entrypoint)",
"legendFormat": "{{entrypoint}} in",
"refId": "A"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(rate(traefik_entrypoint_responses_bytes_total[5m])) by (entrypoint)",
"legendFormat": "{{entrypoint}} out",
"refId": "B"
}
],
"title": "Bandwidth by Entrypoint",
"type": "timeseries"
},
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"fieldConfig": {
"defaults": {
"color": { "mode": "palette-classic" },
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 20,
"gradientMode": "none",
"hideFrom": { "legend": false, "tooltip": false, "viz": false },
"insertNulls": false,
"lineInterpolation": "smooth",
"lineWidth": 2,
"pointSize": 5,
"scaleDistribution": { "type": "linear" },
"showPoints": "never",
"spanNulls": false,
"stacking": { "group": "A", "mode": "none" },
"thresholdsStyle": { "mode": "off" }
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [{ "color": "green", "value": null }]
},
"unit": "short"
},
"overrides": []
},
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 33 },
"id": 12,
"options": {
"legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true },
"tooltip": { "mode": "multi", "sort": "desc" }
},
"pluginVersion": "10.0.0",
"targets": [
{
"datasource": { "type": "prometheus", "uid": "prometheus" },
"expr": "sum(traefik_open_connections) by (entrypoint, protocol)",
"legendFormat": "{{entrypoint}} ({{protocol}})",
"refId": "A"
}
],
"title": "Open Connections",
"type": "timeseries"
}
],
"refresh": "30s",
"schemaVersion": 38,
"tags": ["traefik", "proxy"],
"templating": { "list": [] },
"time": { "from": "now-1h", "to": "now" },
"timepicker": {},
"timezone": "browser",
"title": "Traefik",
"uid": "traefik",
"version": 1
}

View File

@@ -1,13 +0,0 @@
apiVersion: 1
providers:
- name: 'Homelab Dashboards'
orgId: 1
folder: 'Homelab'
folderUid: 'homelab'
type: file
disableDeletion: false
updateIntervalSeconds: 30
allowUiUpdates: true
options:
path: /var/lib/grafana/dashboards

View File

@@ -1,32 +0,0 @@
apiVersion: 1
deleteDatasources:
- name: Loki
orgId: 1
- name: Prometheus
orgId: 1
- name: Jaeger
orgId: 1
datasources:
- name: Loki
type: loki
uid: loki
access: proxy
url: http://loki:3100
isDefault: true
editable: true
- name: Prometheus
type: prometheus
uid: prometheus
access: proxy
url: http://prometheus:9090
editable: true
- name: Jaeger
type: jaeger
uid: jaeger
access: proxy
url: http://jaeger:16686
editable: true

View File

@@ -370,11 +370,11 @@
<div class="stripe"></div> <div class="stripe"></div>
</a> </a>
<a data-subdomain="jaeger" target="_blank" class="tile metrics"> <a data-subdomain="tempo" target="_blank" class="tile metrics">
<span class="status-dot"></span> <span class="status-dot"></span>
<span class="icon">&#128065;</span> <span class="icon">&#128065;</span>
<div class="tile-eyebrow">Tracing</div> <div class="tile-eyebrow">Tracing</div>
<div class="tile-title">Jaeger</div> <div class="tile-title">Tempo</div>
<p class="tile-desc">Distributed tracing for microservices</p> <p class="tile-desc">Distributed tracing for microservices</p>
<span class="tile-port"></span> <span class="tile-port"></span>
<div class="stripe"></div> <div class="stripe"></div>

View File

@@ -135,11 +135,11 @@
<div class="stripe"></div> <div class="stripe"></div>
</a> </a>
<a data-subdomain="jaeger" target="_blank" class="tile metrics"> <a data-subdomain="tempo" target="_blank" class="tile metrics">
<span class="status"></span> <span class="status"></span>
<span class="icon">&#128065;</span> <span class="icon">&#128065;</span>
<div class="tile-eyebrow">Tracing</div> <div class="tile-eyebrow">Tracing</div>
<div class="tile-title">Jaeger</div> <div class="tile-title">Tempo</div>
<p class="tile-desc">Distributed tracing for microservices</p> <p class="tile-desc">Distributed tracing for microservices</p>
<span class="tile-port"></span> <span class="tile-port"></span>
<div class="stripe"></div> <div class="stripe"></div>