Esempio n. 1
0
    def test_telemetry_flush_interval_alternate_destination(self):
        statsd = DogStatsd(telemetry_host='foo')
        fake_socket = FakeSocket()
        statsd.socket = fake_socket
        fake_telemetry_socket = FakeSocket()
        statsd.telemetry_socket = fake_telemetry_socket

        assert statsd.telemetry_host != None
        assert statsd.telemetry_port != None
        assert statsd._dedicated_telemetry_destination()

        # set the last flush time in the future to be sure we won't flush
        statsd._last_flush_time = time.time(
        ) + statsd._telemetry_flush_interval
        statsd.gauge('gauge', 123.4)

        assert_equal('gauge:123.4|g', fake_socket.recv())

        t1 = time.time()
        # setting the last flush time in the past to trigger a telemetry flush
        statsd._last_flush_time = t1 - statsd._telemetry_flush_interval - 1
        statsd.gauge('gauge', 123.4)

        assert_equal('gauge:123.4|g', fake_socket.recv())
        assert_equal_telemetry('',
                               fake_telemetry_socket.recv(),
                               telemetry=telemetry_metrics(metrics=2,
                                                           bytes_sent=13 * 2,
                                                           packets_sent=2))
        # assert that _last_flush_time has been updated
        assert t1 < statsd._last_flush_time
Esempio n. 2
0
 def test_tags_from_environment_and_constant(self):
     with preserve_environment_variable('DATADOG_TAGS'):
        os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
        statsd = DogStatsd(constant_tags=['country:canada', 'red'])
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     t.assert_equal('gt:123.4|g|#country:canada,red,country:china,age:45,blue', statsd.socket.recv())
Esempio n. 3
0
    def test_telemetry_flush_interval(self):
        statsd = DogStatsd()
        fake_socket = FakeSocket()
        statsd.socket = fake_socket

        # set the last flush time in the future to be sure we won't flush
        statsd._last_flush_time = time.time(
        ) + statsd._telemetry_flush_interval
        statsd.gauge('gauge', 123.4)

        metric = 'gauge:123.4|g'
        assert_equal(metric, fake_socket.recv())

        t1 = time.time()
        # setting the last flush time in the past to trigger a telemetry flush
        statsd._last_flush_time = t1 - statsd._telemetry_flush_interval - 1
        statsd.gauge('gauge', 123.4)
        assert_equal_telemetry(metric,
                               fake_socket.recv(2),
                               telemetry=telemetry_metrics(metrics=2,
                                                           bytes_sent=2 *
                                                           len(metric),
                                                           packets_sent=2))

        # assert that _last_flush_time has been updated
        assert t1 < statsd._last_flush_time
Esempio n. 4
0
    def test_telemetry_flush_interval(self):
        dogstatsd = DogStatsd()
        fake_socket = FakeSocket()
        dogstatsd.socket = fake_socket

        # set the last flush time in the future to be sure we won't flush
        dogstatsd._last_flush_time = time.time(
        ) + dogstatsd._telemetry_flush_interval
        dogstatsd.gauge('gauge', 123.4)

        metric = 'gauge:123.4|g'
        self.assertEqual(metric, fake_socket.recv())

        time1 = time.time()
        # setting the last flush time in the past to trigger a telemetry flush
        dogstatsd._last_flush_time = time1 - dogstatsd._telemetry_flush_interval - 1
        dogstatsd.gauge('gauge', 123.4)
        self.assert_equal_telemetry(metric,
                                    fake_socket.recv(2),
                                    telemetry=telemetry_metrics(
                                        metrics=2,
                                        bytes_sent=2 * len(metric),
                                        packets_sent=2))

        # assert that _last_flush_time has been updated
        self.assertTrue(time1 < dogstatsd._last_flush_time)
Esempio n. 5
0
    def test_telemetry_flush_interval_alternate_destination(self):
        dogstatsd = DogStatsd(telemetry_host='foo')
        fake_socket = FakeSocket()
        dogstatsd.socket = fake_socket
        fake_telemetry_socket = FakeSocket()
        dogstatsd.telemetry_socket = fake_telemetry_socket

        self.assertIsNotNone(dogstatsd.telemetry_host)
        self.assertIsNotNone(dogstatsd.telemetry_port)
        self.assertTrue(dogstatsd._dedicated_telemetry_destination())

        # set the last flush time in the future to be sure we won't flush
        dogstatsd._last_flush_time = time.time(
        ) + dogstatsd._telemetry_flush_interval
        dogstatsd.gauge('gauge', 123.4)

        self.assertEqual('gauge:123.4|g', fake_socket.recv())

        time1 = time.time()
        # setting the last flush time in the past to trigger a telemetry flush
        dogstatsd._last_flush_time = time1 - dogstatsd._telemetry_flush_interval - 1
        dogstatsd.gauge('gauge', 123.4)

        self.assertEqual('gauge:123.4|g', fake_socket.recv())
        self.assert_equal_telemetry('',
                                    fake_telemetry_socket.recv(),
                                    telemetry=telemetry_metrics(
                                        metrics=2,
                                        bytes_sent=13 * 2,
                                        packets_sent=2))

        # assert that _last_flush_time has been updated
        self.assertTrue(time1 < dogstatsd._last_flush_time)
Esempio n. 6
0
 def test_tags_from_environment_and_constant(self):
     with preserve_environment_variable('DATADOG_TAGS'):
        os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
        statsd = DogStatsd(constant_tags=['country:canada', 'red'])
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     t.assert_equal('gt:123.4|g|#country:canada,red,country:china,age:45,blue', statsd.socket.recv())
Esempio n. 7
0
 def test_entity_tag_from_environment(self):
     with preserve_environment_variable('DD_ENTITY_ID'):
         os.environ['DD_ENTITY_ID'] = '04652bb7-19b7-11e9-9cc6-42010a9c016d'
         statsd = DogStatsd()
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     assert_equal(
         'gt:123.4|g|#dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d',
         statsd.socket.recv())
Esempio n. 8
0
 def test_entity_tag_from_environment_and_constant(self):
     with preserve_environment_variable('DD_ENTITY_ID'):
         os.environ['DD_ENTITY_ID'] = '04652bb7-19b7-11e9-9cc6-42010a9c016d'
         statsd = DogStatsd(constant_tags=['country:canada', 'red'])
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     t.assert_equal(
         'gt:123.4|g|#country:canada,red,dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d',
         statsd.socket.recv())
Esempio n. 9
0
 def test_tags_from_environment(self):
     with preserve_environment_variable('DATADOG_TAGS'):
         os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
         dogstatsd = DogStatsd(telemetry_min_flush_interval=0)
     dogstatsd.socket = FakeSocket()
     dogstatsd.gauge('gt', 123.4)
     metric = 'gt:123.4|g|#country:china,age:45,blue'
     self.assertEqual(metric, dogstatsd.socket.recv())
     self.assertEqual(telemetry_metrics(tags="country:china,age:45,blue", bytes_sent=len(metric)), dogstatsd.socket.recv())
Esempio n. 10
0
 def test_tags_from_environment_and_constant(self):
     with preserve_environment_variable('DATADOG_TAGS'):
         os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
         statsd = DogStatsd(constant_tags=['country:canada', 'red'], telemetry_min_flush_interval=0)
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     tags="country:canada,red,country:china,age:45,blue"
     metric = 'gt:123.4|g|#'+tags
     assert_equal(metric, statsd.socket.recv())
     assert_equal(telemetry_metrics(tags=tags, bytes_sent=len(metric)), statsd.socket.recv())
Esempio n. 11
0
 def test_tags_from_environment(self):
     with preserve_environment_variable('DATADOG_TAGS'):
         os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
         statsd = DogStatsd()
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     assert_equal_telemetry(
         'gt:123.4|g|#country:china,age:45,blue',
         statsd.socket.recv(),
         telemetry=telemetry_metrics(tags="country:china,age:45,blue"))
Esempio n. 12
0
 def test_entity_tag_from_environment_and_constant(self):
     with preserve_environment_variable('DD_ENTITY_ID'):
         os.environ['DD_ENTITY_ID'] = '04652bb7-19b7-11e9-9cc6-42010a9c016d'
         statsd = DogStatsd(constant_tags=['country:canada', 'red'], telemetry_min_flush_interval=0)
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     metric = 'gt:123.4|g|#country:canada,red,dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d'
     assert_equal(metric, statsd.socket.recv())
     assert_equal(
         telemetry_metrics(tags="country:canada,red,dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d",
         bytes_sent=len(metric)), statsd.socket.recv())
Esempio n. 13
0
 def test_entity_tag_from_environment(self):
     with preserve_environment_variable('DD_ENTITY_ID'):
         os.environ['DD_ENTITY_ID'] = '04652bb7-19b7-11e9-9cc6-42010a9c016d'
         dogstatsd = DogStatsd(telemetry_min_flush_interval=0)
     dogstatsd.socket = FakeSocket()
     dogstatsd.gauge('gt', 123.4)
     metric = 'gt:123.4|g|#dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d'
     self.assertEqual(metric, dogstatsd.socket.recv())
     self.assertEqual(
         telemetry_metrics(tags="dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d", bytes_sent=len(metric)),
         dogstatsd.socket.recv())
Esempio n. 14
0
 def test_entity_tag_and_tags_from_environment_and_constant(self):
     with preserve_environment_variable('DATADOG_TAGS'):
         os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
         with preserve_environment_variable('DD_ENTITY_ID'):
             os.environ['DD_ENTITY_ID'] = '04652bb7-19b7-11e9-9cc6-42010a9c016d'
             dogstatsd = DogStatsd(constant_tags=['country:canada', 'red'], telemetry_min_flush_interval=0)
     dogstatsd.socket = FakeSocket()
     dogstatsd.gauge('gt', 123.4)
     tags = "country:canada,red,country:china,age:45,blue,dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d"
     metric = 'gt:123.4|g|#'+tags
     self.assertEqual(metric, dogstatsd.socket.recv())
     self.assertEqual(telemetry_metrics(tags=tags, bytes_sent=len(metric)), dogstatsd.socket.recv())
Esempio n. 15
0
    def test_dogstatsd_initialization_with_dd_env_service_version(self):
        """
        Dogstatsd should automatically use DD_ENV, DD_SERVICE, and DD_VERSION (if present)
        to set {env, service, version} as global tags for all metrics emitted.
        """
        cases = [
            # Test various permutations of setting DD_* env vars, as well as other global tag configuration.
            # An empty string signifies that the env var either isn't set or that it is explicitly set to empty string.
            ('', '', '', '', [], []),
            ('prod', '', '', '', [], ['env:prod']),
            ('prod', 'dog', '', '', [], ['env:prod', 'service:dog']),
            ('prod', 'dog', 'abc123', '', [], ['env:prod', 'service:dog', 'version:abc123']),
            ('prod', 'dog', 'abc123', 'env:prod,type:app', [], ['env:prod', 'env:prod', 'service:dog', 'type:app', 'version:abc123']),
            ('prod', 'dog', 'abc123', 'env:prod2,type:app', [], ['env:prod', 'env:prod2', 'service:dog', 'type:app', 'version:abc123']),
            ('prod', 'dog', 'abc123', '', ['env:prod', 'type:app'], ['env:prod', 'env:prod', 'service:dog', 'type:app', 'version:abc123']),
            ('prod', 'dog', 'abc123', '', ['env:prod2', 'type:app'], ['env:prod', 'env:prod2', 'service:dog', 'type:app', 'version:abc123']),
            ('prod', 'dog', 'abc123', 'env:prod3,custom_tag:cat', ['env:prod2', 'type:app'], ['custom_tag:cat', 'env:prod', 'env:prod2', 'env:prod3', 'service:dog', 'type:app', 'version:abc123']),
        ]
        for case in cases:
            dd_env, dd_service, dd_version, datadog_tags, constant_tags, global_tags = case
            with EnvVars(
                env_vars={
                    'DATADOG_TAGS': datadog_tags,
                    'DD_ENV': dd_env,
                    'DD_SERVICE': dd_service,
                    'DD_VERSION': dd_version,
                }
            ):
                dogstatsd = DogStatsd(constant_tags=constant_tags, telemetry_min_flush_interval=0)
                dogstatsd.socket = FakeSocket()

            # Guarantee consistent ordering, regardless of insertion order.
            dogstatsd.constant_tags.sort()
            self.assertEqual(global_tags, dogstatsd.constant_tags)

            # Make call with no tags passed; only the globally configured tags will be used.
            global_tags_str = ','.join([t for t in global_tags])
            dogstatsd.gauge('gt', 123.4)

            # Protect against the no tags case.
            metric = 'gt:123.4|g|#{}'.format(global_tags_str) if global_tags_str else 'gt:123.4|g'
            self.assertEqual(metric, dogstatsd.socket.recv())
            self.assertEqual(telemetry_metrics(tags=global_tags_str, bytes_sent=len(metric)), dogstatsd.socket.recv())
            dogstatsd._reset_telemetry()

            # Make another call with local tags passed.
            passed_tags = ['env:prod', 'version:def456', 'custom_tag:toad']
            all_tags_str = ','.join([t for t in passed_tags + global_tags])
            dogstatsd.gauge('gt', 123.4, tags=passed_tags)

            metric = 'gt:123.4|g|#{}'.format(all_tags_str)
            self.assertEqual(metric, dogstatsd.socket.recv())
            self.assertEqual(telemetry_metrics(tags=global_tags_str, bytes_sent=len(metric)), dogstatsd.socket.recv())
Esempio n. 16
0
 def test_entity_tag_and_tags_from_environment_and_constant(self):
     with preserve_environment_variable('DATADOG_TAGS'):
         os.environ['DATADOG_TAGS'] = 'country:china,age:45,blue'
         with preserve_environment_variable('DD_ENTITY_ID'):
             os.environ[
                 'DD_ENTITY_ID'] = '04652bb7-19b7-11e9-9cc6-42010a9c016d'
             statsd = DogStatsd(constant_tags=['country:canada', 'red'])
     statsd.socket = FakeSocket()
     statsd.gauge('gt', 123.4)
     tags = "country:canada,red,country:china,age:45,blue,dd.internal.entity_id:04652bb7-19b7-11e9-9cc6-42010a9c016d"
     assert_equal_telemetry('gt:123.4|g|#' + tags,
                            statsd.socket.recv(),
                            telemetry=telemetry_metrics(tags=tags))
    def test_timing(self):
        """
        Timings can be submitted from concurrent threads.
        """
        # Create a DogStatsd client with a mocked socket
        statsd = DogStatsd()
        statsd.socket = self.socket

        # Samples
        values = set(range(10000))

        # Submit metrics from different threads
        self._submit_with_multiple_threads(statsd, "timing", values)

        # All metrics were properly submitted
        self.assertMetrics(values)
    def test_timing(self):
        """
        Timings can be submitted from concurrent threads.
        """
        # Create a DogStatsd client with a mocked socket
        statsd = DogStatsd()
        statsd.socket = self.socket

        # Samples
        values = set(range(10000))

        # Submit metrics from different threads
        self._submit_with_multiple_threads(statsd, "timing", values)

        # All metrics were properly submitted
        self.assertMetrics(values)
    def test_decrement(self):
        """
        Decrements can be submitted from concurrent threads.
        """
        # Create a DogStatsd client with a mocked socket
        statsd = DogStatsd()
        statsd.socket = self.socket

        # Samples
        values = set(range(10000))
        expected_value = set([-value for value in values])

        # Submit metrics from different threads
        self._submit_with_multiple_threads(statsd, "decrement", expected_value)

        #  All metrics were properly submitted
        self.assertMetrics(values)
    def test_decrement(self):
        """
        Decrements can be submitted from concurrent threads.
        """
        # Create a DogStatsd client with a mocked socket
        statsd = DogStatsd()
        statsd.socket = self.socket

        # Samples
        values = set(range(10000))
        expected_value = set([-value for value in values])

        # Submit metrics from different threads
        self._submit_with_multiple_threads(statsd, "decrement", expected_value)

        #  All metrics were properly submitted
        self.assertMetrics(values)
    def test_timed_context_manager_threaded(self, mock_time):
        """
        `timed` context manager plays well with concurrent threads.
        """
        # Create a DogStatsd client with a mocked socket
        statsd = DogStatsd()
        statsd.socket = self.socket

        # Set up the mocked time
        mock_time.return_value = 0

        # Method to time
        def bar():
            """
            Wait 5 time units and return.
            """
            initial_time = mock_time.return_value

            with statsd.timed("foo"):
                while mock_time.return_value < initial_time + 2:
                    pass

        # Run the method within multiple threads
        threads = []
        for value in range(10):
            t = threading.Thread(target=bar)
            threads.append(t)
            # Bump time so that previous thread can complete
            mock_time.return_value += 1
            t.start()
            # Sleep to let the threads start
            time.sleep(0.1)

        # Bump time so that all threads completes
        time.sleep(0.1)
        mock_time.return_value += 1
        time.sleep(0.1)
        mock_time.return_value += 1

        for t in threads:
            t.join()

        # All metrics were properly submitted
        expected_values = [2 for _ in range(0, 10)]
        self.assertMetrics(expected_values)
    def test_timed_context_manager_threaded(self, mock_time):
        """
        `timed` context manager plays well with concurrent threads.
        """
        # Create a DogStatsd client with a mocked socket
        statsd = DogStatsd()
        statsd.socket = self.socket

        # Set up the mocked time
        mock_time.return_value = 0

        # Method to time
        def bar():
            """
            Wait 5 time units and return.
            """
            initial_time = mock_time.return_value

            with statsd.timed("foo"):
                while mock_time.return_value < initial_time + 2:
                    pass

        # Run the method within multiple threads
        threads = []
        for value in range(10):
            t = threading.Thread(target=bar)
            threads.append(t)
            # Bump time so that previous thread can complete
            mock_time.return_value += 1
            t.start()
            # Sleep to let the threads start
            time.sleep(0.1)

        # Bump time so that all threads completes
        time.sleep(0.1)
        mock_time.return_value += 1
        time.sleep(0.1)
        mock_time.return_value += 1

        for t in threads:
            t.join()

        # All metrics were properly submitted
        expected_values = [2 for _ in xrange(0, 10)]
        self.assertMetrics(expected_values)
Esempio n. 23
0
    def test_telemetry_flush_interval_batch(self):
        dogstatsd = DogStatsd()

        fake_socket = FakeSocket()
        dogstatsd.socket = fake_socket

        dogstatsd.open_buffer()
        dogstatsd.gauge('gauge1', 1)
        dogstatsd.gauge('gauge2', 2)

        time1 = time.time()
        # setting the last flush time in the past to trigger a telemetry flush
        dogstatsd._last_flush_time = time1 - statsd._telemetry_flush_interval -1

        dogstatsd.close_buffer()

        metric = 'gauge1:1|g\ngauge2:2|g'
        self.assert_equal_telemetry(metric, fake_socket.recv(2), telemetry=telemetry_metrics(metrics=2, bytes_sent=len(metric)))
        # assert that _last_flush_time has been updated
        self.assertTrue(time1 < dogstatsd._last_flush_time)
Esempio n. 24
0
 def test_accessing_socket_multiple_times_returns_same_socket(self):
     dogpound = DogStatsd()
     fresh_socket = FakeSocket()
     dogpound.socket = fresh_socket
     self.assertEqual(fresh_socket, dogpound.get_socket())
     self.assertNotEqual(FakeSocket(), dogpound.get_socket())
Esempio n. 25
0
 def test_accessing_socket_multiple_times_returns_same_socket(self):
     dogpound = DogStatsd()
     fresh_socket = FakeSocket()
     dogpound.socket = fresh_socket
     assert_equal(fresh_socket, dogpound.get_socket())
     assert FakeSocket() != dogpound.get_socket()
Esempio n. 26
0
 def test_accessing_socket_multiple_times_returns_same_socket(self):
     dogpound = DogStatsd()
     fresh_socket = FakeSocket()
     dogpound.socket = fresh_socket
     t.assert_equal(fresh_socket, dogpound.get_socket())
     t.assert_not_equal(FakeSocket(), dogpound.get_socket())