From 4f6856e8fa4267d04b47c2bae19e2308affa8e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Ant=C3=B4nio=20Cardoso?= Date: Sat, 25 Jul 2026 12:18:25 -0300 Subject: [PATCH] frontend: store: Use linux2rest network probe deltas for rates Map tray upload/download speeds from received_B/transmitted_B divided by the linux2rest Sampler interval instead of re-differencing total_* across frontend polls. Show the same probe deltas on NetworkCard. --- .../system-information/NetworkCard.vue | 16 ++++++++-------- core/frontend/src/store/system-information.ts | 17 +++++++---------- .../src/types/system-information/system.ts | 8 ++++---- core/frontend/src/utils/networking.ts | 9 +++++++++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/core/frontend/src/components/system-information/NetworkCard.vue b/core/frontend/src/components/system-information/NetworkCard.vue index 288053480e..b75ba9b38e 100644 --- a/core/frontend/src/components/system-information/NetworkCard.vue +++ b/core/frontend/src/components/system-information/NetworkCard.vue @@ -62,9 +62,9 @@ mdi-package-down - Received package: + Packets received: - {{ network.total_packets_received }} + {{ network.packets_received }} / {{ network.total_packets_received }} total @@ -74,33 +74,33 @@ mdi-package-up - Transmitted package: + Packets transmitted: - {{ network.total_packets_transmitted }} + {{ network.packets_transmitted }} / {{ network.total_packets_transmitted }} total - mdi-cloud-upload + mdi-cloud-download Bytes received: - {{ formatSize(network.total_received_B) }} + {{ formatSize(network.received_B) }} / {{ formatSize(network.total_received_B) }} total - mdi-cloud-download + mdi-cloud-upload Bytes transmitted: - {{ formatSize(network.total_transmitted_B) }} + {{ formatSize(network.transmitted_B) }} / {{ formatSize(network.total_transmitted_B) }} total diff --git a/core/frontend/src/store/system-information.ts b/core/frontend/src/store/system-information.ts index fd273a727e..6b0930a9ef 100644 --- a/core/frontend/src/store/system-information.ts +++ b/core/frontend/src/store/system-information.ts @@ -20,6 +20,7 @@ import { CPU, Disk, Info, Memory, Network, Process, System, Temperature, } from '@/types/system-information/system' import back_axios, { isBackendOffline } from '@/utils/api' +import { networkProbeRateBps } from '@/utils/networking' export enum FetchType { KernelType = 'kernel_buffer', @@ -182,16 +183,12 @@ class SystemInformationStore extends VuexModule { @Mutation updateSystemNetwork(networks: [Network]): void { if (this.system) { - // derivate interface upload and download speeds from the previous values - const now = Date.now() - for(let network of networks) { - const previousNetwork = this.system.network.find(n => n.name === network.name) - const dt = (now - (previousNetwork?.last_update ?? 5)) / 1000 - network.last_update = now - if (previousNetwork) { - network.download_speed = (network.total_received_B - previousNetwork.total_received_B) / dt - network.upload_speed = (network.total_transmitted_B - previousNetwork.total_transmitted_B) / dt - } + // Use linux2rest/sysinfo per-sample deltas (received_B / transmitted_B), not a + // frontend re-diff of total_*. Those deltas are already saturating and match the + // Sampler window (LINUX2REST_SYSTEM_SAMPLE_INTERVAL_S). + for (const network of networks) { + network.download_speed = networkProbeRateBps(network.received_B) + network.upload_speed = networkProbeRateBps(network.transmitted_B) } this.system.network = networks } diff --git a/core/frontend/src/types/system-information/system.ts b/core/frontend/src/types/system-information/system.ts index 8f3b3297d5..d0cb5c436c 100644 --- a/core/frontend/src/types/system-information/system.ts +++ b/core/frontend/src/types/system-information/system.ts @@ -83,15 +83,16 @@ export interface Network { * @param name - Name of the interface, E.g: "lo", "eth0" * @param packets_received - Number of packages received since last probe * @param packets_transmitted - Number of packages transmitted since last probe - * @param received_B - Number of bytes received since last probe + * @param received_B - Bytes received since last linux2rest/sysinfo probe * @param total_errors_on_received - Total number of errors when receiving packages * @param total_errors_on_transmitted - Total number of errors when transmitting packages * @param total_packets_received - Total number of packages received * @param total_packets_transmitted - Total number of packages transmitted * @param total_received_B - Total number of bytes received * @param total_transmitted_B - Total number of bytes transmitted - * @param transmitted_B - Number of bytes received since last probe - * @param last_update - Unix time in seconds + * @param transmitted_B - Bytes transmitted since last linux2rest/sysinfo probe + * @param upload_speed - Frontend: transmitted_B / linux2rest sample interval (B/s) + * @param download_speed - Frontend: received_B / linux2rest sample interval (B/s) * */ description: string, errors_on_received: number, @@ -111,7 +112,6 @@ export interface Network { total_received_B: number, total_transmitted_B: number, transmitted_B: number - last_update?: number upload_speed?: number download_speed?: number } diff --git a/core/frontend/src/utils/networking.ts b/core/frontend/src/utils/networking.ts index d5f271696e..1c6ecbf23b 100644 --- a/core/frontend/src/utils/networking.ts +++ b/core/frontend/src/utils/networking.ts @@ -1,3 +1,12 @@ +// Must match linux2rest Sampler interval (src/main.rs: Duration::from_secs(5)). +// TODO: prefer a probed interval if/when linux2rest exposes it (Mbps silently drift if Sampler cadence changes). +export const LINUX2REST_SYSTEM_SAMPLE_INTERVAL_S = 5 + +/** Convert a linux2rest per-sample byte delta into a bytes-per-second rate. Negative deltas are clamped to zero. */ +export function networkProbeRateBps(bytesSinceLastProbe: number): number { + return Math.max(0, bytesSinceLastProbe) / LINUX2REST_SYSTEM_SAMPLE_INTERVAL_S +} + export function formatBandwidth(bytesPerSecond: number): string { const mbps = (8 * bytesPerSecond / 1024 / 1024) const decimal_places = mbps < 10 ? 2 : mbps < 100 ? 1 : 0