Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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"})
Example #5
0
    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"})
Example #6
0
    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