Skip to content

Commit f04dd39

Browse files
committed
Make code and tests for for python 3 too.
1 parent 789c0d4 commit f04dd39

File tree

3 files changed

+69
-45
lines changed

3 files changed

+69
-45
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ There are several options for exporting metrics.
116116

117117
Metrics are usuall exposed over HTTP, to be read by the Prometheus server. For example:
118118

119+
Python 2:
120+
119121
```python
120122
from prometheus_client import MetricsHandler
121123
from BaseHTTPServer import HTTPServer
@@ -124,6 +126,16 @@ httpd = HTTPServer(server_address, MetricsHandler)
124126
httpd.serve_forever()
125127
```
126128

129+
Python 3:
130+
131+
```python
132+
from prometheus_client import MetricsHandler
133+
from http.server import HTTPServer
134+
server_address = ('', 8000)
135+
httpd = HTTPServer(server_address, MetricsHandler)
136+
httpd.serve_forever()
137+
```
138+
127139
Visit [http://localhost:8000/](http://localhost:8000/) to view the metrics.
128140

129141
## Node exporter textfile collector

prometheus_client/__init__.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
#!/usr/bin/python
22

3+
from __future__ import unicode_literals
4+
35
import copy
46
import re
57
import os
68
import time
79
import threading
810
from contextlib import contextmanager
9-
from BaseHTTPServer import BaseHTTPRequestHandler
11+
try:
12+
from BaseHTTPServer import BaseHTTPRequestHandler
13+
except ImportError:
14+
# Python 3
15+
from http.server import BaseHTTPRequestHandler
1016
from functools import wraps
1117
from threading import Lock
1218

@@ -116,7 +122,7 @@ def remove(self, *labelvalues):
116122
def _samples(self):
117123
with self._lock:
118124
metrics = self._metrics.copy()
119-
for labels, metric in metrics.iteritems():
125+
for labels, metric in metrics.items():
120126
for suffix, _, value in metric._samples():
121127
yield (suffix, dict(zip(self._labelnames, labels)), value)
122128

@@ -298,18 +304,18 @@ def generate_latest(registry=REGISTRY):
298304
'''Returns the metrics from the registry in latest text format as a string.'''
299305
output = []
300306
for metric in registry.collect():
301-
output.append(u'# HELP %s %s' % (
307+
output.append('# HELP {0} {1}'.format(
302308
metric._name, metric._documentation.replace('\\', r'\\').replace('\n', r'\n')))
303-
output.append(u'\n# TYPE %s %s\n' % (metric._name, metric._type))
309+
output.append('\n# TYPE {0} {1}\n'.format(metric._name, metric._type))
304310
for name, labels, value in metric._samples:
305311
if labels:
306-
labelstr = u'{%s}' % ','.join(
307-
[u'%s="%s"' % (
312+
labelstr = '{{{0}}}'.format(','.join(
313+
['{0}="{1}"'.format(
308314
k, v.replace('\\', r'\\').replace('\n', r'\n').replace('\'', r'\''))
309-
for k, v in labels.items()])
315+
for k, v in labels.items()]))
310316
else:
311-
labelstr = u''
312-
output.append(u'%s%s %s\n' % (name, labelstr, value))
317+
labelstr = ''
318+
output.append('{0}{1} {2}\n'.format(name, labelstr, value))
313319
return ''.join(output).encode('utf-8')
314320

315321

tests/test_client.py

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from __future__ import unicode_literals
12
import unittest
23

34
from prometheus_client import Gauge, Counter, Summary
@@ -9,11 +10,11 @@ def setUp(self):
910
self.counter = Counter('c', 'help', registry=self.registry)
1011

1112
def test_increment(self):
12-
self.assertEquals(0, self.registry.get_sample_value('c'))
13+
self.assertEqual(0, self.registry.get_sample_value('c'))
1314
self.counter.inc()
14-
self.assertEquals(1, self.registry.get_sample_value('c'))
15+
self.assertEqual(1, self.registry.get_sample_value('c'))
1516
self.counter.inc(7)
16-
self.assertEquals(8, self.registry.get_sample_value('c'))
17+
self.assertEqual(8, self.registry.get_sample_value('c'))
1718

1819
def test_negative_increment_raises(self):
1920
self.assertRaises(ValueError, self.counter.inc, -1)
@@ -29,79 +30,79 @@ def f(r):
2930
f(False)
3031
except TypeError:
3132
pass
32-
self.assertEquals(0, self.registry.get_sample_value('c'))
33+
self.assertEqual(0, self.registry.get_sample_value('c'))
3334
try:
3435
f(True)
3536
except ValueError:
3637
raised = True
37-
self.assertEquals(1, self.registry.get_sample_value('c'))
38+
self.assertEqual(1, self.registry.get_sample_value('c'))
3839

3940
def test_block_decorator(self):
4041
with self.counter.count_exceptions():
4142
pass
42-
self.assertEquals(0, self.registry.get_sample_value('c'))
43+
self.assertEqual(0, self.registry.get_sample_value('c'))
4344
raised = False
4445
try:
4546
with self.counter.count_exceptions():
4647
raise ValueError
4748
except:
4849
raised = True
4950
self.assertTrue(raised)
50-
self.assertEquals(1, self.registry.get_sample_value('c'))
51+
self.assertEqual(1, self.registry.get_sample_value('c'))
5152

5253
class TestGauge(unittest.TestCase):
5354
def setUp(self):
5455
self.registry = CollectorRegistry()
5556
self.gauge = Gauge('g', 'help', registry=self.registry)
5657

5758
def test_gauge(self):
58-
self.assertEquals(0, self.registry.get_sample_value('g'))
59+
self.assertEqual(0, self.registry.get_sample_value('g'))
5960
self.gauge.inc()
60-
self.assertEquals(1, self.registry.get_sample_value('g'))
61+
self.assertEqual(1, self.registry.get_sample_value('g'))
6162
self.gauge.dec(3)
62-
self.assertEquals(-2, self.registry.get_sample_value('g'))
63+
self.assertEqual(-2, self.registry.get_sample_value('g'))
6364
self.gauge.set(9)
64-
self.assertEquals(9, self.registry.get_sample_value('g'))
65+
self.assertEqual(9, self.registry.get_sample_value('g'))
6566

6667
def test_function_decorator(self):
67-
self.assertEquals(0, self.registry.get_sample_value('g'))
68+
self.assertEqual(0, self.registry.get_sample_value('g'))
6869
@self.gauge.track_inprogress()
6970
def f():
70-
self.assertEquals(1, self.registry.get_sample_value('g'))
71+
self.assertEqual(1, self.registry.get_sample_value('g'))
7172
f()
72-
self.assertEquals(0, self.registry.get_sample_value('g'))
73+
self.assertEqual(0, self.registry.get_sample_value('g'))
7374

7475
def test_block_decorator(self):
75-
self.assertEquals(0, self.registry.get_sample_value('g'))
76+
self.assertEqual(0, self.registry.get_sample_value('g'))
7677
with self.gauge.track_inprogress():
77-
self.assertEquals(1, self.registry.get_sample_value('g'))
78-
self.assertEquals(0, self.registry.get_sample_value('g'))
78+
self.assertEqual(1, self.registry.get_sample_value('g'))
79+
self.assertEqual(0, self.registry.get_sample_value('g'))
7980

8081
class TestSummary(unittest.TestCase):
8182
def setUp(self):
8283
self.registry = CollectorRegistry()
8384
self.summary = Summary('s', 'help', registry=self.registry)
8485

8586
def test_summary(self):
86-
self.assertEquals(0, self.registry.get_sample_value('s_count'))
87-
self.assertEquals(0, self.registry.get_sample_value('s_sum'))
87+
self.assertEqual(0, self.registry.get_sample_value('s_count'))
88+
self.assertEqual(0, self.registry.get_sample_value('s_sum'))
8889
self.summary.observe(10)
89-
self.assertEquals(1, self.registry.get_sample_value('s_count'))
90-
self.assertEquals(10, self.registry.get_sample_value('s_sum'))
90+
self.assertEqual(1, self.registry.get_sample_value('s_count'))
91+
self.assertEqual(10, self.registry.get_sample_value('s_sum'))
9192

9293
def test_function_decorator(self):
93-
self.assertEquals(0, self.registry.get_sample_value('s_count'))
94+
self.assertEqual(0, self.registry.get_sample_value('s_count'))
9495
@self.summary.time()
9596
def f():
9697
pass
9798
f()
98-
self.assertEquals(1, self.registry.get_sample_value('s_count'))
99+
self.assertEqual(1, self.registry.get_sample_value('s_count'))
99100

100101
def test_block_decorator(self):
101-
self.assertEquals(0, self.registry.get_sample_value('s_count'))
102+
self.assertEqual(0, self.registry.get_sample_value('s_count'))
102103
with self.summary.time():
103104
pass
104-
self.assertEquals(1, self.registry.get_sample_value('s_count'))
105+
self.assertEqual(1, self.registry.get_sample_value('s_count'))
105106

106107
class TestMetricWrapper(unittest.TestCase):
107108
def setUp(self):
@@ -111,18 +112,18 @@ def setUp(self):
111112

112113
def test_child(self):
113114
self.counter.labels('x').inc()
114-
self.assertEquals(1, self.registry.get_sample_value('c', {'l': 'x'}))
115+
self.assertEqual(1, self.registry.get_sample_value('c', {'l': 'x'}))
115116
self.two_labels.labels('x', 'y').inc(2)
116-
self.assertEquals(2, self.registry.get_sample_value('two', {'a': 'x', 'b': 'y'}))
117+
self.assertEqual(2, self.registry.get_sample_value('two', {'a': 'x', 'b': 'y'}))
117118

118119
def test_remove(self):
119120
self.counter.labels('x').inc()
120121
self.counter.labels('y').inc(2)
121-
self.assertEquals(1, self.registry.get_sample_value('c', {'l': 'x'}))
122-
self.assertEquals(2, self.registry.get_sample_value('c', {'l': 'y'}))
122+
self.assertEqual(1, self.registry.get_sample_value('c', {'l': 'x'}))
123+
self.assertEqual(2, self.registry.get_sample_value('c', {'l': 'y'}))
123124
self.counter.remove('x')
124-
self.assertEquals(None, self.registry.get_sample_value('c', {'l': 'x'}))
125-
self.assertEquals(2, self.registry.get_sample_value('c', {'l': 'y'}))
125+
self.assertEqual(None, self.registry.get_sample_value('c', {'l': 'x'}))
126+
self.assertEqual(2, self.registry.get_sample_value('c', {'l': 'y'}))
126127

127128
def test_incorrect_label_count_raises(self):
128129
self.assertRaises(ValueError, self.counter.labels)
@@ -133,7 +134,7 @@ def test_incorrect_label_count_raises(self):
133134
def test_namespace_subsystem_concatenated(self):
134135
c = Counter('c', 'help', namespace='a', subsystem='b', registry=self.registry)
135136
c.inc()
136-
self.assertEquals(1, self.registry.get_sample_value('a_b_c'))
137+
self.assertEqual(1, self.registry.get_sample_value('a_b_c'))
137138

138139
def test_invalid_names_raise(self):
139140
self.assertRaises(ValueError, Counter, '', 'help')
@@ -150,22 +151,27 @@ def setUp(self):
150151
def test_counter(self):
151152
c = Counter('cc', 'A counter', registry=self.registry)
152153
c.inc()
153-
self.assertEquals('# HELP cc A counter\n# TYPE cc counter\ncc 1.0\n', generate_latest(self.registry))
154+
self.assertEqual(b'# HELP cc A counter\n# TYPE cc counter\ncc 1.0\n', generate_latest(self.registry))
154155

155156
def test_gauge(self):
156157
g = Gauge('gg', 'A gauge', registry=self.registry)
157158
g.set(17)
158-
self.assertEquals('# HELP gg A gauge\n# TYPE gg gauge\ngg 17.0\n', generate_latest(self.registry))
159+
self.assertEqual(b'# HELP gg A gauge\n# TYPE gg gauge\ngg 17.0\n', generate_latest(self.registry))
159160

160161
def test_summary(self):
161162
s = Summary('ss', 'A summary', ['a', 'b'], registry=self.registry)
162163
s.labels('c', 'd').observe(17)
163-
self.assertEquals('# HELP ss A summary\n# TYPE ss summary\nss_count{a="c",b="d"} 1.0\nss_sum{a="c",b="d"} 17.0\n', generate_latest(self.registry))
164+
self.assertEqual(b'# HELP ss A summary\n# TYPE ss summary\nss_count{a="c",b="d"} 1.0\nss_sum{a="c",b="d"} 17.0\n', generate_latest(self.registry))
165+
166+
def test_unicode(self):
167+
c = Counter('cc', '\u4500', ['l'], registry=self.registry)
168+
c.labels('\u4500').inc()
169+
self.assertEqual(b'# HELP cc \xe4\x94\x80\n# TYPE cc counter\ncc{l="\xe4\x94\x80"} 1.0\n', generate_latest(self.registry))
164170

165171
def test_escaping(self):
166172
c = Counter('cc', 'A\ncount\\er', ['a'], registry=self.registry)
167173
c.labels('\\x\n').inc(1)
168-
self.assertEquals('# HELP cc A\\ncount\\\\er\n# TYPE cc counter\ncc{a="\\\\x\\n"} 1.0\n', generate_latest(self.registry))
174+
self.assertEqual(b'# HELP cc A\\ncount\\\\er\n# TYPE cc counter\ncc{a="\\\\x\\n"} 1.0\n', generate_latest(self.registry))
169175

170176

171177
if __name__ == '__main__':

0 commit comments

Comments
 (0)