def submit_and_assess_metric_payload(self, serie, attach_host_name=True): """ Helper to assess the metric payload format. """ now = time() if isinstance(serie, dict): Metric.send(attach_host_name=attach_host_name, **deepcopy(serie)) serie = [serie] else: Metric.send(deepcopy(serie), attach_host_name=attach_host_name) payload = self.get_request_data() for i, metric in enumerate(payload['series']): if attach_host_name: self.assertEqual(set(metric.keys()), set(['metric', 'points', 'host'])) self.assertEqual(metric['host'], api._host_name) else: self.assertEqual(set(metric.keys()), set(['metric', 'points'])) self.assertEqual(metric['metric'], serie[i]['metric']) # points is a list of 1 point self.assertTrue(isinstance(metric['points'], list)) self.assertEqual(len(metric['points']), 1) # it consists of a [time, value] pair self.assertEqual(len(metric['points'][0]), 2) # its value == value we sent self.assertEqual(metric['points'][0][1], float(serie[i]['points'])) # it's time not so far from current time assert now - 1 < metric['points'][0][0] < now + 1
def submit_and_assess_metric_payload(self, serie): """ Helper to assess the metric payload format. """ now = time() if isinstance(serie, dict): Metric.send(**deepcopy(serie)) serie = [serie] else: Metric.send(deepcopy(serie)) payload = self.get_request_data() for i, metric in enumerate(payload['series']): self.assertEquals(set(metric.keys()), set(['metric', 'points', 'host'])) self.assertEquals(metric['metric'], serie[i]['metric']) self.assertEquals(metric['host'], api._host_name) # points is a list of 1 point self.assertTrue(isinstance(metric['points'], list)) self.assertEquals(len(metric['points']), 1) # it consists of a [time, value] pair self.assertEquals(len(metric['points'][0]), 2) # its value == value we sent self.assertEquals(metric['points'][0][1], float(serie[i]['points'])) # it's time not so far from current time assert now - 1 < metric['points'][0][0] < now + 1
def test_metric_submit_multiple_points_is_single_value(self): from copy import deepcopy import json from time import time now = time() data = [dict(metric='metric.1', points=13), dict(metric='metric.2', points=19)] Metric.send(*deepcopy(data)) args, kwargs = self.request_mock.request.call_args sent_data = json.loads(kwargs['data']) for i, metric in enumerate(sent_data['series']): assert set(metric.keys()) == set(['metric', 'points', 'host']) assert metric['metric'] == data[i]['metric'] assert metric['host'] == api._host_name # points is a list of 1 point assert isinstance(metric['points'], list) and len(metric['points']) == 1 # it consists of a [time, value] pair assert len(metric['points'][0]) == 2 # its value == value we sent assert metric['points'][0][1] == data[i]['points'] # it's time not so far from current time assert now - 1 < metric['points'][0][0] < now + 1
def test_metric_submit_query_switch(self): """ Specific to Metric subpackages: endpoints are different for submission and queries """ Metric.send(points="val") self.request_called_with('POST', "host/api/v1/series", data={'series': [{'points': "val", 'host': api._host_name}]}) Metric.query(start="val1", end="val2") self.request_called_with('GET', "host/api/v1/query", params={'from': "val1", 'to': "val2"})
def test_metric_submit_query_switch(self): """ Endpoints are different for submission and queries. """ Metric.send(points=(123, 456)) self.request_called_with('POST', "host/api/v1/series", data={'series': [{'points': [[123, 456.0]], 'host': api._host_name}]}) Metric.query(start="val1", end="val2") self.request_called_with('GET', "host/api/v1/query", params={'from': "val1", 'to': "val2"})
def test_compression(self): """ Metric and Distribution support zlib compression """ # By default, there is no compression # Metrics series = dict(metric="metric.1", points=[(time(), 13.)]) Metric.send(attach_host_name=False, **series) _, kwargs = self.request_mock.call_args() req_data = kwargs["data"] headers = kwargs["headers"] assert "Content-Encoding" not in headers assert req_data == json.dumps({"series": [series]}) # Same result when explicitely False Metric.send(compress_payload=False, attach_host_name=False, **series) _, kwargs = self.request_mock.call_args() req_data = kwargs["data"] headers = kwargs["headers"] assert "Content-Encoding" not in headers assert req_data == json.dumps({"series": [series]}) # Distributions series = dict(metric="metric.1", points=[(time(), 13.)]) Distribution.send(attach_host_name=False, **series) _, kwargs = self.request_mock.call_args() req_data = kwargs["data"] headers = kwargs["headers"] assert "Content-Encoding" not in headers assert req_data == json.dumps({"series": [series]}) # Same result when explicitely False Distribution.send(compress_payload=False, attach_host_name=False, **series) _, kwargs = self.request_mock.call_args() req_data = kwargs["data"] headers = kwargs["headers"] assert "Content-Encoding" not in headers assert req_data == json.dumps({"series": [series]}) # Enabling compression # Metrics series = dict(metric="metric.1", points=[(time(), 13.)]) compressed_series = zlib.compress(json.dumps({"series": [series]}).encode("utf-8")) Metric.send(compress_payload=True, attach_host_name=False, **series) _, kwargs = self.request_mock.call_args() req_data = kwargs["data"] headers = kwargs["headers"] assert "Content-Encoding" in headers assert headers["Content-Encoding"] == "deflate" assert req_data == compressed_series # Distributions series = dict(metric='metric.1', points=[(time(), 13.)]) compressed_series = zlib.compress(json.dumps({"series": [series]}).encode("utf-8")) Distribution.send(compress_payload=True, attach_host_name=False, **series) _, kwargs = self.request_mock.call_args() req_data = kwargs["data"] headers = kwargs["headers"] assert "Content-Encoding" in headers assert headers["Content-Encoding"] == "deflate" assert req_data == compressed_series