@@ -17,14 +17,27 @@ class Resource:
1717
1818 def from_server (server ):
1919 flavor = server ["flavor" ]
20+ if flavor ["ram" ] == 0 :
21+ return None
2022 return Resource (flavor ["ram" ], flavor ["vcpus" ])
2123
22- def get_resources (cloud ):
24+ def from_flavor (flavors , cloud , server ):
25+ flavor_id = server ["flavor" ].id
26+ if flavor_id not in flavors :
27+ log .info ("Requesting flavor %s" , flavor_id )
28+ flavors [flavor_id ] = cloud .get_flavor (flavor_id )
29+ flavor = flavors [flavor_id ]
30+ return Resource (flavor ["ram" ], flavor ["vcpus" ])
31+
32+ def get_resources (flavors , cloud ):
2333 "Get the cloud resources."
2434 resources = []
2535 for server in cloud .compute .servers ():
2636 try :
27- resources .append (Resource .from_server (server ))
37+ if resource := Resource .from_server (server ):
38+ resources .append (resource )
39+ else :
40+ resources .append (Resource .from_flavor (flavors , cloud , server ))
2841 except Exception as e :
2942 log .exception ("Couldn't get server resource %s: %s" , server , e )
3043 return resources
@@ -49,8 +62,8 @@ def get_providers(nodepool_yaml):
4962 providers [provider .get ("name" , "unknown" )] = Provider .from_nodepool (provider )
5063 return providers
5164
52- def update_provider_metric (metrics , name , provider ):
53- resources = get_resources (provider .cloud )
65+ def update_provider_metric (metrics , flavors , name , provider ):
66+ resources = get_resources (flavors , provider .cloud )
5467 metrics ["instances" ].labels (cloud = name ).set (len (resources ))
5568 cpu , mem = 0 , 0
5669 for resource in resources :
@@ -59,10 +72,10 @@ def update_provider_metric(metrics, name, provider):
5972 metrics ["cpu" ].labels (cloud = name ).set (cpu )
6073 metrics ["mem" ].labels (cloud = name ).set (mem )
6174
62- def update_providers_metric (metrics , providers ):
75+ def update_providers_metric (metrics , flavors , providers ):
6376 for (name , provider ) in providers .items ():
6477 try :
65- update_provider_metric (metrics , name , provider )
78+ update_provider_metric (metrics , flavors , name , provider )
6679 except Exception as e :
6780 log .exception ("Couldn't get provider %s: %s" , name , e )
6881 metrics ["error" ].labels (cloud = name ).inc ()
@@ -86,16 +99,17 @@ def main():
8699 )
87100
88101 providers = get_providers (args .nodepool )
102+ flavors = dict ()
89103
90- update_providers_metric (metrics , providers )
104+ update_providers_metric (metrics , flavors , providers )
91105
92106 # Initialize connection
93107 log .info ("Starting exporter at :%d for %d provider" , args .port , len (providers ))
94108 start_http_server (args .port )
95109
96110 while True :
97111 time .sleep (300 )
98- update_providers_metric (metrics , providers )
112+ update_providers_metric (metrics , flavors , providers )
99113
100114
101115
0 commit comments