milestone 30: overview as a dashboard, explicit health contract, period aggregations
Gates / frontend (push) Successful in 1m32s
Gates / test (push) Successful in 1m54s
Gates / package (push) Successful in 5m28s
Gates / container (push) Successful in 14s
Gates / test-aarch64 (push) Failing after 3h10m0s
CI / gates (push) Failing after 3h11m55s

This commit is contained in:
2026-08-22 16:45:15 +02:00
parent 17422fac21
commit 648d9b4496
89 changed files with 7222 additions and 4239 deletions
+111 -33
View File
@@ -34,11 +34,13 @@ import type {
RuleEcho,
SettingsEnvelope,
SourceStatus,
StatsClients,
StatsRoutes,
StatsTimeseries,
StatsTotals,
StatsTypes,
Upstream,
UpstreamEcho,
UpstreamHealth,
Version,
} from "@/lib/types";
@@ -49,21 +51,24 @@ export const sample_get_health: Health = {
state: "recording",
},
disk: {
db_bytes: 0,
free_bytes: 0,
log_bytes: 0,
sample_failures: 0,
state: "ok",
},
queries_dropped: 0,
refreshes_gated: 0,
snapshot_generation: 0,
protection: {
state: "active",
until: null,
},
query_history: {
dropped_total: 0,
last_drop_s: null,
state: "recording",
},
status: "ok",
upstreams: {
available: 0,
state: "ok",
total: 0,
},
writer_failed: false,
};
export const sample_get_version: Version = {
@@ -391,30 +396,6 @@ export const sample_update_upstream: UpstreamEcho = {
url: "https://dns.example/dns-query",
};
export const sample_get_upstream_health: UpstreamHealth = {
available: 0,
complete: true,
period: "24h",
since: 0,
total: 0,
until: 0,
upstreams: [
{
available: true,
enabled: true,
period: {
attempts: 0,
failures: 0,
last_failure_at: null,
last_failure_error: null,
success_rate: null,
successes: 0,
},
url: "https://dns.example/dns-query",
},
],
};
export const sample_get_queries: QueriesPage = {
coverage: {
available_since: 0,
@@ -543,7 +524,6 @@ export const sample_get_query_detail: QueryDetail = {
export const sample_get_stats: StatsTotals = {
avg_response_time_us: null,
blocked: 0,
cached: 0,
clients: 0,
coverage: {
available_since: 0,
@@ -846,6 +826,104 @@ export const sample_error_not_found: ErrorEnvelope = {
error: "not found",
};
export const sample_get_stats_types: StatsTypes = {
coverage: {
available_since: 0,
complete: true,
},
period: "1h",
since: 0,
types: [
{
count: 0,
qtype: 0,
},
{
count: 0,
qtype: null,
},
],
until: 0,
};
export const sample_get_stats_routes: StatsRoutes = {
coverage: {
available_since: 0,
complete: true,
},
period: "1h",
routes: [
{
count: 0,
route: "upstream",
source: "https://dns.example/dns-query",
},
{
count: 0,
route: "blocked",
source: null,
},
{
count: 0,
route: "cache",
source: null,
},
{
count: 0,
route: "forward_zone",
source: "lan",
},
{
count: 0,
route: "local",
source: null,
},
{
count: 0,
route: "rejected",
source: null,
},
{
count: 0,
route: "upstream",
source: "https://dns2.example/dns-query",
},
{
count: 0,
route: "upstream",
source: null,
},
],
since: 0,
until: 0,
};
export const sample_get_stats_clients: StatsClients = {
bucket_seconds: 0,
clients: [
{
buckets: [0],
client: "192.0.2.30",
},
{
buckets: [0],
client: "192.0.2.31",
},
{
buckets: [0],
client: "192.0.2.32",
},
],
coverage: {
available_since: 0,
complete: true,
},
other: [0],
period: "1h",
since: 0,
until: 0,
};
export const sample_error_unauthorized: ErrorEnvelope = {
error: "authentication required",
};