Merge ~andreserl/maas:prometheus_handler into maas:master

Proposed by Andres Rodriguez
Status: Superseded
Proposed branch: ~andreserl/maas:prometheus_handler
Merge into: maas:master
Diff against target: 126 lines (+48/-2)
4 files modified
src/maasserver/middleware.py (+2/-0)
src/maasserver/prometheus.py (+24/-1)
src/maasserver/tests/test_prometheus.py (+20/-1)
src/maasserver/urls.py (+2/-0)
Reviewer Review Type Date Requested Status
Alberto Donato Pending
MAAS Maintainers Pending
Review via email: mp+356087@code.launchpad.net

This proposal has been superseded by a proposal from 2018-10-16.

To post a comment you must log in.
~andreserl/maas:prometheus_handler updated
ade2444... by Andres Rodriguez

Fix format

b82be99... by Andres Rodriguez

Minor fixes

60a99f1... by Andres Rodriguez

Fixes

1aea499... by Andres Rodriguez

Fix lint

6873c6f... by Andres Rodriguez

Expose prometheus stats

02d1005... by Andres Rodriguez

Update tests

14deeef... by Andres Rodriguez

Fix format

Unmerged commits

14deeef... by Andres Rodriguez

Fix format

02d1005... by Andres Rodriguez

Update tests

6873c6f... by Andres Rodriguez

Expose prometheus stats

1aea499... by Andres Rodriguez

Fix lint

60a99f1... by Andres Rodriguez

Fixes

b82be99... by Andres Rodriguez

Minor fixes

ade2444... by Andres Rodriguez

Fix format

9bb61e6... by Andres Rodriguez

Add a basic handler to report prometheus stats over /MAAS/metrics

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/middleware.py b/src/maasserver/middleware.py
2index bcad2e8..1de6072 100644
3--- a/src/maasserver/middleware.py
4+++ b/src/maasserver/middleware.py
5@@ -75,6 +75,8 @@ PUBLIC_URL_PREFIXES = [
6 reverse('metadata'),
7 # RPC information is for use by rack controllers; no login.
8 reverse('rpc-info'),
9+ # Prometheus stats
10+ reverse('metrics'),
11 # API meta-information is publicly visible.
12 reverse('api_version'),
13 reverse('api_v1_error'),
14diff --git a/src/maasserver/prometheus.py b/src/maasserver/prometheus.py
15index f736de9..25cbf45 100644
16--- a/src/maasserver/prometheus.py
17+++ b/src/maasserver/prometheus.py
18@@ -24,6 +24,7 @@ try:
19 CollectorRegistry,
20 Gauge,
21 push_to_gateway,
22+ generate_latest,
23 )
24 PROMETHEUS = True
25 except:
26@@ -31,8 +32,25 @@ except:
27
28 log = LegacyLogger()
29
30+from django.http import HttpResponse
31
32-def push_stats_to_prometheus(maas_name, push_gateway):
33+
34+def prometheus_handler(request):
35+ if not Config.objects.get_config('prometheus_enabled'):
36+ content = (
37+ "No metrics available."
38+ )
39+ status = 404
40+ else:
41+ content = generate_latest(get_stats_for_prometheus())
42+ status = 200
43+ response = HttpResponse(content)
44+ response['Content-Type'] = "text/plain"
45+ response['status'] = status
46+ return response
47+
48+
49+def get_stats_for_prometheus():
50 registry = CollectorRegistry()
51 stats = json.loads(get_maas_stats())
52
53@@ -43,6 +61,11 @@ def push_stats_to_prometheus(maas_name, push_gateway):
54 for status, machines in stats['machine_status'].items():
55 counter.labels(status).set(machines)
56
57+ return registry
58+
59+
60+def push_stats_to_prometheus(maas_name, push_gateway):
61+ registry = get_stats_for_prometheus()
62 push_to_gateway(
63 push_gateway, job='stats_for_%s' % maas_name, registry=registry)
64
65diff --git a/src/maasserver/tests/test_prometheus.py b/src/maasserver/tests/test_prometheus.py
66index 27dc7f4..66c1af6 100644
67--- a/src/maasserver/tests/test_prometheus.py
68+++ b/src/maasserver/tests/test_prometheus.py
69@@ -5,10 +5,15 @@
70
71 __all__ = []
72
73+import json
74+
75 from django.db import transaction
76 from maasserver import prometheus
77 from maasserver.models import Config
78-from maasserver.prometheus import push_stats_to_prometheus
79+from maasserver.prometheus import (
80+ get_stats_for_prometheus,
81+ push_stats_to_prometheus,
82+)
83 from maasserver.testing.factory import factory
84 from maasserver.testing.testcase import (
85 MAASServerTestCase,
86@@ -28,6 +33,20 @@ from twisted.internet.defer import fail
87
88 class TestPrometheus(MAASServerTestCase):
89
90+ def test_get_stats_for_prometheus(self):
91+ self.patch(prometheus, "CollectorRegistry")
92+ self.patch(prometheus, "Gauge")
93+ values = {
94+ "machine_status": {
95+ "random_status": 0,
96+ },
97+ }
98+ mock = self.patch(prometheus, "get_maas_stats")
99+ mock.return_value = json.dumps(values)
100+ get_stats_for_prometheus()
101+ self.assertThat(
102+ mock, MockCalledOnce())
103+
104 def test_push_stats_to_prometheus(self):
105 factory.make_RegionRackController()
106 maas_name = 'random.maas'
107diff --git a/src/maasserver/urls.py b/src/maasserver/urls.py
108index 6c9c849..14dda55 100755
109--- a/src/maasserver/urls.py
110+++ b/src/maasserver/urls.py
111@@ -21,6 +21,7 @@ from maasserver.bootresources import (
112 simplestreams_stream_handler,
113 )
114 from maasserver.macaroon_auth import MacaroonDischargeRequest
115+from maasserver.prometheus import prometheus_handler
116 from maasserver.views import (
117 settings,
118 TextTemplateView,
119@@ -83,6 +84,7 @@ urlpatterns += [
120 r'^images-stream/(?P<os>.*)/(?P<arch>.*)/(?P<subarch>.*)/'
121 '(?P<series>.*)/(?P<version>.*)/(?P<filename>.*)$',
122 simplestreams_file_handler, name='simplestreams_file_handler'),
123+ url(r'^metrics$', prometheus_handler, name='metrics'),
124 url(
125 r'^robots\.txt$', TextTemplateView.as_view(
126 template_name='maasserver/robots.txt'),

Subscribers

People subscribed via source and target branches