fix(traffic): учитывать пик только подтверждённых измерений

This commit is contained in:
Denozordec committed 2026-10-13 02:14:03 +07:00
1 parent 504f62fc0b
commit 7c667f8036
15 files changed
+1297 -15

No files matched your search

@@ -10,3 +10,9 @@ assert.equal(first.observations!.rxNow,false);assert.equal(first.sessions,2)
const next=calc([sample('a',0,0,false),sample('a',30_000,0),sample('a',60_000,0),sample('a',90_000,0),sample('new',60_000,0,false),sample('new',90_000,0)])
assert.equal(next.observations!.rxNow,true);assert.equal(next.rxNow,0);assert.equal(next.sessions,2)
console.log('wave membership removal/addition/baseline/zero/history/active count passed')
const partialPeak=calc([sample('a',0,0,false),sample('a',30_000,0),sample('a',60_000,1024**2),sample('new',60_000,0,false),sample('a',90_000,1024**2),sample('new',90_000,0)])
assert.equal(partialPeak.observations!.rxNow,true);assert.equal(partialPeak.rxPeak,0);assert.equal(partialPeak.txPeak,0);assert.equal(partialPeak.rxTotalGiB,1/1024)
const future=calc([sample('a',0,0,false),sample('a',30_000,0),sample('a',120_000,1024**2)])
assert.equal(future.rxPeak,0);assert.equal(future.txPeak,0)
console.log('peak excludes incomplete waves and out-of-range points; volumes retained')
+6 -2
View File
@@ -226,8 +226,12 @@ export function buildTrafficFromSamples(
const txSeries = bucketAvg(txPoints, rangeStartMs, rangeEndMs)
const lastTs = [...byTs.keys()].sort((a, b) => a - b).at(-1)
const last = lastTs != null ? byTs.get(lastTs) : undefined
const rxPeak = rxPoints.reduce((m, p) => Math.max(m, p.v), 0)
const txPeak = txPoints.reduce((m, p) => Math.max(m, p.v), 0)
const peak = (points: Array<{t:number;v:number}>, side: "rxObserved"|"txObserved") => points.reduce((m,p) => {
const wave = byTs.get(p.t)!
return p.t >= rangeStartMs && p.t <= rangeEndMs && wave[side] && wave.count === expectedAt(p.t) ? Math.max(m,p.v) : m
},0)
const rxPeak = peak(rxPoints,"rxObserved")
const txPeak = peak(txPoints,"txObserved")
return {
rxNow: last?.rx ?? 0,
@@ -55,6 +55,10 @@ else {
}
await put("newInterface",0,0);await pool.query("UPDATE traffic_samples SET flags=45 WHERE server_id=$1 AND interface_name='newInterface'",[serverId]);
s=(await get(`/traffic/servers/${serverId}?range=1h`)).server;assert.equal(s.observations.rxNow,false);assert.equal(s.sessions,2);cases++;
await pool.query("DELETE FROM traffic_samples WHERE server_id=$1",[serverId]);
for(const[name,offset,bytes]of[["ether1",-90_000,0],["ether1",-60_000,0],["ether1",-30_000,1024**2],["new",-30_000,0],["ether1",0,1024**2],["new",0,0]] as const)await put(name,offset,bytes);
await pool.query("UPDATE traffic_samples SET flags=61,native_counter_identity=interface_name WHERE server_id=$1",[serverId]);await pool.query("UPDATE traffic_samples SET flags=45 WHERE server_id=$1 AND interface_name='new' AND sampled_at=$2",[serverId,new Date(Date.parse(at)-30_000).toISOString()]);
s=(await get(`/traffic/servers/${serverId}?range=1h`)).server;assert.equal(s.observations.rxNow,true);assert.equal(s.rxPeak,0);assert.equal(s.txPeak,0);assert.equal(s.rxTotal,1/1024);assert(s.observations.rxSeries.some(Boolean));cases++;
console.log(`traffic volume owned SQL: ${cases} cases; exact bytes/binary unit/server/user/binding/100-part aggregate/reset passed`)
}finally{await app.close();await pool.query("DELETE FROM app_users WHERE id=$1",[userId]);if(serverId!==undefined){await pool.query("DELETE FROM traffic_samples WHERE server_id=$1",[serverId]);await pool.query("DELETE FROM servers WHERE id=$1",[serverId])}await closePool()}
}