# -- coding: utf-8 --
from __future__ import print_function
import sys # noqa
import json
from tempfile import TemporaryFile
import pytest # noqa
from library.python.monlib.metric_registry import MetricRegistry, HistogramType
from library.python.monlib.encoder import dump, dumps, TimePrecision, load, loads # noqa
def test_common_labels(request):
labels = {'my': 'label'}
registry = MetricRegistry(labels)
assert registry.common_labels == labels
with pytest.raises(TypeError):
MetricRegistry('foo')
with pytest.raises(TypeError):
MetricRegistry([])
def test_json_serialization(request):
registry = MetricRegistry()
labels = {'foo': 'gauge'}
g = registry.gauge(labels)
g.set(10.0)
g.set(20)
c = registry.counter({'foo': 'counter'})
c.inc()
r = registry.rate({'foo': 'rate'})
r.add(10)
out = dumps(registry, format='json', precision=TimePrecision.Seconds)
expected = json.loads("""{
"sensors":
[
{
"kind":"RATE",
"labels":
{
"foo":"rate"
},
"value":10
},
{
"kind":"COUNTER",
"labels":
{
"foo":"counter"
},
"value":1
},
{
"kind":"GAUGE",
"labels":
{
"foo":"gauge"
},
"value":20
}
]
}
""")
j = json.loads(out)
assert j == expected
EXPECTED_EXPLICIT = json.loads("""
{
"sensors":
[
{
"kind":"HIST",
"labels":
{
"foo":"hist"
},
"hist":
{
"bounds":
[
2,
10,
500
],
"buckets":
[
1,
0,
0
],
"inf":1
}
}
]
}
""")
EXPECTED_EXPONENTIAL = json.loads("""{
"sensors":
[
{
"kind":"HIST",
"labels":
{
"foo":"hist"
},
"hist":
{
"bounds":
[
3,
6,
12,
24,
48
],
"buckets":
[
1,
0,
0,
0,
0
],
"inf":1
}
}
]
}
""")
EXPECTED_LINEAR = json.loads("""
{ "sensors":
[
{
"kind":"HIST",
"labels":
{
"foo":"hist"
},
"hist":
{
"bounds":
[
1
],
"buckets":
[
1
],
"inf":1
}
}
]
}""")
@pytest.mark.parametrize('type,args,expected', [
(HistogramType.Linear, dict(bucket_count=2, start_value=1, bucket_width=1), EXPECTED_LINEAR),
(HistogramType.Explicit, dict(buckets=[2, 10, 500]), EXPECTED_EXPLICIT),
(HistogramType.Exponential, dict(bucket_count=6, base=2, scale=3), EXPECTED_EXPONENTIAL),
])
@pytest.mark.parametrize('rate', [True, False])
def test_histograms(request, type, args, expected, rate):
registry = MetricRegistry()
labels = {'foo': 'hist'}
h = registry.histogram_counter(labels, type, **args) if not rate else registry.histogram_rate(labels, type, **args)
h.collect(1)
h.collect(1000, 1)
s = dumps(registry, format='json')
if rate:
expected['sensors'][0]['kind'] = u'HIST_RATE'
else:
expected['sensors'][0]['kind'] = u'HIST'
assert json.loads(s) == expected
@pytest.mark.parametrize('fmt', ['json', 'spack'])
def test_stream_load(request, fmt):
expected = json.loads("""{"sensors":[{"kind":"GAUGE","labels":{"foo":"gauge"},"value":42}]}""")
registry = MetricRegistry()
labels = {'foo': 'gauge'}
g = registry.gauge(labels)
g.set(42)
with TemporaryFile() as f:
dump(registry, f, format=fmt)
f.flush()
f.seek(0, 0)
s = load(f, from_format=fmt, to_format='json')
assert json.loads(s) == expected
@pytest.mark.parametrize('fmt', ['json', 'spack'])
def test_stream_loads(request, fmt):
expected = json.loads("""{"sensors":[{"kind":"GAUGE","labels":{"foo":"gauge"},"value":42}]}""")
registry = MetricRegistry()
labels = {'foo': 'gauge'}
g = registry.gauge(labels)
g.set(42)
s = dumps(registry, format=fmt)
j = loads(s, from_format=fmt, to_format='json')
assert json.loads(j) == expected
@pytest.mark.parametrize('fmt', ['json', 'spack'])
def test_utf(request, fmt):
expected = json.loads(u"""{"sensors":[{"kind":"GAUGE","labels":{"foo":"gaugeह", "bàr":"Münich"},"value":42}]}""".encode('utf-8'))
registry = MetricRegistry()
labels = {'foo': u'gaugeह', u'bàr': u'Münich'}
g = registry.gauge(labels)
g.set(42)
s = dumps(registry, format=fmt)
j = loads(s, from_format=fmt, to_format='json')
assert json.loads(j) == expected
def test_gauge_sensors():
registry = MetricRegistry()
g = registry.gauge({'a': 'b'})
ig = registry.int_gauge({'c': 'd'})
g.set(2)
assert g.add(3.5) == 5.5
assert g.get() == 5.5
ig.set(2)
assert ig.inc() == 3
assert ig.dec() == 2
assert ig.add(3) == 5
assert ig.get() == 5
UNISTAT_DATA = """[
["signal1_max", 10],
["signal2_hgram", [[0, 100], [50, 200], [200, 300]]],
["prj=some-project;signal3_summ", 3],
["signal4_summ", 5]
]"""
EXPECTED = json.loads("""
{
"sensors": [
{
"kind": "GAUGE",
"labels": {
"sensor": "signal1_max"
},
"value": 10
},
{
"hist": {
"buckets": [
0,
100,
200
],
"bounds": [
0,
50,
200
],
"inf": 300
},
"kind": "HIST_RATE",
"labels": {
"sensor": "signal2_hgram"
}
},
{
"kind": "RATE",
"labels": {
"sensor": "signal3_summ",
"prj": "some-project"
},
"value": 3
},
{
"kind": "RATE",
"labels": {
"sensor": "signal4_summ"
},
"value": 5
}
]
}""")
def test_unistat_conversion(request):
j = loads(UNISTAT_DATA, from_format='unistat', to_format='json')
assert json.loads(j) == EXPECTED