Merge ~andreserl/maas:prometheus_extra_stats into maas:master

Proposed by Andres Rodriguez
Status: Merged
Approved by: Andres Rodriguez
Approved revision: 58768beccfa202880f729e5145e7b14584a851ff
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~andreserl/maas:prometheus_extra_stats
Merge into: maas:master
Diff against target: 178 lines (+127/-1)
2 files modified
src/maasserver/stats.py (+59/-1)
src/maasserver/tests/test_stats.py (+68/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Mike Pontillo (community) Approve
Review via email: mp+356887@code.launchpad.net

Commit message

Add extra stats for architectures and pods.

This gather stats for machines by architectures and information about pods as preparation with integration to prometheus.

To post a comment you must log in.
8879991... by Andres Rodriguez

Fix typo

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b prometheus_extra_stats lp:~andreserl/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/4214/console
COMMIT: 8879991e0c7a733c354e14d428bafcf1f4b04661

review: Needs Fixing
edd3687... by Andres Rodriguez

Fix lint

Revision history for this message
Mike Pontillo (mpontillo) wrote :

Looks like a good start; I found a couple of issues and have a couple of suggestions.

review: Needs Fixing
f61694e... by Andres Rodriguez

Fix typos

Revision history for this message
Andres Rodriguez (andreserl) :
146bf07... by Andres Rodriguez

Address review comment

Revision history for this message
Mike Pontillo (mpontillo) :
58768be... by Andres Rodriguez

Add tests

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b prometheus_extra_stats lp:~andreserl/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 146bf074273a094f40bda1a79757b0a0bcf68ec5

review: Approve
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Looks better; thanks for the fixes.

I would consider making the power_type a parameter so that you can get stats on other pod types as well.

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b prometheus_extra_stats lp:~andreserl/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 58768beccfa202880f729e5145e7b14584a851ff

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/stats.py b/src/maasserver/stats.py
2index 5f43bdc..d0d7f1c 100644
3--- a/src/maasserver/stats.py
4+++ b/src/maasserver/stats.py
5@@ -21,12 +21,16 @@ from twisted.application.internet import TimerService
6 log = LegacyLogger()
7
8 import base64
9-from collections import Counter
10+from collections import (
11+ Counter,
12+ defaultdict,
13+)
14 import json
15
16 from maasserver.enum import (
17 NODE_TYPE,
18 NODE_STATUS,
19+ BMC_TYPE,
20 )
21 from maasserver.models import (
22 Node,
23@@ -34,6 +38,8 @@ from maasserver.models import (
24 VLAN,
25 Space,
26 Subnet,
27+ BMC,
28+ Pod,
29 )
30 from maasserver.utils import get_maas_user_agent
31 import requests
32@@ -73,6 +79,58 @@ def get_machine_state_stats():
33 }
34
35
36+def get_machines_by_architecture():
37+ node_arches = Node.objects.filter(
38+ node_type=NODE_TYPE.MACHINE).extra(
39+ dict(
40+ short_arch="SUBSTRING(architecture FROM '(.*)/')")
41+ ).values_list('short_arch', flat=True)
42+
43+ count_by_arch = defaultdict(int)
44+ for arch in node_arches:
45+ count_by_arch[arch] += 1
46+
47+ return count_by_arch
48+
49+
50+def get_kvm_pods_stats():
51+ pods = BMC.objects.filter(bmc_type=BMC_TYPE.POD, power_type='virsh')
52+ # Calculate available physical resources
53+ # total_mem is in MB
54+ # local_storage is in bytes
55+ available_resources = pods.aggregate(
56+ cores=Sum('cores'), memory=Sum('memory'),
57+ storage=Sum('local_storage'))
58+
59+ # available resources with overcommit
60+ over_cores = over_memory = 0
61+ for pod in pods:
62+ over_cores += pod.cores * pod.cpu_over_commit_ratio
63+ over_memory += pod.memory * pod.memory_over_commit_ratio
64+ available_resources['over_cores'] = over_cores
65+ available_resources['over_memory'] = over_memory
66+
67+ # Calculate utilization
68+ pod_machines = Pod.objects.all()
69+ machines = cores = memory = storage = 0
70+ for pod in pod_machines:
71+ machines += Node.objects.filter(bmc__id=pod.id).count()
72+ cores += pod.get_used_cores()
73+ memory += pod.get_used_memory()
74+ storage += pod.get_used_local_storage()
75+
76+ return {
77+ "kvm_pods": len(pods),
78+ "kvm_machines": machines,
79+ "kvm_available_resources": available_resources,
80+ "kvm_utilized_resources": {
81+ 'cores': cores,
82+ 'memory': memory,
83+ 'storage': storage,
84+ }
85+ }
86+
87+
88 def get_subnets_stats():
89 subnets = Subnet.objects.all()
90 v4 = [net for net in subnets if net.get_ip_version() == 4]
91diff --git a/src/maasserver/tests/test_stats.py b/src/maasserver/tests/test_stats.py
92index 7f27ba0..65d9ea9 100644
93--- a/src/maasserver/tests/test_stats.py
94+++ b/src/maasserver/tests/test_stats.py
95@@ -21,8 +21,10 @@ from maasserver.models import (
96 VLAN,
97 )
98 from maasserver.stats import (
99+ get_kvm_pods_stats,
100 get_maas_stats,
101 get_machine_stats,
102+ get_machines_by_architecture,
103 get_request_params,
104 make_maas_user_agent_request,
105 )
106@@ -45,6 +47,72 @@ from twisted.internet.defer import fail
107
108 class TestMAASStats(MAASServerTestCase):
109
110+ def make_pod(self, cpu=0, mem=0, cpu_over_commit=1, mem_over_commit=1):
111+ # Make one pod
112+ zone = factory.make_Zone()
113+ pool = factory.make_ResourcePool()
114+ ip = factory.make_ipv4_address()
115+ power_parameters = {
116+ 'power_address': 'qemu+ssh://%s/system' % ip,
117+ 'power_pass': 'pass',
118+ }
119+ return factory.make_Pod(
120+ pod_type='virsh', zone=zone, pool=pool,
121+ cores=cpu, memory=mem,
122+ cpu_over_commit_ratio=cpu_over_commit,
123+ memory_over_commit_ratio=mem_over_commit,
124+ parameters=power_parameters)
125+
126+ def test_get_machines_by_architecture(self):
127+ arches = [
128+ 'amd64/generic', 's390x/generic', 'ppc64el/generic',
129+ 'arm64/generic', 'i386/generic']
130+ for arch in arches:
131+ factory.make_Machine(architecture=arch)
132+ stats = get_machines_by_architecture()
133+ compare = {
134+ "amd64": 1,
135+ "i386": 1,
136+ "arm64": 1,
137+ "ppc64el": 1,
138+ "s390x": 1,
139+ }
140+ self.assertEquals(stats, compare)
141+
142+ def test_get_kvm_pods_stats(self):
143+ pod1 = self.make_pod(
144+ cpu=10, mem=100, cpu_over_commit=2, mem_over_commit=3)
145+ pod2 = self.make_pod(
146+ cpu=20, mem=200, cpu_over_commit=3, mem_over_commit=2)
147+
148+ total_cores = pod1.cores + pod2.cores
149+ total_memory = pod1.memory + pod2.memory
150+ over_cores = (
151+ pod1.cores * pod1.cpu_over_commit_ratio +
152+ pod2.cores * pod2.cpu_over_commit_ratio)
153+ over_memory = (
154+ pod1.memory * pod1.memory_over_commit_ratio +
155+ pod2.memory * pod2.memory_over_commit_ratio)
156+
157+ stats = get_kvm_pods_stats()
158+ compare = {
159+ "kvm_pods": 2,
160+ "kvm_machines": 0,
161+ "kvm_available_resources": {
162+ "cores": total_cores,
163+ "memory": total_memory,
164+ "over_cores": over_cores,
165+ "over_memory": over_memory,
166+ "storage": 0,
167+ },
168+ "kvm_utilized_resources": {
169+ 'cores': 0,
170+ 'memory': 0,
171+ 'storage': 0
172+ },
173+ }
174+ self.assertEquals(compare, stats)
175+
176 def test_get_maas_stats(self):
177 # Make one component of everything
178 factory.make_RegionRackController()

Subscribers

People subscribed via source and target branches