Files
Felix FaerberandClaude Opus 4.7 7fcd9df9d3 grafana: provision Loki/Prometheus datasources + log dashboards
Bind two ready-to-use dashboards at grafana.t4t-gateway.com:

- Logs — All services: per-service log volume timeseries + live tail,
  with a service selector and a free-text search box.
- Hosted-gateway API — errors & PSS inbox: error rate, ack/deliver
  counters, and a live tail filtered to PSS inbox traffic so the
  webhook fallback is observable.

Datasources + dashboard providers are mounted via Docker configs from
hostinger/grafana/ so they survive grafana container restarts and live
in git rather than the Grafana UI.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 10:53:26 +03:00

84 lines
2.6 KiB
JSON

{
"title": "Hosted-gateway API — errors & PSS inbox",
"uid": "t4t-api-errors",
"schemaVersion": 39,
"version": 1,
"editable": true,
"refresh": "10s",
"tags": ["t4t", "api"],
"time": {"from": "now-1h", "to": "now"},
"templating": {"list": []},
"panels": [
{
"type": "timeseries",
"title": "Errors per minute (api + worker)",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0},
"datasource": {"type": "loki", "uid": "loki"},
"targets": [
{
"expr": "sum by (swarm_service) (count_over_time({swarm_service=~\"prod_(api|worker)\"} |~ \"(?i)\\\"level\\\":(50|40)\" [1m]))",
"legendFormat": "{{swarm_service}}",
"refId": "A"
}
],
"fieldConfig": {"defaults": {"unit": "logs", "custom": {"drawStyle": "bars", "fillOpacity": 60}}}
},
{
"type": "stat",
"title": "Acks last 15m",
"gridPos": {"h": 8, "w": 6, "x": 12, "y": 0},
"datasource": {"type": "loki", "uid": "loki"},
"targets": [
{
"expr": "sum(count_over_time({swarm_service=\"prod_api\"} |~ \"ack received\" [15m]))",
"refId": "A"
}
],
"options": {"reduceOptions": {"calcs": ["lastNotNull"]}, "colorMode": "value", "graphMode": "area"}
},
{
"type": "stat",
"title": "Deliveries last 15m",
"gridPos": {"h": 8, "w": 6, "x": 18, "y": 0},
"datasource": {"type": "loki", "uid": "loki"},
"targets": [
{
"expr": "sum(count_over_time({swarm_service=\"prod_api\"} |~ \"envelope dispatched\" |~ \"job_deliver\" [15m]))",
"refId": "A"
}
],
"options": {"reduceOptions": {"calcs": ["lastNotNull"]}, "colorMode": "value", "graphMode": "area"}
},
{
"type": "logs",
"title": "API — errors",
"gridPos": {"h": 14, "w": 24, "x": 0, "y": 8},
"datasource": {"type": "loki", "uid": "loki"},
"targets": [
{
"expr": "{swarm_service=~\"prod_(api|worker)\"} |~ \"(?i)\\\"level\\\":(50|40)\"",
"refId": "A"
}
],
"options": {
"showTime": true,
"wrapLogMessage": true,
"sortOrder": "Descending"
}
},
{
"type": "logs",
"title": "PSS inbox traffic",
"gridPos": {"h": 14, "w": 24, "x": 0, "y": 22},
"datasource": {"type": "loki", "uid": "loki"},
"targets": [
{
"expr": "{swarm_service=\"prod_api\"} |~ \"pss/inbox|ack received|delivered\"",
"refId": "A"
}
],
"options": {"showTime": true, "wrapLogMessage": true, "sortOrder": "Descending"}
}
]
}