diff --git a/frigate/stats.py b/frigate/stats.py index 55db809d3..d1c7987d7 100644 --- a/frigate/stats.py +++ b/frigate/stats.py @@ -18,6 +18,7 @@ from frigate.util import get_amd_gpu_stats, get_intel_gpu_stats, get_nvidia_gpu_ from frigate.version import VERSION from frigate.util import get_cpu_stats, get_bandwidth_stats from frigate.object_detection import ObjectDetectProcess +from frigate.storage import StorageS3 logger = logging.getLogger(__name__) @@ -274,6 +275,10 @@ def stats_snapshot( "mount_type": get_fs_type(path), } + if config.storage.s3.enabled or config.storage.s3.archive: + s3 = StorageS3(config) + stats["service"]["storage"]["s3"] = s3.get_bucket_stats() + stats["processes"] = {} for name, pid in stats_tracking["processes"].items(): stats["processes"][name] = { diff --git a/frigate/storage.py b/frigate/storage.py index 24a0f7848..5a8502460 100644 --- a/frigate/storage.py +++ b/frigate/storage.py @@ -43,7 +43,7 @@ class StorageS3: aws_access_key_id=self.config.storage.s3.access_key_id, aws_secret_access_key=self.config.storage.s3.secret_access_key, endpoint_url=self.config.storage.s3.endpoint_url, - config=Config(signature_version=UNSIGNED), + config=Config(), ) except (BotoCoreError, ClientError) as error: logger.error(f"Failed to create S3 client: {error}") @@ -98,6 +98,23 @@ class StorageS3: else: return False + def get_bucket_stats(self): + try: + total_size = 0 + total_files = 0 + for obj in self.s3_client.list_objects(Bucket=self.s3_bucket).get( + "Contents", [] + ): + total_size += obj["Size"] + total_files += 1 + + total_size_gb = total_size / (1024**3) # Convert bytes to gigabytes + return {"total_files": total_files, "total_size_gb": total_size_gb} + + except ClientError as e: + print(f"Error getting bucket stats: {e}") + return None + class StorageMaintainer(threading.Thread): """Maintain frigates recording storage.""" diff --git a/web/src/routes/Storage.jsx b/web/src/routes/Storage.jsx index dd7f969c7..a28522547 100644 --- a/web/src/routes/Storage.jsx +++ b/web/src/routes/Storage.jsx @@ -48,6 +48,12 @@ export default function Storage() { {getUnitSize(service['storage']['/media/frigate/clips']['used'])} {getUnitSize(service['storage']['/media/frigate/clips']['total'])} + {service['storage']['s3'] ? ( + + S3 + {getUnitSize(service['storage']['s3']['total_size_gb'])} + {service['storage']['s3']['total_files']} files + ) : null} ); } else { @@ -58,6 +64,12 @@ export default function Storage() { {getUnitSize(service['storage']['/media/frigate/recordings']['used'])} {getUnitSize(service['storage']['/media/frigate/recordings']['total'])} + {service['storage']['s3'] ? ( + + S3 + {getUnitSize(service['storage']['s3']['total_size_gb'])} + {service['storage']['s3']['total_files']} files + ) : null} ); }