From 8d941e5e26ed659e11bd25400addec51dc20f470 Mon Sep 17 00:00:00 2001 From: Sergey Krashevich Date: Sun, 11 Jun 2023 15:34:03 +0300 Subject: [PATCH] Add function to get physical interfaces for bandwidth calculation (#6618) * Add function to get physical interfaces for bandwidth calculation in get_bandwidth_stats() function * Add telemetry configuration option for enabled network interfaces, with default values for monitoring bandwidth stats for camera ffmpeg processes, go2rtc, and object detectors. Also add support for FrigateConfig in set_bandwidth_stats function to get bandwidth stats for specified network interfaces --- docs/docs/configuration/index.md | 8 ++++++++ frigate/config.py | 4 ++++ frigate/stats.py | 6 +++--- frigate/util.py | 21 +++++++++++++++++++-- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/docs/docs/configuration/index.md b/docs/docs/configuration/index.md index 0a1b230aa..d40d235b9 100644 --- a/docs/docs/configuration/index.md +++ b/docs/docs/configuration/index.md @@ -558,6 +558,14 @@ ui: # Optional: Telemetry configuration telemetry: + # Optional: Enabled network interfaces for bandwidth stats monitoring (default: shown below) + network_interfaces: + - eth + - enp + - eno + - ens + - wl + - lo # Optional: Enable the latest version outbound check (default: shown below) # NOTE: If you use the HomeAssistant integration, disabling this will prevent it from reporting new versions version_check: True diff --git a/frigate/config.py b/frigate/config.py index 5c2f27b5a..43a43be0d 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -90,6 +90,10 @@ class UIConfig(FrigateBaseModel): class TelemetryConfig(FrigateBaseModel): + network_interfaces: List[str] = Field( + default=["eth", "enp", "eno", "ens", "wl", "lo"], + title="Enabled network interfaces for bandwidth calculation.", + ) version_check: bool = Field(default=True, title="Enable latest version check.") diff --git a/frigate/stats.py b/frigate/stats.py index 3fd881029..dd8c4b06d 100644 --- a/frigate/stats.py +++ b/frigate/stats.py @@ -108,7 +108,7 @@ def get_processing_stats( [ asyncio.create_task(set_gpu_stats(config, stats, hwaccel_errors)), asyncio.create_task(set_cpu_stats(stats)), - asyncio.create_task(set_bandwidth_stats(stats)), + asyncio.create_task(set_bandwidth_stats(config, stats)), ] ) @@ -126,9 +126,9 @@ async def set_cpu_stats(all_stats: dict[str, Any]) -> None: all_stats["cpu_usages"] = cpu_stats -async def set_bandwidth_stats(all_stats: dict[str, Any]) -> None: +async def set_bandwidth_stats(config: FrigateConfig, all_stats: dict[str, Any]) -> None: """Set bandwidth from nethogs.""" - bandwidth_stats = get_bandwidth_stats() + bandwidth_stats = get_bandwidth_stats(config) if bandwidth_stats: all_stats["bandwidth_usages"] = bandwidth_stats diff --git a/frigate/util.py b/frigate/util.py index e624e877a..897aa8d21 100755 --- a/frigate/util.py +++ b/frigate/util.py @@ -844,10 +844,27 @@ def get_cpu_stats() -> dict[str, dict]: return usages -def get_bandwidth_stats() -> dict[str, dict]: +def get_physical_interfaces(interfaces) -> list: + with open("/proc/net/dev", "r") as file: + lines = file.readlines() + + physical_interfaces = [] + for line in lines: + if ":" in line: + interface = line.split(":")[0].strip() + for int in interfaces: + if interface.startswith(int): + physical_interfaces.append(interface) + + return physical_interfaces + + +def get_bandwidth_stats(config) -> dict[str, dict]: """Get bandwidth usages for each ffmpeg process id""" usages = {} - top_command = ["nethogs", "-t", "-v0", "-c5", "-d1"] + top_command = ["nethogs", "-t", "-v0", "-c5", "-d1"] + get_physical_interfaces( + config.telemetry.network_interfaces + ) p = sp.run( top_command,