+
+ Detectors
+
+
+ {detInferenceTimeSeries.length != 0 ? (
+
+
Detector Inference Speed
+ {detInferenceTimeSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+ {statsHistory.length != 0 ? (
+
+
Detector CPU Usage
+ {detCpuSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+ {statsHistory.length != 0 ? (
+
+
Detector Memory Usage
+ {detMemSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+
+
+ {(statsHistory.length == 0 || statsHistory[0].gpu_usages) && (
+ <>
+
+
+ GPUs
+
+ {statsHistory.length > 0 &&
+ Object.keys(statsHistory[0].gpu_usages ?? {}).filter(
+ (key) =>
+ key == "amd-vaapi" ||
+ key == "intel-vaapi" ||
+ key == "intel-qsv",
+ ).length > 0 && (
+
+ )}
+
+
+ {statsHistory.length != 0 ? (
+
+
GPU Usage
+ {gpuSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+ {statsHistory.length != 0 ? (
+
+
GPU Memory
+ {gpuMemSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+
+ >
+ )}
+
+
+ Other Processes
+
+
+ {statsHistory.length != 0 ? (
+
+
Process CPU Usage
+ {otherProcessCpuSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+ {statsHistory.length != 0 ? (
+
+
Process Memory Usage
+ {otherProcessMemSeries.map((series) => (
+
+ ))}
+
+ ) : (
+
+ )}
+
+
+ >
+ );
+}
diff --git a/web/src/views/system/StorageMetrics.tsx b/web/src/views/system/StorageMetrics.tsx
new file mode 100644
index 000000000..d275e72fe
--- /dev/null
+++ b/web/src/views/system/StorageMetrics.tsx
@@ -0,0 +1,92 @@
+import { StorageGraph } from "@/components/graph/SystemGraph";
+import { FrigateStats } from "@/types/stats";
+import { useMemo } from "react";
+import useSWR from "swr";
+
+type CameraStorage = {
+ [key: string]: {
+ bandwidth: number;
+ usage: number;
+ usage_percent: number;
+ };
+};
+
+type StorageMetricsProps = {
+ setLastUpdated: (last: number) => void;
+};
+export default function StorageMetrics({
+ setLastUpdated,
+}: StorageMetricsProps) {
+ const { data: cameraStorage } = useSWR