fix(ui): убрать выдуманные измерения из карты сети

This commit is contained in:
Denozordec committed 2026-10-01 01:46:29 +07:00
1 parent 329d6b82f7
commit e47e2b4029
7 files changed
+100 -37

No files matched your search

+2 -2
View File
@@ -315,9 +315,9 @@ export function mergeGreMetricsWithSpeedProbe(
(sp.lastPingRttMs != null || sp.lastTxAvgMbps != null || sp.lastRxAvgMbps != null)
const pingMs = sp?.lastPingRttMs ?? fallback.pingMs
const dlMbps =
sp?.lastTxAvgMbps != null ? Math.round(sp.lastTxAvgMbps) : fallback.dlMbps
sp?.lastTxAvgMbps != null ? sp.lastTxAvgMbps : fallback.dlMbps
const ulMbps =
sp?.lastRxAvgMbps != null ? Math.round(sp.lastRxAvgMbps) : fallback.ulMbps
sp?.lastRxAvgMbps != null ? sp.lastRxAvgMbps : fallback.ulMbps
return { pingMs, dlMbps, ulMbps, hasSpeedMonitor }
}
+21 -11
View File
@@ -10,14 +10,15 @@ import {
wanUplinkIpMatchesGreOuter,
} from "@/lib/gre-endpoint-resolve"
/** Визуализация метрик на GRE (нет отдельного API замеров для карты). */
/** Неизвестные live метрики GRE; синтетические значения доступны только при demo=true. */
export interface TunnelProbe {
pingMs: number | null
dlMbps: number | null
ulMbps: number | null
}
export function greTunnelProbe(t: GreTunnel): TunnelProbe {
export function greTunnelProbe(t: GreTunnel, demo = false): TunnelProbe {
if (!demo) return {pingMs:null,dlMbps:null,ulMbps:null}
if (t.status === "down" || !t.enabled)
return { pingMs: null, dlMbps: null, ulMbps: null }
const h = t.id.split("").reduce((a, c) => a + c.charCodeAt(0), 0)
@@ -89,15 +90,16 @@ export interface WanJhEdge {
}
export interface NetworkMapSrvRes {
cpu: number
cpu: number | null
cpuHistory: number[]
ramUsed: number
ramTotal: number
hddUsed: number
hddTotal: number
uptimeSeconds: number
ramUsed: number | null
ramTotal: number | null
hddUsed: number | null
hddTotal: number | null
uptimeSeconds: number | null
temp?: number
/** CPU/RAM/uptime сняты с последнего снапшота опроса; HDD в API нет — по-прежнему условная шкала. */
/** Live значения сняты с последнего опроса; отсутствующие поля и HDD неизвестны. */
measuredAt?: string | null
fromPoll?: boolean
}
@@ -533,8 +535,16 @@ export function buildWanJhEdges(servers: Server[]): WanJhEdge[] {
return edges
}
/** Ресурсы для карточки узла на карте: при наличии снапшота опроса — как в разделе «Серверы», иначе демо по id. */
export function buildServerResourceMap(servers: Server[]): Record<string, NetworkMapSrvRes> {
/** Ресурсы API без синтетической истории и fallback; demo=true включает демонстрацию по id. */
export function buildServerResourceMap(servers: Server[], demo = false): Record<string, NetworkMapSrvRes> {
if (!demo) return Object.fromEntries(servers.map(s=>[s.id,{
cpu:s.cpuLoad ?? null,cpuHistory:[],
ramTotal:s.totalMemory==null?null:s.totalMemory/(1024*1024),
ramUsed:s.totalMemory==null||s.freeMemory==null?null:(s.totalMemory-s.freeMemory)/(1024*1024),
hddUsed:null,hddTotal:null,
uptimeSeconds:s.uptime && /^(?:\d+[wdhms])+$/.test(s.uptime)?parseRouterosUptimeToSeconds(s.uptime):null,
measuredAt:s.polledAt ?? null,fromPoll:true,
} satisfies NetworkMapSrvRes]))
return Object.fromEntries(
servers.map((s) => {
const h = s.id.split("").reduce((a, c) => a + c.charCodeAt(0), 0)
+21
View File
@@ -0,0 +1,21 @@
import {test} from "node:test"
import assert from "node:assert/strict"
import {buildServerResourceMap,greTunnelProbe} from "./network-map-layout"
import {mergeGreMetricsWithSpeedProbe} from "./map-gre-speed-probe"
import {servers,greTunnels} from "./data"
test("live resources preserve zero, partial poll and unknowns without fake history",()=>{
const base={...servers[0],cpuLoad:undefined,totalMemory:undefined,freeMemory:undefined,uptime:undefined,polledAt:undefined}
const unknown=buildServerResourceMap([base])[base.id]
assert.deepEqual(unknown,{cpu:null,cpuHistory:[],ramTotal:null,ramUsed:null,hddUsed:null,hddTotal:null,uptimeSeconds:null,measuredAt:null,fromPoll:true})
const partial=buildServerResourceMap([{...base,cpuLoad:0,uptime:"0s",polledAt:"2020-01-01T00:00:00Z"}])[base.id]
assert.equal(partial.cpu,0);assert.equal(partial.uptimeSeconds,0);assert.equal(partial.measuredAt,"2020-01-01T00:00:00Z");assert.equal(partial.ramUsed,null)
const memory=buildServerResourceMap([{...base,totalMemory:1048576,freeMemory:1048576,uptime:"bad"}])[base.id]
assert.equal(memory.ramUsed,0);assert.equal(memory.ramTotal,1);assert.equal(memory.uptimeSeconds,null)
assert.ok(buildServerResourceMap([base],true)[base.id].cpuHistory.length>0)
})
test("live GRE does not hash metrics and probe values retain zero and fractions",()=>{
const fallback=greTunnelProbe(greTunnels[0]);assert.deepEqual(fallback,{pingMs:null,dlMbps:null,ulMbps:null})
assert.equal(greTunnelProbe(greTunnels[0],true).pingMs!=null,true)
const merged=mergeGreMetricsWithSpeedProbe({id:"p",srcServerId:"1",dstServerId:"2",lastPingRttMs:0,lastTxAvgMbps:0,lastRxAvgMbps:0.125},fallback)
assert.deepEqual(merged,{pingMs:0,dlMbps:0,ulMbps:0.125,hasSpeedMonitor:true})
})