thermograph/observability/grafana/dashboards/thermograph-traffic.json
Emi Griffith f2fd8f6835 Subtree-merge thermograph-observability (origin/main) into observability/
git-subtree-dir: observability
git-subtree-mainline: ae1d9bb534
git-subtree-split: 19e74af9ca
2026-07-22 22:01:11 -07:00

1328 lines
No EOL
29 KiB
JSON

{
"uid": "tg-traffic-domains",
"title": "Thermograph \u2014 Traffic & Domains",
"tags": [
"thermograph",
"traffic",
"domains"
],
"schemaVersion": 39,
"editable": true,
"refresh": "30s",
"time": {
"from": "now-6h",
"to": "now"
},
"timezone": "browser",
"templating": {
"list": [
{
"name": "host",
"type": "query",
"datasource": {
"type": "loki",
"uid": "loki"
},
"query": {
"label": "host",
"stream": "",
"type": 1
},
"definition": "label_values(host)",
"refresh": 2,
"includeAll": true,
"multi": true,
"allValue": ".+",
"current": {
"text": "All",
"value": "$__all"
},
"sort": 1
}
]
},
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"panels": [
{
"id": 1,
"type": "row",
"title": "Overview",
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 0
}
},
{
"id": 2,
"type": "stat",
"title": "App requests",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 5,
"w": 4,
"x": 0,
"y": 1
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum(count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json [$__range]))",
"refId": "A",
"queryType": "range"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"color": {
"mode": "fixed",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 3,
"type": "stat",
"title": "HTTP errors (4xx/5xx)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 5,
"w": 4,
"x": 4,
"y": 1
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum(count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json | status=~\"4..|5..\" [$__range]))",
"refId": "A",
"queryType": "range"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 1
},
{
"color": "red",
"value": 25
}
]
},
"color": {
"mode": "thresholds",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "background",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 4,
"type": "stat",
"title": "Upstream failures",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 5,
"w": 4,
"x": 8,
"y": 1
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum(count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/errors/.+\"} [$__range]))",
"refId": "A",
"queryType": "range"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "orange",
"value": 1
},
{
"color": "red",
"value": 20
}
]
},
"color": {
"mode": "thresholds",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "background",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 5,
"type": "stat",
"title": "Rate-limited (429)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 5,
"w": 4,
"x": 12,
"y": 1
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum(count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/errors/.+\"} | json | status=\"429\" [$__range]))",
"refId": "A",
"queryType": "range"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 1
}
]
},
"color": {
"mode": "thresholds",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "background",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 6,
"type": "stat",
"title": "Notifier beats / 20m",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 5,
"w": 4,
"x": 16,
"y": 1
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (host) (count_over_time({job=\"app-json\", host=~\"$host\"} | tag=\"heartbeat\" [20m]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{host}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "red",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"color": {
"mode": "thresholds",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "background",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 7,
"type": "stat",
"title": "Caddy 5xx / 1h",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 5,
"w": 4,
"x": 20,
"y": 1
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum(count_over_time({job=\"caddy\", host=~\"$host\"} | json | status>=500 [1h]))",
"refId": "A",
"queryType": "range"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 1
}
]
},
"color": {
"mode": "thresholds",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "background",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 8,
"type": "piechart",
"title": "Traffic mix by domain (category)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 6
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (cat) (count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json [$__range]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{cat}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "right",
"values": [
"value",
"percent"
]
},
"pieType": "donut",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"values": true
},
"displayLabels": [
"percent"
]
}
},
{
"id": 9,
"type": "timeseries",
"title": "Requests/sec by domain",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 9,
"w": 12,
"x": 12,
"y": 6
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (cat) (rate({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{cat}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "normal",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 10,
"type": "row",
"title": "Weather API \u2014 core product",
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 15
}
},
{
"id": 11,
"type": "timeseries",
"title": "Weather endpoints \u2014 req/s",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 16
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (cat) (rate({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json | cat=~\"api:.+\" [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{cat}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "normal",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 12,
"type": "timeseries",
"title": "Grade run latency (ms)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 16
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "quantile_over_time(0.95, {job=\"app-json\", host=~\"$host\", filename=~\".+/audit/.+\"} | json | unwrap duration_ms [$__auto]) by ()",
"refId": "A",
"queryType": "range",
"legendFormat": "p95"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "quantile_over_time(0.50, {job=\"app-json\", host=~\"$host\", filename=~\".+/audit/.+\"} | json | unwrap duration_ms [$__auto]) by ()",
"refId": "B",
"queryType": "range",
"legendFormat": "p50"
}
],
"fieldConfig": {
"defaults": {
"unit": "ms",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 0,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "none",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 13,
"type": "table",
"title": "Top endpoints (by volume)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 8,
"x": 0,
"y": 24
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "topk(12, sum by (cat) (count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json | cat=~\"api:.+\" [$__range])))",
"refId": "A",
"queryType": "instant",
"legendFormat": "{{cat}}",
"instant": true,
"format": "table"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {}
},
"overrides": []
},
"options": {
"showHeader": true,
"cellHeight": "sm",
"sortBy": [
{
"displayName": "Value",
"desc": true
}
]
}
},
{
"id": 14,
"type": "stat",
"title": "Cache-served runs (partial %)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 8,
"x": 8,
"y": 24
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum(count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/audit/.+\"} | json | run_type=\"partial\" [$__range])) / sum(count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/audit/.+\"} | json | run_type=~\".+\" [$__range])) * 100",
"refId": "A",
"queryType": "range"
}
],
"fieldConfig": {
"defaults": {
"unit": "percent",
"custom": {},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"color": {
"mode": "fixed",
"fixedColor": "text"
}
},
"overrides": []
},
"options": {
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"textMode": "auto",
"orientation": "auto"
}
},
{
"id": 15,
"type": "timeseries",
"title": "Fresh (full) vs cached (partial) runs",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 8,
"x": 16,
"y": 24
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (run_type) (count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/audit/.+\"} | json | run_type=~\".+\" [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{run_type}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "normal",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 16,
"type": "row",
"title": "Accounts, Auth & Content",
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 32
}
},
{
"id": 17,
"type": "timeseries",
"title": "Auth & Accounts \u2014 req/s",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 33
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (cat) (rate({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json | cat=~\"auth|accounts\" [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{cat}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "none",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 18,
"type": "timeseries",
"title": "Pages & SEO \u2014 req/s",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 33
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (cat) (rate({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json | cat=~\"page|seo\" [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{cat}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "none",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 19,
"type": "row",
"title": "Upstream fetches & Reliability",
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 41
}
},
{
"id": 20,
"type": "timeseries",
"title": "Upstream failures by phase",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 42
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (phase) (count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/errors/.+\"} [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{phase}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "normal",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 21,
"type": "timeseries",
"title": "HTTP errors by status",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 42
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (status) (count_over_time({job=\"app-json\", host=~\"$host\", filename=~\".+/access/.+\"} | json | status=~\"4..|5..\" [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{status}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "short",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "normal",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 22,
"type": "logs",
"title": "Recent errors & retries (app)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 9,
"w": 24,
"x": 0,
"y": 50
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "{job=\"app-json\", host=~\"$host\", filename=~\".+/errors/.+\"}",
"refId": "A",
"queryType": "range"
}
],
"options": {
"showTime": true,
"wrapLogMessage": true,
"prettifyLogMessage": true,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
}
},
{
"id": 23,
"type": "row",
"title": "By site (Caddy) & Fleet",
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 59
}
},
{
"id": 24,
"type": "timeseries",
"title": "Requests by site (Host header)",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 60
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (request_host) (rate({job=\"caddy\", host=~\"$host\"} | json [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{request_host}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "reqps",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "normal",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 25,
"type": "timeseries",
"title": "Log volume by service",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 60
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "sum by (service) (rate({job=\"docker\", host=~\"$host\"} [$__auto]))",
"refId": "A",
"queryType": "range",
"legendFormat": "{{service}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "logs",
"custom": {
"drawStyle": "line",
"lineWidth": 2,
"fillOpacity": 18,
"showPoints": "never",
"spanNulls": true,
"stacking": {
"mode": "none",
"group": "A"
}
}
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "table",
"placement": "bottom",
"calcs": [
"mean",
"max"
]
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
}
},
{
"id": 26,
"type": "logs",
"title": "Live tail \u2014 all containers",
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 9,
"w": 24,
"x": 0,
"y": 68
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"expr": "{job=\"docker\", host=~\"$host\"}",
"refId": "A",
"queryType": "range"
}
],
"options": {
"showTime": true,
"wrapLogMessage": true,
"prettifyLogMessage": true,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
}
}
]
}