milestone 26: upstream health answers for the selected period
This commit is contained in:
@@ -325,7 +325,7 @@ Per-group boolean. Rewrites known engine domains to their safe-search CNAME targ
|
||||
|
||||
- Schemes: `https://…` → DoH, `tls://host:853` → DoT.
|
||||
- Ordered by priority; sequential attempt; per-upstream failure counters; exponential backoff with jitter; success resets.
|
||||
- `UpstreamHealth` per upstream: last_success_at, last_error_at, last_error_message, rolling success rate, consecutive failures, backoff-until. Exposed via `GET /api/upstream/health`, dashboard, `/metrics`, and `nxdns check`.
|
||||
- `UpstreamHealth` per upstream: last_success_at, last_error_at, last_error_message, rolling success rate, consecutive failures, backoff-until. This is routing state: it drives failover and backoff, and is exposed through `/metrics` and `nxdns check`. `GET /api/upstream/health?period=…` exposes none of it except the live `enabled`/`available` pair; its counts, success rate and last failure are ranged aggregates read from the per-minute upstream history in `querylog.db`, so the dashboard's period scopes them like every other number on the page.
|
||||
- DoH client: `std.http.Client` with `content-type/accept: application/dns-message`; strict status + payload checks.
|
||||
- `platform/tls_client.zig` enforces per-connection read/write deadlines, classifies TLS errors explicitly, retries with backoff. Integration tests cover timeout/hang scenarios so compiler upgrades can't silently regress them.
|
||||
- Connect, read, and total-budget timeouts each configurable.
|
||||
@@ -460,6 +460,24 @@ CREATE TABLE query_log (
|
||||
CREATE INDEX idx_query_log_ts ON query_log(timestamp);
|
||||
CREATE INDEX idx_query_log_client ON query_log(client_ip);
|
||||
CREATE INDEX idx_query_log_domain ON query_log(domain_id);
|
||||
|
||||
CREATE TABLE upstream_targets (
|
||||
id INTEGER PRIMARY KEY,
|
||||
url TEXT NOT NULL UNIQUE -- the historical identity: config.db ids cannot cross database files
|
||||
);
|
||||
|
||||
CREATE TABLE upstream_minute (
|
||||
upstream_id INTEGER NOT NULL REFERENCES upstream_targets(id),
|
||||
minute_ts INTEGER NOT NULL,
|
||||
successes INTEGER NOT NULL,
|
||||
failures INTEGER NOT NULL,
|
||||
last_failure_ts INTEGER,
|
||||
last_error TEXT,
|
||||
PRIMARY KEY (upstream_id, minute_ts),
|
||||
CHECK (successes >= 0),
|
||||
CHECK (failures >= 0)
|
||||
) WITHOUT ROWID;
|
||||
CREATE INDEX idx_upstream_minute_ts ON upstream_minute(minute_ts);
|
||||
```
|
||||
|
||||
### 11.4 Query Logger
|
||||
@@ -522,7 +540,7 @@ Scalars in `settings(key, value)`; ordered/structured items in dedicated tables.
|
||||
- `GET /api/lookup?domain=…&group_id=…`
|
||||
- `GET/POST /api/pause`
|
||||
- `GET/PUT /api/settings`
|
||||
- `GET /api/upstream/health`
|
||||
- `GET /api/upstream/health?period=…`
|
||||
- `POST /api/certs/reload`
|
||||
- `GET /api/health` — overall + disk + upstream + queries_dropped rollup
|
||||
- `GET /metrics` — Prometheus text exposition: query counters (total/blocked/cached), per-upstream health, cache stats, queries_dropped, disk gauges
|
||||
|
||||
Reference in New Issue
Block a user