106 lines
5.3 KiB
Python
Raw Normal View History

import time
import unittest
import logging
logger = logging.getLogger()
from collector.checks import Check, UnknownValue, CheckException, Infinity
from collector.checks.collector import Collector
from monagent.common.aggregator import MetricsAggregator
class TestCore(unittest.TestCase):
"Tests to validate the core check logic"
def setUp(self):
self.c = Check(logger)
self.c.gauge("test-metric")
self.c.counter("test-counter")
def test_gauge(self):
self.assertEquals(self.c.is_gauge("test-metric"), True)
self.assertEquals(self.c.is_counter("test-metric"), False)
self.c.save_sample("test-metric", 1.0)
# call twice in a row, should be invariant
self.assertEquals(self.c.get_sample("test-metric"), 1.0)
self.assertEquals(self.c.get_sample("test-metric"), 1.0)
self.assertEquals(self.c.get_sample_with_timestamp("test-metric")[1], 1.0)
# new value, old one should be gone
self.c.save_sample("test-metric", 2.0)
self.assertEquals(self.c.get_sample("test-metric"), 2.0)
self.assertEquals(len(self.c._sample_store["test-metric"]), 1)
# with explicit timestamp
self.c.save_sample("test-metric", 3.0, 1298066183.607717)
self.assertEquals(self.c.get_sample_with_timestamp("test-metric"), (1298066183.607717, 3.0, None, None))
# get_samples()
self.assertEquals(self.c.get_samples(), {"test-metric": 3.0})
def testEdgeCases(self):
self.assertRaises(CheckException, self.c.get_sample, "unknown-metric")
# same value
self.c.save_sample("test-counter", 1.0, 1.0)
self.c.save_sample("test-counter", 1.0, 1.0)
self.assertRaises(Infinity, self.c.get_sample, "test-counter")
def test_counter(self):
self.c.save_sample("test-counter", 1.0, 1.0)
self.assertRaises(UnknownValue, self.c.get_sample, "test-counter", expire=False)
self.c.save_sample("test-counter", 2.0, 2.0)
self.assertEquals(self.c.get_sample("test-counter", expire=False), 1.0)
self.assertEquals(self.c.get_sample_with_timestamp("test-counter", expire=False), (2.0, 1.0, None, None))
self.assertEquals(self.c.get_samples(expire=False), {"test-counter": 1.0})
self.c.save_sample("test-counter", -2.0, 3.0)
self.assertRaises(UnknownValue, self.c.get_sample_with_timestamp, "test-counter")
def test_tags(self):
# Test metric tagging
now = int(time.time())
# Tag metrics
self.c.save_sample("test-counter", 1.0, 1.0, tags = ["tag1", "tag2"])
self.c.save_sample("test-counter", 2.0, 2.0, tags = ["tag1", "tag2"])
# Only 1 point recording for this combination of tags, won't be sent
self.c.save_sample("test-counter", 3.0, 3.0, tags = ["tag1", "tag3"])
self.c.save_sample("test-metric", 3.0, now, tags = ["tag3", "tag4"])
# Arg checks
self.assertRaises(CheckException, self.c.save_sample, "test-metric", 4.0, now + 5, tags = "abc")
# This is a different combination of tags
self.c.save_sample("test-metric", 3.0, now, tags = ["tag5", "tag3"])
results = self.c.get_metrics()
results.sort()
self.assertEquals(results,
[("test-counter", 2.0, 1.0, {"tags": ["tag1", "tag2"]}),
("test-metric", now, 3.0, {"tags": ["tag3", "tag4"]}),
("test-metric", now, 3.0, {"tags": ["tag3", "tag5"]}),
])
# Tagged metrics are not available through get_samples anymore
self.assertEquals(self.c.get_samples(), {})
def test_samples(self):
self.assertEquals(self.c.get_samples(), {})
self.c.save_sample("test-metric", 1.0, 0.0) # value, ts
self.c.save_sample("test-counter", 1.0, 1.0) # value, ts
self.c.save_sample("test-counter", 4.0, 2.0) # value, ts
assert "test-metric" in self.c.get_samples_with_timestamps(expire=False), self.c.get_samples_with_timestamps(expire=False)
self.assertEquals(self.c.get_samples_with_timestamps(expire=False)["test-metric"], (0.0, 1.0, None, None))
assert "test-counter" in self.c.get_samples_with_timestamps(expire=False), self.c.get_samples_with_timestamps(expire=False)
self.assertEquals(self.c.get_samples_with_timestamps(expire=False)["test-counter"], (2.0, 3.0, None, None))
def test_name(self):
self.assertEquals(self.c.normalize("metric"), "metric")
self.assertEquals(self.c.normalize("metric", "prefix"), "prefix.metric")
self.assertEquals(self.c.normalize("__metric__", "prefix"), "prefix.metric")
self.assertEquals(self.c.normalize("abc.metric(a+b+c{}/5)", "prefix"), "prefix.abc.metric_a_b_c_5")
self.assertEquals(self.c.normalize("VBE.default(127.0.0.1,,8080).happy", "varnish"), "varnish.VBE.default_127.0.0.1_8080.happy")
class TestAggregator(unittest.TestCase):
def setUp(self):
self.aggr = MetricsAggregator('test-aggr')
def test_dupe_tags(self):
self.aggr.increment('test-counter', 1, tags=['a', 'b'])
self.aggr.increment('test-counter', 1, tags=['a', 'b', 'b'])
self.assertEquals(len(self.aggr.metrics), 1, self.aggr.metrics)
metric = self.aggr.metrics.values()[0]
self.assertEquals(metric.value, 2)
if __name__ == '__main__':
unittest.main()