Skip to content

Commit

Permalink
Add telemetry configuration option for enabled network interfaces, wi…
Browse files Browse the repository at this point in the history
…th 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
  • Loading branch information
skrashevich committed May 26, 2023
1 parent e75ef9a commit c3c3aec
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 8 deletions.
8 changes: 8 additions & 0 deletions docs/docs/configuration/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions frigate/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,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.")


Expand Down
6 changes: 3 additions & 3 deletions frigate/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ async def run_tasks() -> None:
[
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)),
]
)

Expand All @@ -119,9 +119,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
Expand Down
13 changes: 8 additions & 5 deletions frigate/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -846,24 +846,27 @@ def get_cpu_stats() -> dict[str, dict]:
return usages


def get_physical_interfaces():
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()
if interface.startswith(("eth", "enp", "eno", "ens", "wl", "lo")):
physical_interfaces.append(interface)
for int in interfaces:
if interface.startswith(int):
physical_interfaces.append(interface)

return physical_interfaces


def get_bandwidth_stats() -> dict[str, dict]:
def get_bandwidth_stats(config) -> dict[str, dict]:
"""Get bandwidth usages for each ffmpeg process id"""
usages = {}
top_command = ["nethogs", "-t", "-v0", "-c5", "-d1"] + get_physical_interfaces()
top_command = ["nethogs", "-t", "-v0", "-c5", "-d1"] + get_physical_interfaces(
config.telemetry.network_interfaces
)

p = sp.run(
top_command,
Expand Down

0 comments on commit c3c3aec

Please sign in to comment.