From 9d3129372bc50b4d4745707236f5090dc5b9a09c Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 3 Oct 2026 23:42:45 +0700 Subject: [PATCH] =?UTF-8?q?fix(uptime):=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=82=D1=8C=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D0=BD=D0=B0=D0=B1=D0=BB=D1=8E=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=20RTT=20=D0=BD=D0=B0=20=D0=B4=D0=B0=D1=88?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/dashboard/page.tsx | 26 ++- backend/src/routes/uptime.ts | 8 +- .../uptime-probe-observations.test.ts | 6 + .../src/services/uptime-probe-observations.ts | 4 + components/dashboard/latency-chart.tsx | 152 +++--------------- .../dashboard-active-probes-data-grid.tsx | 21 +-- docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 15 ++ docs/ux-ui-stage-12.md | 15 ++ .../screens/dashboard-observed-ping-1440.png | Bin 0 -> 132442 bytes .../screens/dashboard-observed-ping-320.png | Bin 0 -> 47337 bytes hooks/use-dashboard-live.ts | 21 +-- lib/dashboard-latency.ts | 47 ++---- lib/dashboard-probes.test.ts | 21 +++ lib/dashboard-probes.ts | 23 +++ lib/dashboard-readers.test.ts | 2 +- lib/dashboard-readers.ts | 4 +- tests/e2e/dashboard-data.spec.ts | 5 + 18 files changed, 169 insertions(+), 203 deletions(-) create mode 100644 backend/src/services/uptime-probe-observations.test.ts create mode 100644 backend/src/services/uptime-probe-observations.ts create mode 100644 docs/ux-ui/screens/dashboard-observed-ping-1440.png create mode 100644 docs/ux-ui/screens/dashboard-observed-ping-320.png create mode 100644 lib/dashboard-probes.test.ts create mode 100644 lib/dashboard-probes.ts diff --git a/app/(main)/dashboard/page.tsx b/app/(main)/dashboard/page.tsx index bc84ab79..3b12009b 100644 --- a/app/(main)/dashboard/page.tsx +++ b/app/(main)/dashboard/page.tsx @@ -123,8 +123,8 @@ export default function DashboardPage() { { id: "health", label: "Проверки с проблемами", - value: dash.availability.probes ? String(health) : "—", - hint: dash.availability.probes ? `${dash.probeDown} ошибок · ${dash.probeWarn} предупреждений` : "нет данных", + value: dash.availability.probes && dash.unknownProbeCount===0 ? String(health) : "—", + hint: dash.availability.probes ? `${dash.probeDown} ошибок · ${dash.probeWarn} предупреждений${dash.unknownProbeCount>0?` · неизвестны: ${dash.unknownProbeCount}`:""}` : "нет данных", href: "/uptime", icon: , iconClassName: health > 0 ? "text-destructive" : "text-muted-foreground", @@ -218,18 +218,7 @@ export default function DashboardPage() { - {dash.traffic.demo ? демо : !dash.traffic.observationsKnown ? Измерения не подтверждены API : null} - RX {dash.traffic.rxNow===null?"—":fmtRate(dash.traffic.rxNow)} - TX {dash.traffic.txNow===null?"—":fmtRate(dash.traffic.txNow)} - - Трафик → - - - ) : null - } + headerRight={Трафик →} contentClassName="px-3 pb-3" > {dash.loading && !dash.traffic ? ( @@ -242,7 +231,14 @@ export default function DashboardPage() {

) : ( - + <> +
+ {dash.traffic.demo ? демо : !dash.traffic.observationsKnown ? Измерения не подтверждены API : null} + RX {dash.traffic.rxNow===null?"—":fmtRate(dash.traffic.rxNow)} + TX {dash.traffic.txNow===null?"—":fmtRate(dash.traffic.txNow)} +
+ + )}
diff --git a/backend/src/routes/uptime.ts b/backend/src/routes/uptime.ts index cdfb9a8e..7061b57c 100644 --- a/backend/src/routes/uptime.ts +++ b/backend/src/routes/uptime.ts @@ -16,6 +16,7 @@ import { updateProbeShowOnDashboard, updateUptimeSettings, } from "../services/uptime-collector.js" +import {buildUptimeProbeObservations} from "../services/uptime-probe-observations.js" import { recordSpeedTestFailure, runBandwidthSpeedTest } from "../services/uptime-speed-service.js" function rangeToMinutes(range: string | undefined): number { @@ -471,8 +472,8 @@ const uptimeRoutes: FastifyPluginAsyncZod = async (app) => { app.get("/uptime/overview", async (req, reply) => { const q = req.query as { range?: string } const minutes = rangeToMinutes(q.range) - const sinceIso = new Date(Date.now() - minutes * 60_000).toISOString() - + const rangeEndAt=new Date().toISOString() + const sinceIso = new Date(Date.parse(rangeEndAt) - minutes * 60_000).toISOString() const allServers = await db.select().from(servers) const probeRows = await readProbeRows() const probeSamples = await readProbeSamplesSince(sinceIso) @@ -498,6 +499,7 @@ const uptimeRoutes: FastifyPluginAsyncZod = async (app) => { series, enabled: p.enabled, showOnDashboard: p.showOnDashboard, + observations:buildUptimeProbeObservations(rows.filter(r=>Date.parse(r.sampledAt)<=Date.parse(rangeEndAt))), } }) @@ -527,7 +529,7 @@ const uptimeRoutes: FastifyPluginAsyncZod = async (app) => { } })) - return reply.send({ probes, resources }) + return reply.send({ probes, resources,rangeStartAt:sinceIso,rangeEndAt }) }) } diff --git a/backend/src/services/uptime-probe-observations.test.ts b/backend/src/services/uptime-probe-observations.test.ts new file mode 100644 index 00000000..343c01db --- /dev/null +++ b/backend/src/services/uptime-probe-observations.test.ts @@ -0,0 +1,6 @@ +import assert from "node:assert/strict" +import {buildUptimeProbeObservations} from "./uptime-probe-observations.js" +assert.deepEqual(buildUptimeProbeObservations([]),{samples:[]}) +const good={sampledAt:"2026-10-03T00:00:00Z",rttMs:0,lossPct:0,status:"up" as const},failed={sampledAt:"2026-10-03T00:01:00Z",rttMs:null,lossPct:100,status:"down" as const} +assert.deepEqual(buildUptimeProbeObservations([failed,good]),{samples:[{sampledAt:good.sampledAt,rtt:0,loss:0,status:"up"},{sampledAt:failed.sampledAt,rtt:null,loss:100,status:"down"}]});assert.equal(good.rttMs,0) +console.log("uptime probe observations tests ok") diff --git a/backend/src/services/uptime-probe-observations.ts b/backend/src/services/uptime-probe-observations.ts new file mode 100644 index 00000000..b40e7c3b --- /dev/null +++ b/backend/src/services/uptime-probe-observations.ts @@ -0,0 +1,4 @@ +import type {UptimeProbeSampleRow} from "../db/schema.js" +type Sample=Pick +/** Additive metadata; no samples means no proof of loss or failure. */ +export function buildUptimeProbeObservations(rows:readonly Sample[]){return {samples:rows.map(row=>({sampledAt:row.sampledAt,rtt:row.rttMs,loss:row.lossPct,status:row.status})).sort((a,b)=>Date.parse(a.sampledAt)-Date.parse(b.sampledAt))}} diff --git a/components/dashboard/latency-chart.tsx b/components/dashboard/latency-chart.tsx index 360b0c0a..3e336cfa 100644 --- a/components/dashboard/latency-chart.tsx +++ b/components/dashboard/latency-chart.tsx @@ -1,129 +1,27 @@ "use client" - -const PALETTE = [ - "var(--chart-line-1)", - "var(--chart-line-2)", - "var(--chart-line-3)", - "var(--chart-line-4)", - "var(--chart-1)", - "var(--chart-2)", - "var(--chart-3)", - "var(--chart-4)", -] - -/** Легенда для демо-данных (ключи `msk`, `spb`, …). */ -const LEGACY_LABELS: Record = { - msk: "MSK", - spb: "SPB", - fra: "FRA", - ams: "AMS", -} - -interface LatencyChartProps { - series: Record - /** Подписи линий (ключ → короткое имя). Если нет — берётся legacy или сам ключ. */ - labels?: Record -} - -export function LatencyChart({ series, labels: labelsProp }: LatencyChartProps) { - const W = 800 - const H = 220 - const pad = { l: 44, r: 12, t: 12, b: 28 } - const iw = W - pad.l - pad.r - const ih = H - pad.t - pad.b - - const entries = Object.entries(series).filter(([, arr]) => arr.length > 0) - const pointCount = entries.length ? Math.max(...entries.map(([, a]) => a.length), 2) : 60 - - const allVals = entries.flatMap(([, arr]) => arr) - const maxVal = Math.ceil(Math.max(1, ...allVals) / 20) * 20 + 10 - - const xAt = (i: number, n: number) => pad.l + (i / Math.max(n - 1, 1)) * iw - const yAt = (v: number) => pad.t + (1 - v / maxVal) * ih - - const gridLines = [0, 0.25, 0.5, 0.75, 1] - - const tickIndices = [ - 0, - Math.floor((pointCount - 1) * 0.25), - Math.floor((pointCount - 1) * 0.5), - Math.floor((pointCount - 1) * 0.75), - pointCount - 1, - ] - - const labelForIndex = (i: number) => { - const spanMin = 60 - const m = Math.round(spanMin * (1 - i / Math.max(pointCount - 1, 1))) - return `-${m}м` - } - - return ( -
- - {gridLines.map((p, i) => ( - - - - {Math.round(maxVal * (1 - p))}мс - - - ))} - {tickIndices.map((i) => ( - - {labelForIndex(i)} - - ))} - {entries.map(([key, arr], idx) => { - const n = arr.length - const pts = arr.map((v, i) => `${xAt(i, n).toFixed(1)},${yAt(v).toFixed(1)}`).join(" ") - const color = PALETTE[idx % PALETTE.length] - return ( - - ) - })} - -
- {entries.map(([key], idx) => { - const color = PALETTE[idx % PALETTE.length] - const leg = - labelsProp?.[key] ?? LEGACY_LABELS[key] ?? key.replace(/^src-/, "") - return ( -
- - {leg} -
- ) - })} -
-
- ) +import {CartesianGrid,Line,LineChart,XAxis,YAxis} from "recharts" +import {ChartContainer,ChartTooltip,ChartTooltipContent,type ChartConfig} from "@/components/ui/chart" +import {formatRangeAgo} from "@/lib/fmt-rate" +const PALETTE=["var(--chart-line-1)","var(--chart-line-2)","var(--chart-line-3)","var(--chart-line-4)","var(--chart-1)","var(--chart-2)","var(--chart-3)","var(--chart-4)"] +const LEGACY_LABELS:Record={msk:"MSK",spb:"SPB",fra:"FRA",ams:"AMS"} +interface LatencyChartProps {series:Record;labels?:Record} +/** Reuse the installed ChartContainer / multi-line composition of ReUI chart-23. */ +export function LatencyChart({series,labels:labelsProp}:LatencyChartProps){ + const entries=Object.entries(series).filter(([,values])=>values.some(v=>typeof v==="number"&&Number.isFinite(v))) + const count=Math.max(1,...entries.map(([,values])=>values.length)) + const data=Array.from({length:count},(_,i)=>({time:formatRangeAgo(Math.round((1-i/Math.max(count-1,1))*60)),...Object.fromEntries(entries.map(([key,values])=>[key,typeof values[i]==="number"&&Number.isFinite(values[i])?values[i]:null]))})) + const label=(key:string)=>labelsProp?.[key]??LEGACY_LABELS[key]??key.replace(/^src-/,"") + const config=Object.fromEntries(entries.map(([key],index)=>[key,{label:label(key),color:PALETTE[index%PALETTE.length]}])) satisfies ChartConfig + const dot=(key:string)=>function IsolatedDot({cx,cy,index}:{cx?:number;cy?:number;index?:number}){const values=series[key];if(index==null||cx==null||cy==null||values[index]==null||values[index-1]!=null||values[index+1]!=null)return ;return } + if(!entries.length)return

Нет измеренной истории RTT

+ return
+ + + + String(v)+" мс"}/> +
{config[String(name)]?.label??name}{typeof value==="number"?String(value)+" мс":"—"}
}/>}/> + {entries.map(([key])=>)} +
+
{entries.map(([key])=>{label(key)})}
+
} diff --git a/components/data-grids/dashboard-active-probes-data-grid.tsx b/components/data-grids/dashboard-active-probes-data-grid.tsx index fe3863aa..5329b9f3 100644 --- a/components/data-grids/dashboard-active-probes-data-grid.tsx +++ b/components/data-grids/dashboard-active-probes-data-grid.tsx @@ -1,7 +1,8 @@ "use client" import { useMemo } from "react" -import type { PingProbe, Server, ServerType } from "@/lib/data" +import type { Server, ServerType } from "@/lib/data" +import type {DashboardProbe} from "@/lib/dashboard-probes" import { Flag } from "@/components/flag" import { StatusBadge } from "@/components/status-badge" import { StatusDot } from "@/components/status-dot" @@ -10,8 +11,8 @@ import { CompactDataGrid, type CompactDataGridColumn } from "@/components/data-g import { cn } from "@/lib/utils" import { FilterIcon } from "lucide-react" -function formatLossPct(loss: number): string { - if (!Number.isFinite(loss)) return "—" +function formatLossPct(loss: number|null): string { + if (loss===null || !Number.isFinite(loss)) return "—" return Number.isInteger(loss) ? `${loss}%` : `${loss.toFixed(1)}%` } @@ -32,7 +33,7 @@ function TypeChip({ type }: { type: ServerType }) { ) } -function ProbeSourceCell({ probe, catalog }: { probe: PingProbe; catalog: Server[] }) { +function ProbeSourceCell({ probe, catalog }: { probe: DashboardProbe; catalog: Server[] }) { const srv = catalog.find((s) => s.id === probe.srcServerId) const iface = (probe.srcInterface ?? "").trim() || "auto" @@ -40,7 +41,7 @@ function ProbeSourceCell({ probe, catalog }: { probe: PingProbe; catalog: Server return (
- +

@@ -79,7 +80,7 @@ function ProbeSourceCell({ probe, catalog }: { probe: PingProbe; catalog: Server } interface DashboardActiveProbesDataGridProps { - probes: PingProbe[] + probes: DashboardProbe[] catalog: Server[] isLoading?: boolean emptyTitle?: string @@ -93,7 +94,7 @@ function DashboardActiveProbesDataGrid({ emptyTitle = "Нет активных проб", emptyDescription, }: DashboardActiveProbesDataGridProps) { - const columns = useMemo[]>( + const columns = useMemo[]>( () => [ { id: "source", @@ -140,7 +141,7 @@ function DashboardActiveProbesDataGrid({ cell: (p) => ( 5 ? "text-red-500" : p.loss > 0 ? "text-amber-500" : "text-muted-foreground", + (p.loss??0) > 5 ? "text-red-500" : (p.loss??0) > 0 ? "text-amber-500" : "text-muted-foreground", )} > {formatLossPct(p.loss)} @@ -149,7 +150,7 @@ function DashboardActiveProbesDataGrid({ }, { id: "series", - header: "60с", + header: "RTT · 1 ч", enableSorting: false, headerClassName: "w-36", cell: (p) => { @@ -168,7 +169,7 @@ function DashboardActiveProbesDataGrid({ enableSorting: false, cell: (p) => ( ), }, diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 966905d5..c3d1079b 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -4,7 +4,7 @@ ## Актуальная точка продолжения — 2026-10-03 -Этап 11Б завершён в границах локальной приёмки (11Б.7); внешний выпуск не проверен. 12.1 принят локально: доступность оболочки/клавиатура/health в описанных сценариях. 12.2.1 принят локально: strict BGP catalog/partial/nullable counters. 12.2.2 принят локально: strict traffic DTO и агрегация без выдуманных точек. 12.2.3 принят локально: observations для server traffic от backend до dashboard. 12.2.4 принят локально: strict servers/probes и unknown server status. Следующий блок12.2.5: наблюдения ping и реальная ось RTT; затем overlay/Internet path, производительность и сквозная регрессия. См. docs/ux-ui-stage-12.md. Внешние ограничения 11Б сохраняются. +Этап 11Б завершён в границах локальной приёмки (11Б.7); внешний выпуск не проверен. 12.1 принят локально: доступность оболочки/клавиатура/health в описанных сценариях. 12.2.1 принят локально: strict BGP catalog/partial/nullable counters. 12.2.2 принят локально: strict traffic DTO и агрегация без выдуманных точек. 12.2.3 принят локально: observations для server traffic от backend до dashboard. 12.2.4 принят локально: strict servers/probes и unknown server status. 12.2.5 принят локально: реальные ping samples/unknown/ось RTT/Recharts. Следующий блок12.2.6: strict GRE/WireGuard/VXLAN и device failures; затем Internet path, производительность и сквозная регрессия. См. docs/ux-ui-stage-12.md. Внешние ограничения 11Б сохраняются. Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 04972736..dab058ea 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -36,6 +36,21 @@ +## 12.2.5 — реальные ping наблюдения и разрывы RTT (2026-10-03) + +/uptime/overview совместимо добавляет observations.samples и общие rangeStartAt/rangeEndAt. Сохраняет исходные числовые поля legacy клиентов; metadata содержит реальные отсортированные timestamp/RTT/loss/status без искусственных samples и ограничена концом снимка (поступление нового sample во время чтения не нарушает окно). Дашборд предпочитает наблюдения: legacy/empty становятся unknown/null, измеренный0 остаётся0, реальный down/100% остаётся ошибкой. Malformed/duplicate/unordered/out-of-window samples сохраняют cache. Source freshness показывает фактическое время, неизвестные проверки исключают утверждение «без ошибок» и дают warning/— в KPI; отсутствующий каталог источника не рисует offline. + +RTT агрегируется в60 настоящих временных корзин; средний по источнику не дополняется нулями/интерполяцией. Пропуски — null; изолированная точка видима. Нечитаемый на320px SVG заменён установленной композицией ChartContainer/Recharts, как ReUI PRO chart-23 и существующий TrafficRxTxChart; Frame/OpsPanel сохранены. Скорости RX/TX вынесены из заголовка в переносимую строку, перекрытие устранено. Header таблицы «RTT · 1 ч» вместо неверных «60с». + +Проверки:40 dashboard/permissions browser прошли после финального chart; дополнительно6 ping сценариев и снимки1440/320.11 unit dashboard (включая sparse axis/unknown/zero/invalid metadata), чистые backend observations assertions, typecheck/ESLint, frontend production/contracts build(34pages), backend/contracts build прошли. ReUI MCP подтвердил chart-23/Chart API; читались установленные исходники, checklist применён; primitives/theme не изменены. Другие uptime страницы продолжают legacy numeric API и этим блоком не переприняты. Реальные PG/RouterOS measurements не тестировались. + +| Доработка | Референс | Схема / локальные снимки | +| --- | --- | --- | +| Читаемый RTT с пропусками | [Chart23](https://reui.io/preview/base/chart-23?ref=mcp) | Observations → временные корзины → линии/разрывы/точки; [1440](ux-ui/screens/dashboard-observed-ping-1440.png), [320](ux-ui/screens/dashboard-observed-ping-320.png) | +| Неизвестное состояние в сводке | [Stats12](https://reui.io/preview/base/stats-12?ref=mcp) | Snapshot → known/unknown → KPI/очередь → объект | + +Далее12.2.6: strict GRE/WireGuard/VXLAN и device failures на dashboard; затем Internet path и сводная приёмка12.2. Внешние ограничения сохраняются. + ## 12.2.4 — строгие каталоги серверов/проб, unknown серверов (2026-10-03) Servers использует выбранные поля serverReadSchema и строгие id/latency/sessions; probes — обязательные поля, unique id и диапазоны RTT/loss/series/status. Malformed каталоги отклоняются до публикации, сохраняется cache/время источника. Nullable статус сервера отображается как unknown, warning в очереди; offline KPI считает только явно offline, unknown/degraded перечислены отдельно, недоказанное состояние не называется исправным. Sessions обязательны как в реальном DTO; дополнительная WAN информация остаётся совместимой. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index ca6e4a68..ea4dbe4a 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -59,3 +59,18 @@ Servers использует выбранные поля serverReadSchema и строгие id/latency/sessions; probes — обязательные поля, unique id и диапазоны RTT/loss/series/status. Malformed каталоги отклоняются до публикации, сохраняется cache/время источника. Nullable статус сервера отображается как unknown, warning в очереди; offline KPI считает только явно offline, unknown/degraded перечислены отдельно, недоказанное состояние не называется исправным. Sessions обязательны как в реальном DTO; дополнительная WAN информация остаётся совместимой. Проверки:34 dashboard/permissions browser и8 dashboard unit, typecheck/ESLint прошли. Initial failing unknown fixture был дополнен обязательным sessions реального DTO; финальный прогон34 прошёл. ReUI KPI/queue композиция сохранена, изменены только data/copy. Далее12.2.5: реальные ping наблюдения/временная ось; backend сейчас подставляет100%/down/нули при отсутствии samples, этот блок ещё не устранил такие backend подстановки. Затем overlay/Internet path. + +## 12.2.5 — реальные ping наблюдения и разрывы RTT (2026-10-03) + +/uptime/overview совместимо добавляет observations.samples и общие rangeStartAt/rangeEndAt. Сохраняет исходные числовые поля legacy клиентов; metadata содержит реальные отсортированные timestamp/RTT/loss/status без искусственных samples и ограничена концом снимка (поступление нового sample во время чтения не нарушает окно). Дашборд предпочитает наблюдения: legacy/empty становятся unknown/null, измеренный0 остаётся0, реальный down/100% остаётся ошибкой. Malformed/duplicate/unordered/out-of-window samples сохраняют cache. Source freshness показывает фактическое время, неизвестные проверки исключают утверждение «без ошибок» и дают warning/— в KPI; отсутствующий каталог источника не рисует offline. + +RTT агрегируется в60 настоящих временных корзин; средний по источнику не дополняется нулями/интерполяцией. Пропуски — null; изолированная точка видима. Нечитаемый на320px SVG заменён установленной композицией ChartContainer/Recharts, как ReUI PRO chart-23 и существующий TrafficRxTxChart; Frame/OpsPanel сохранены. Скорости RX/TX вынесены из заголовка в переносимую строку, перекрытие устранено. Header таблицы «RTT · 1 ч» вместо неверных «60с». + +Проверки:40 dashboard/permissions browser прошли после финального chart; дополнительно6 ping сценариев и снимки1440/320.11 unit dashboard (включая sparse axis/unknown/zero/invalid metadata), чистые backend observations assertions, typecheck/ESLint, frontend production/contracts build(34pages), backend/contracts build прошли. ReUI MCP подтвердил chart-23/Chart API; читались установленные исходники, checklist применён; primitives/theme не изменены. Другие uptime страницы продолжают legacy numeric API и этим блоком не переприняты. Реальные PG/RouterOS measurements не тестировались. + +| Доработка | Референс | Схема / локальные снимки | +| --- | --- | --- | +| Читаемый RTT с пропусками | [Chart23](https://reui.io/preview/base/chart-23?ref=mcp) | Observations → временные корзины → линии/разрывы/точки; [1440](ux-ui/screens/dashboard-observed-ping-1440.png), [320](ux-ui/screens/dashboard-observed-ping-320.png) | +| Неизвестное состояние в сводке | [Stats12](https://reui.io/preview/base/stats-12?ref=mcp) | Snapshot → known/unknown → KPI/очередь → объект | + +Далее12.2.6: strict GRE/WireGuard/VXLAN и device failures на dashboard; затем Internet path и сводная приёмка12.2. Внешние ограничения сохраняются. diff --git a/docs/ux-ui/screens/dashboard-observed-ping-1440.png b/docs/ux-ui/screens/dashboard-observed-ping-1440.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d822456fb603dd71c66221f01c8e446dba2c76 GIT binary patch literal 132442 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 z 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%0D{GtXIdw7f6b|(aB@2hFgJ!iL>-e&st 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 G@BbfE9H`;| literal 0 HcmV?d00001 diff --git a/docs/ux-ui/screens/dashboard-observed-ping-320.png b/docs/ux-ui/screens/dashboard-observed-ping-320.png new file mode 100644 index 0000000000000000000000000000000000000000..14776383f21af2b43fad67341c1428a10acadbf8 GIT binary patch literal 47337 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”`dR< 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 literal 0 HcmV?d00001 diff --git a/hooks/use-dashboard-live.ts b/hooks/use-dashboard-live.ts index c53ea9c9..779e3293 100644 --- a/hooks/use-dashboard-live.ts +++ b/hooks/use-dashboard-live.ts @@ -10,7 +10,6 @@ import { traffic as mockTraffic, vxlanTunnels as mockVxlan, type GreTunnel, - type PingProbe, type Server, } from "@/lib/data" import { useDataSource } from "@/lib/data-source" @@ -30,6 +29,7 @@ import type { FiltersRulesetRow, RouteOptimizerSpeedProbe } from "@/lib/route-op import { updateDashboardSource, type DashboardSource, type DashboardSources } from "@/lib/dashboard-source-state" import {can,ensureAuthConfig} from "@/lib/auth" +import type {DashboardProbe} from "@/lib/dashboard-probes" import {parseDashboardServers,parseDashboardProbes,type DashboardServerRow} from "@/lib/dashboard-readers" import {parseDashboardTraffic,type DashboardTraffic} from "@/lib/dashboard-traffic" import {parseDashboardBgp,type DashboardBgp} from "@/lib/dashboard-bgp" @@ -115,8 +115,8 @@ export interface AttentionRow { export type LatencyBlock = | { kind: "loading" } | { kind: "empty"; message: string } - | { kind: "mock"; series: Record; labels?: Record; subtitle: string } - | { kind: "live"; series: Record; labels?: Record; subtitle: string } + | { kind: "mock"; series: Record; labels?: Record; subtitle: string } + | { kind: "live"; series: Record; labels?: Record; subtitle: string } function apiGreToGreTunnel(t: ApiGreTunnelRow): GreTunnel { return { @@ -206,7 +206,7 @@ export function useDashboardLive() { const isLive = prefsHydrated && mode === "live" const apiFetch = useMemo(() => makeApiFetch(backendUrl), [backendUrl]) - const [liveProbes, setLiveProbes] = useState(null) + const [liveProbes, setLiveProbes] = useState(null) const [liveServers, setLiveServers] = useState(null) const [overlayItems, setOverlayItems] = useState(null) const [bgp, setBgp] = useState(null) @@ -258,7 +258,7 @@ export function useDashboardLive() { const results = { probes: overviewRes, servers: serversRes, bgp: br, gre: greRes, wg: wgRes, traffic: trafficRes, vxlan: vxRes } for (const [key, result] of Object.entries(results)) { recordSource(key as DashboardSource, result.status === "rejected" - ? result.reason instanceof Error ? result.reason.message : "Источник недоступен" : null,key==="traffic"&&trafficRes.status==="fulfilled"?trafficRes.value.sampledAt??undefined:undefined) + ? result.reason instanceof Error ? result.reason.message : "Источник недоступен" : null,key==="traffic"&&trafficRes.status==="fulfilled"?trafficRes.value.sampledAt??undefined:key==="probes"&&overviewRes.status==="fulfilled"?overviewRes.value.sampledAt??undefined:undefined) } const failures = Object.values(results).filter(result => result.status === "rejected").length setError(failures ? "Не все источники обновлены. Последние полученные данные сохранены." : null) @@ -573,7 +573,7 @@ export function useDashboardLive() { kind: "live", series, labels, - subtitle: "Средний RTT · 1 ч · до 8 узлов", + subtitle: "Средний измеренный RTT · 1 ч · до 8 узлов", } }, [prefsHydrated, isLive, liveProbes, loading, liveServers]) @@ -603,13 +603,13 @@ export function useDashboardLive() { const attentionProbes: AttentionRow[] = useMemo(() => { return enabledProbes - .filter((p) => p.status === "down" || p.status === "warn") + .filter((p) => p.status === "down" || p.status === "warn" || p.status === "unknown") .map((p) => ({ id: p.id, title: p.name, - hint: p.status === "warn" ? "Предупреждение" : "Ошибка", + hint: p.status === "unknown" ? "Статус неизвестен" : p.status === "warn" ? "Предупреждение" : "Ошибка", href: "/uptime?probe=" + encodeURIComponent(p.id), - tone: p.status === "warn" ? ("warning" as const) : ("destructive" as const), + tone: p.status === "warn" || p.status === "unknown" ? ("warning" as const) : ("destructive" as const), })) }, [enabledProbes]) @@ -645,7 +645,7 @@ export function useDashboardLive() { }, reliable: { servers: !isLive || (liveServers !== null && !sources.servers?.error && liveServers.every(s=>s.status!=="unknown")), - probes: !isLive || (liveProbes !== null && !sources.probes?.error), + probes: !isLive || (liveProbes !== null && !sources.probes?.error && liveProbes.filter(p=>p.enabled).every(p=>p.status!=="unknown")), overlay: !isLive || ["gre", "wg", "vxlan"].every(key => sources[key as DashboardSource]?.receivedAt != null && !sources[key as DashboardSource]?.error), }, retry: () => { @@ -665,6 +665,7 @@ export function useDashboardLive() { probeDown, probeWarn, probeCount: enabledProbes.length, + unknownProbeCount:enabledProbes.filter(p=>p.status==="unknown").length, latency, recentEvents, eventsLoading, diff --git a/lib/dashboard-latency.ts b/lib/dashboard-latency.ts index 98cfc134..5312439b 100644 --- a/lib/dashboard-latency.ts +++ b/lib/dashboard-latency.ts @@ -3,44 +3,26 @@ import type { PingProbe, Server } from "@/lib/data" /** Длина ряда на графике дашборда (ось времени). */ export const DASH_LATENCY_POINTS = 60 -/** Растягивает/сэмплирует ряд до `targetLen` (линейная интерполяция по индексам). */ -export function padSeriesToLength(values: number[], targetLen: number): number[] { - if (targetLen <= 0) return [] - if (values.length === 0) return Array(targetLen).fill(0) - if (values.length === targetLen) return [...values] - if (values.length > targetLen) return values.slice(values.length - targetLen) - if (values.length === 1) return Array(targetLen).fill(values[0] ?? 0) - const out: number[] = [] - for (let i = 0; i < targetLen; i++) { - const t = (i / (targetLen - 1)) * (values.length - 1) - const j = Math.floor(t) - const f = t - j - const a = values[j] ?? 0 - const b = values[Math.min(j + 1, values.length - 1)] ?? a - out.push(Math.round(a + f * (b - a))) - } - return out -} - export interface DashboardLatencyChartInput { - series: Record + series: Record labels: Record } /** - * Средний RTT по всем включённым пробам с одного источника (srcServerId). + * Средний RTT по измеренным общим корзинам включённых проб одного источника. + * Не интерполируем и не подменяем отсутствующие измерения нулями. * Ключ серии — стабильный id вида `src-`; подпись — площадка или имя сервера. * Ограничение числа линий — чтобы график оставался читаемым. */ export function buildLatencySeriesByProbeSource( - probes: PingProbe[], + probes: Array&{series:(number|null)[]}>, servers: Server[], opts?: { maxServers?: number; points?: number }, ): DashboardLatencyChartInput { const maxServers = opts?.maxServers ?? 8 const points = opts?.points ?? DASH_LATENCY_POINTS - const bySrv = new Map() + const bySrv = new Map&{series:(number|null)[]}>>() for (const p of probes) { if (!p.enabled || !p.series?.length) continue const sid = p.srcServerId @@ -54,7 +36,7 @@ export function buildLatencySeriesByProbeSource( return na.localeCompare(nb, "ru") }).slice(0, maxServers) - const series: Record = {} + const series: Record = {} const labels: Record = {} for (const sid of sortedIds) { @@ -62,16 +44,15 @@ export function buildLatencySeriesByProbeSource( const innerLen = plist.reduce((m, p) => Math.max(m, p.series.length), 0) if (innerLen === 0) continue - const averaged = Array.from({ length: innerLen }, (_, i) => { - const vals = plist - .map((p) => p.series[i]) - .filter((v): v is number => typeof v === "number" && Number.isFinite(v)) - if (!vals.length) return 0 - return Math.round(vals.reduce((x, y) => x + y, 0) / vals.length) + const averaged = Array.from({ length: Math.min(innerLen,points) }, (_, i) => { + const vals=plist.map(p=>p.series[i]) + if(vals.some(v=>typeof v!=="number"||!Number.isFinite(v)))return null + const mean=vals.reduce((sum,v)=>sum+(v??0),0)/vals.length + return Number.isFinite(mean)?Math.round(mean):null }) - - const key = `src-${sid}` - series[key] = padSeriesToLength(averaged, points) + if(!averaged.some(v=>v!==null))continue + const key = "src-"+sid + series[key] = averaged const srv = servers.find((s) => s.id === sid) const site = srv?.site?.trim() labels[key] = diff --git a/lib/dashboard-probes.test.ts b/lib/dashboard-probes.test.ts new file mode 100644 index 00000000..0769b39e --- /dev/null +++ b/lib/dashboard-probes.test.ts @@ -0,0 +1,21 @@ +import assert from "node:assert/strict" +import {test} from "node:test" +import {parseDashboardProbes} from "./dashboard-probes" +import {buildLatencySeriesByProbeSource} from "./dashboard-latency" +const start="2026-10-03T00:00:00Z",end="2026-10-03T01:00:00Z" +const base={id:"p1",srcServerId:"1",name:"Проверка",target:"192.0.2.1",filter:"main",rtt:0,loss:0,status:"up",series:[0],enabled:true,showOnDashboard:true} +const sampled={sampledAt:"2026-10-03T00:30:00Z",rtt:0,loss:0,status:"up"} +const payload=(samples:unknown[])=>({rangeStartAt:start,rangeEndAt:end,probes:[{...base,observations:{samples}}]}) +test("ping legacy and empty samples do not prove up, down, loss or historical zero",()=>{ + for(const raw of [{probes:[base]},payload([])]){const p=parseDashboardProbes(raw).probes[0];assert.equal(p.status,"unknown");assert.equal(p.rtt,null);assert.equal(p.loss,null);assert.ok(p.series.every(v=>v===null))} + assert.deepEqual(parseDashboardProbes({probes:[]}),{probes:[],sampledAt:null}) +}) +test("ping observed zero and failure retain independent measurement values and sparse time axis",()=>{ + const p=parseDashboardProbes(payload([sampled])).probes[0];assert.equal(p.status,"up");assert.equal(p.rtt,0);assert.equal(p.loss,0);assert.equal(p.series[30],0);assert.equal(p.series.filter(v=>v!==null).length,1) + const failed=parseDashboardProbes(payload([sampled,{...sampled,sampledAt:"2026-10-03T00:31:00Z",rtt:null,loss:100,status:"down"}])).probes[0];assert.equal(failed.status,"down");assert.equal(failed.loss,100);assert.equal(failed.series[31],null) + assert.deepEqual(buildLatencySeriesByProbeSource([p],[]).series["src-1"],p.series) + assert.deepEqual(buildLatencySeriesByProbeSource([p,{...p,srcServerId:"1",series:Array(60).fill(null)}],[]).series,{}) +}) +test("ping invalid time axis, duplicate or out of range samples cannot replace cache",()=>{ + for(const raw of [payload([sampled,sampled]),payload([{...sampled,sampledAt:"invalid"}]),payload([{...sampled,sampledAt:"2026-10-02T00:00:00Z"}]),{...payload([sampled]),rangeEndAt:start},{...payload([sampled]),rangeStartAt:undefined},payload([{...sampled,loss:101}])])assert.throws(()=>parseDashboardProbes(raw)) +}) diff --git a/lib/dashboard-probes.ts b/lib/dashboard-probes.ts new file mode 100644 index 00000000..a69cd6e4 --- /dev/null +++ b/lib/dashboard-probes.ts @@ -0,0 +1,23 @@ +import {z} from "zod" +import type {PingProbe} from "@/lib/data" +const date=z.iso.datetime({offset:true}) +const sample=z.object({sampledAt:date,rtt:z.number().finite().nonnegative().nullable(),loss:z.number().finite().min(0).max(100),status:z.enum(["up","warn","down"])}) +const probe=z.object({id:z.string().trim().min(1),srcServerId:z.string().trim().min(1),srcInterface:z.string().optional(),name:z.string(),target:z.string(),filter:z.string(),rtt:z.number().finite().nonnegative().nullable(),loss:z.number().finite().min(0).max(100),status:z.enum(["up","warn","down"]),series:z.array(z.number().finite().nonnegative()),enabled:z.boolean(),showOnDashboard:z.boolean(),observations:z.object({samples:z.array(sample)}).optional()}) +const overview=z.object({probes:z.array(probe).refine(rows=>new Set(rows.map(r=>r.id)).size===rows.length),rangeStartAt:date.optional(),rangeEndAt:date.optional()}).refine(raw=>{ + if(!raw.probes.some(p=>p.observations))return true + if(!raw.rangeStartAt||!raw.rangeEndAt)return false + const start=Date.parse(raw.rangeStartAt),end=Date.parse(raw.rangeEndAt) + return end>start&&raw.probes.every(p=>{const samples=p.observations?.samples??[];return new Set(samples.map(s=>Date.parse(s.sampledAt))).size===samples.length&&samples.every((s,i)=>Date.parse(s.sampledAt)>=start&&Date.parse(s.sampledAt)<=end&&(i===0||Date.parse(s.sampledAt)>Date.parse(samples[i-1].sampledAt)))}) +}) +export type DashboardProbe=Omit&{status:PingProbe["status"]|"unknown";loss:number|null;series:(number|null)[];sampledAt?:string|null;historyObserved?:boolean} +function meanRtt(values:Array){const mean=values.reduce((sum,v)=>sum+(v??0),0)/values.length;if(!Number.isFinite(mean))throw Error("Средний RTT превышает допустимый диапазон");return Math.round(mean)} +export function parseDashboardProbes(raw:unknown):{probes:DashboardProbe[];sampledAt:string|null}{ + const parsed=overview.safeParse(raw);if(!parsed.success)throw Error("Некорректные данные проб") + const data=parsed.data,start=data.rangeStartAt?Date.parse(data.rangeStartAt):0,end=data.rangeEndAt?Date.parse(data.rangeEndAt):0 + const probes:DashboardProbe[]=data.probes.map(p=>{const samples=p.observations?.samples??[],last=samples.at(-1);const buckets:Array>=Array.from({length:60},()=>[]) + for(const s of samples){const i=Math.min(59,Math.floor((Date.parse(s.sampledAt)-start)/(end-start)*60));buckets[i].push(s.rtt)} + return {...p,status:last?.status??"unknown",rtt:last?.rtt??null,loss:last?.loss??null,sampledAt:last?.sampledAt??null,historyObserved:!!p.observations,series:buckets.map(values=>!values.length||values.some(v=>v===null)?null:meanRtt(values))} + }) + const active=probes.filter(p=>p.enabled),times=active.map(p=>p.sampledAt).filter((v):v is string=>!!v) + return {probes,sampledAt:active.length&×.length===active.length?new Date(times.reduce((oldest,v)=>Math.min(oldest,Date.parse(v)),Infinity)).toISOString():null} +} diff --git a/lib/dashboard-readers.test.ts b/lib/dashboard-readers.test.ts index bf29bac4..e014b895 100644 --- a/lib/dashboard-readers.test.ts +++ b/lib/dashboard-readers.test.ts @@ -8,6 +8,6 @@ test("dashboard server catalog validates identities and keeps unknown status",() for(const raw of [{},[server,server],[{...server,status:"invalid"}],[{...server,latency:-1}],[{...server,id:0}],[{id:1}]])assert.throws(()=>parseDashboardServers(raw)) }) test("dashboard probes validate real shape, uniqueness and numeric ranges before publication",()=>{ - assert.equal(parseDashboardProbes({probes:[probe]}).probes[0].rtt,null);assert.deepEqual(parseDashboardProbes({probes:[]}),{probes:[]}) + assert.equal(parseDashboardProbes({probes:[probe]}).probes[0].rtt,null);assert.deepEqual(parseDashboardProbes({probes:[]}),{probes:[],sampledAt:null}) for(const raw of [{},{probes:[probe,probe]},{probes:[{...probe,loss:101}]},{probes:[{...probe,status:"invalid"}]},{probes:[{...probe,series:[null]}]},{probes:[{}]}])assert.throws(()=>parseDashboardProbes(raw)) }) diff --git a/lib/dashboard-readers.ts b/lib/dashboard-readers.ts index 101e0262..f497ed0d 100644 --- a/lib/dashboard-readers.ts +++ b/lib/dashboard-readers.ts @@ -2,8 +2,6 @@ import {z} from "zod" import {serverReadSchema} from "@mmapp/contracts/servers" const server=serverReadSchema.pick({id:true,name:true,host:true,site:true,country:true,asn:true,type:true,enabled:true,status:true,latency:true,os:true,model:true}).extend({id:z.number().int().positive(),host:z.string().trim().min(1),latency:z.number().finite().nonnegative().nullable(),sessions:z.number().int().nonnegative(),wanUplinks:serverReadSchema.shape.wanUplinks.optional()}) const servers=z.array(server).refine(rows=>new Set(rows.map(r=>r.id)).size===rows.length) -const probe=z.object({id:z.string().trim().min(1),srcServerId:z.string().trim().min(1),srcInterface:z.string().optional(),name:z.string(),target:z.string(),filter:z.string(),rtt:z.number().finite().nonnegative().nullable(),loss:z.number().finite().min(0).max(100),status:z.enum(["up","warn","down"]),series:z.array(z.number().finite().nonnegative()),enabled:z.boolean(),showOnDashboard:z.boolean()}) -const overview=z.object({probes:z.array(probe).refine(rows=>new Set(rows.map(r=>r.id)).size===rows.length)}) +export {parseDashboardProbes} from "@/lib/dashboard-probes" export type DashboardServerRow=z.infer export function parseDashboardServers(raw:unknown){const parsed=servers.safeParse(raw);if(!parsed.success)throw Error("Некорректный каталог серверов");return parsed.data} -export function parseDashboardProbes(raw:unknown){const parsed=overview.safeParse(raw);if(!parsed.success)throw Error("Некорректные данные проб");return parsed.data} diff --git a/tests/e2e/dashboard-data.spec.ts b/tests/e2e/dashboard-data.spec.ts index f7bfb34c..fabd09b5 100644 --- a/tests/e2e/dashboard-data.spec.ts +++ b/tests/e2e/dashboard-data.spec.ts @@ -236,3 +236,8 @@ for(const kind of ["servers","probes"])for(const broken of ["missing","duplicate test("Dashboard unknown server status is not reported offline or healthy",async({page})=>{ const control=await setup(page);await expect(refresh(page)).toBeEnabled();control.serversPayload=[{id:1,name:"Неопрошенный узел",host:"192.0.2.1",site:"TEST",country:"RU",asn:"64512",type:"exit-node",enabled:true,status:null,latency:null,os:null,model:null,sessions:0}];await refresh(page).click();const tile=page.getByRole("link").filter({hasText:"Серверы онлайн"});await expect(tile).toContainText("Статус неизвестен: 1");await expect(tile).not.toContainText("не в сети");await expect(page.getByRole("region",{name:"Требует внимания",exact:true}).getByRole("link",{name:/Неопрошенный узел/})).toContainText("Статус неизвестен");await expect(page.getByText("Серверы без проблем",{exact:true})).toHaveCount(0);await expect(page.locator('[data-source="servers"]')).not.toContainText("ошибка"); }) + +for(const state of ["legacy","unmeasured","zero","failure","gaps","invalid"])test("Dashboard ping distinguishes observed and missing measurements/"+state,async({page})=>{ + const control=await setup(page);await expect(refresh(page)).toBeEnabled();const probe={id:"ping-observation",srcServerId:"1",name:"Измерение ping",target:"192.0.2.2",filter:"main",rtt:0,loss:0,status:"up",series:[0],enabled:true,showOnDashboard:true};const sample=(minute:number,rtt:number|null,status="up",loss=0)=>({sampledAt:"2026-10-03T00:"+String(minute).padStart(2,"0")+":00Z",rtt,status,loss});const samples=state==="unmeasured"?[]:state==="failure"?[sample(30,null,"down",100)]:state==="gaps"?[sample(29,5),sample(30,6),sample(32,0)]:state==="invalid"?[sample(30,0),sample(30,0)]:[sample(30,0)];control.probesPayload=state==="legacy"?{probes:[probe]}:{rangeStartAt:"2026-10-03T00:00:00Z",rangeEndAt:"2026-10-03T01:00:00Z",probes:[{...probe,observations:{samples}}]};await refresh(page).click();await expect(refresh(page)).toBeEnabled();const source=page.locator('[data-source="probes"]');if(state==="invalid"){await expect(source).toContainText("ошибка обновления");return}await expect(source).not.toContainText("ошибка");const row=page.locator('tr[data-row-id]').filter({hasText:"Измерение ping"});await expect(row).toHaveCount(1); + if(state==="legacy"||state==="unmeasured"){await expect(row).toContainText("Неизвестно");await expect(page.getByRole("link").filter({hasText:"Проверки с проблемами"})).toContainText("неизвестны: 1");await expect(page.getByText("Проверки без ошибок",{exact:true})).toHaveCount(0);await expect(row).not.toContainText("100%");await expect(page.locator('[data-latency-source]')).toHaveCount(0)}else if(state==="failure"){await expect(row).toContainText("Оффлайн");await expect(row).toContainText("100%");await expect(page.getByRole("link").filter({hasText:"Проверки с проблемами"})).toContainText("1 ошибок")}else{await expect(row).toContainText("Онлайн");await expect(row).toContainText("0%");await expect(page.locator('[data-latency-isolated]')).toHaveCount(1);if(state==="gaps"){await expect(page.locator('.recharts-line-curve')).toHaveAttribute("d",/M.*M/);for(const width of [1440,320]){await page.setViewportSize({width,height:900});await page.getByRole("region",{name:"История RTT по источникам",exact:true}).scrollIntoViewIfNeeded();expect(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth)).toBe(true);await page.screenshot({path:"docs/ux-ui/screens/dashboard-observed-ping-"+width+".png",animations:"disabled"})}}else await expect(page.locator('[data-latency-segment]')).toHaveCount(0);await expect(source.locator("time").last()).toHaveAttribute("datetime",new Date(samples.at(-1)!.sampledAt).toISOString())} +})