Skip to content

Commit 938669c

Browse files
committed
Add prometheus exporter output
1 parent 11ba949 commit 938669c

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

os_capacity/data/candidates.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
#!/usr/bin/env python3
22

3-
import openstack
3+
import collections
4+
import json
45

6+
import openstack
57

6-
def get_capacity(conn):
7-
flavors = list(conn.compute.flavors())
8-
print("Flavor count: " + str(len(flavors)))
98

9+
def get_capacity_per_flavor(conn, flavors):
1010
capacity_per_flavor = {}
11+
1112
for flavor in flavors:
1213
resources, traits = get_placement_request(flavor)
13-
candidates = get_candidates(conn, resources, traits, flavor.name)
14-
# intentionally add empty responses into this
15-
capacity_per_flavor[flavor.name] = candidates
14+
max_per_host = get_max_per_host(conn, resources, traits)
15+
capacity_per_flavor[flavor.name] = max_per_host
16+
1617
return capacity_per_flavor
1718

1819

@@ -31,7 +32,7 @@ def get_placement_request(flavor):
3132
return resources, required_traits
3233

3334

34-
def get_candidates(conn, resources, required_traits, flavor_name):
35+
def get_max_per_host(conn, resources, required_traits):
3536
resource_str = ",".join(
3637
[key + ":" + str(value) for key, value in resources.items() if value]
3738
)
@@ -59,15 +60,34 @@ def get_candidates(conn, resources, required_traits, flavor_name):
5960
if max_counts:
6061
count_per_rp[rp_uuid] = min(max_counts)
6162

62-
print("Found " + str(len(count_per_rp.keys())) + " candidate hosts for " + flavor_name)
6363
return count_per_rp
6464

6565

6666
def main():
6767
conn = openstack.connect()
68-
capacity_per_flavor = get_capacity(conn)
69-
import json
70-
print(json.dumps(capacity_per_flavor, indent=2))
68+
69+
flavors = list(conn.compute.flavors())
70+
capacity_per_flavor = get_capacity_per_flavor(conn, flavors)
71+
72+
# total capacity per flavor
73+
flavor_names = sorted([f.name for f in flavors])
74+
for flavor_name in flavor_names:
75+
counts = capacity_per_flavor.get(flavor_name, {}).values()
76+
total = 0 if not counts else sum(counts)
77+
print(f'openstack_total_capacity_per_flavor{{flavor="{flavor_name}"}} {total}')
78+
79+
# capacity per host
80+
raw_rps = list(conn.placement.resource_providers())
81+
resource_providers = {rp.name: rp.id for rp in raw_rps}
82+
hostnames = sorted(resource_providers.keys())
83+
for hostname in hostnames:
84+
rp_id = resource_providers[hostname]
85+
for flavor_name in flavor_names:
86+
all_counts = capacity_per_flavor.get(flavor_name, {})
87+
our_count = all_counts.get(rp_id, 0)
88+
print(
89+
f'openstack_capacity_by_hostname{{hypervisor="{hostname}",flavor="{flavor_name}"}} {our_count}'
90+
)
7191

7292

7393
main()

0 commit comments

Comments
 (0)