From 5edc2006f7d576494e8ad2b0e235e6917f44ac84 Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Thu, 30 Mar 2023 10:30:34 +0100 Subject: [PATCH 1/2] Add cache todo --- os_capacity/prometheus.py | 1 + 1 file changed, 1 insertion(+) diff --git a/os_capacity/prometheus.py b/os_capacity/prometheus.py index 38a756b..5f0aff2 100755 --- a/os_capacity/prometheus.py +++ b/os_capacity/prometheus.py @@ -122,6 +122,7 @@ def get_resource_provider_info(compute_client, placement_client): # skip checking every resource provider for their aggregates continue + # TODO(johngarbutt): add a cache in here? response = placement_client.get( f"/resource_providers/{raw_rp.id}/aggregates", headers={"OpenStack-API-Version": "placement 1.19"}, From b7d97ebfa8393bbe2b531457e5474904dd66ca91 Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Thu, 30 Mar 2023 11:22:27 +0100 Subject: [PATCH 2/2] Attempt to add caching --- os_capacity/prometheus.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/os_capacity/prometheus.py b/os_capacity/prometheus.py index 5f0aff2..1a30e91 100755 --- a/os_capacity/prometheus.py +++ b/os_capacity/prometheus.py @@ -10,6 +10,8 @@ import prometheus_client as prom_client from prometheus_client import core as prom_core +RESOURCE_PROVIDER_AGGREGATE_CACHE = {} + def get_capacity_per_flavor(placement_client, flavors): capacity_per_flavor = {} @@ -122,14 +124,20 @@ def get_resource_provider_info(compute_client, placement_client): # skip checking every resource provider for their aggregates continue - # TODO(johngarbutt): add a cache in here? - response = placement_client.get( - f"/resource_providers/{raw_rp.id}/aggregates", - headers={"OpenStack-API-Version": "placement 1.19"}, - ) - response.raise_for_status() - aggs = response.json() - rp["aggregates"] = aggs["aggregates"] + # TODO(johngarbutt): maybe check if cached aggregate still exists? + aggregates = RESOURCE_PROVIDER_AGGREGATE_CACHE.get(raw_rp.id) + if aggregates is None: + response = placement_client.get( + f"/resource_providers/{raw_rp.id}/aggregates", + headers={"OpenStack-API-Version": "placement 1.19"}, + ) + response.raise_for_status() + aggs = response.json() + rp["aggregates"] = aggs["aggregates"] + RESOURCE_PROVIDER_AGGREGATE_CACHE[raw_rp.id] = aggs["aggregates"] + else: + rp["aggregates"] = aggregates + for agg_id in rp["aggregates"]: if agg_id in azones: rp["az"] = azones[agg_id]