diff --git a/selfprivacy_api/graphql/queries/monitoring.py b/selfprivacy_api/graphql/queries/monitoring.py index a826cf2..2363fe1 100644 --- a/selfprivacy_api/graphql/queries/monitoring.py +++ b/selfprivacy_api/graphql/queries/monitoring.py @@ -38,6 +38,13 @@ class MemoryMonitoring: return MonitoringQueries.memory_usage_overall(self.start, self.end, self.step) + @strawberry.field + def swap_usage_overall(self) -> MonitoringValuesResult: + if Prometheus().get_status() != ServiceStatus.ACTIVE: + return MonitoringQueryError(error="Prometheus is not running") + + return MonitoringQueries.swap_usage_overall(self.start, self.end, self.step) + @strawberry.field def average_usage_by_service(self) -> MonitoringMetricsResult: if Prometheus().get_status() != ServiceStatus.ACTIVE: diff --git a/selfprivacy_api/utils/monitoring.py b/selfprivacy_api/utils/monitoring.py index 54e46c5..8446c05 100644 --- a/selfprivacy_api/utils/monitoring.py +++ b/selfprivacy_api/utils/monitoring.py @@ -264,6 +264,52 @@ class MonitoringQueries: ) ) + @staticmethod + def swap_usage_overall( + start: Optional[datetime] = None, + end: Optional[datetime] = None, + step: int = 60, # seconds + ) -> MonitoringValuesResult: + """ + Get swap memory usage. + + Args: + start (datetime, optional): The start time. + Defaults to 20 minutes ago if not provided. + end (datetime, optional): The end time. + Defaults to current time if not provided. + step (int): Interval in seconds for querying swap memory usage data. + """ + + if start is None: + start = datetime.now() - timedelta(minutes=20) + + if end is None: + end = datetime.now() + + start_timestamp = int(start.timestamp()) + end_timestamp = int(end.timestamp()) + + query = ( + "100 - (100 * (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes))" + ) + + data = MonitoringQueries._send_range_query( + query, start_timestamp, end_timestamp, step, result_type="matrix" + ) + + if isinstance(data, MonitoringQueryError): + return data + + return MonitoringValues( + values=list( + map( + MonitoringQueries._prometheus_value_to_monitoring_value, + data["result"][0]["values"], + ) + ) + ) + @staticmethod def memory_usage_max_by_slice( start: Optional[datetime] = None,