Beispiel #1
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())
Beispiel #2
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
Beispiel #3
0
    def test_batched_buffer_autoflush(self):
        fake_socket = FakeSocket()
        bytes_sent = 0
        with DogStatsd(telemetry_min_flush_interval=0) as dogstatsd:
            single_metric = 'mycounter:1|c'
            self.assertEqual(dogstatsd._max_payload_size,
                             UDP_OPTIMAL_PAYLOAD_LENGTH)
            metrics_per_packet = dogstatsd._max_payload_size // (
                len(single_metric) + 1)
            dogstatsd.socket = fake_socket
            for _ in range(metrics_per_packet + 1):
                dogstatsd.increment('mycounter')
            payload = '\n'.join(
                [single_metric for _ in range(metrics_per_packet)])

            telemetry = telemetry_metrics(metrics=metrics_per_packet + 1,
                                          bytes_sent=len(payload))
            bytes_sent += len(payload) + len(telemetry)
            self.assertEqual(payload, fake_socket.recv())
            self.assertEqual(telemetry, fake_socket.recv())
        self.assertEqual(single_metric, fake_socket.recv())
        telemetry = telemetry_metrics(metrics=0,
                                      packets_sent=2,
                                      bytes_sent=len(single_metric) +
                                      len(telemetry))
        self.assertEqual(telemetry, fake_socket.recv())
def init_statsd_client(statsd_host='localhost', statsd_port=8125):
    global statsd
    if not statsd:
        statsd = DogStatsd(statsd_host,
                           statsd_port,
                           use_ms=True,
                           namespace=METRIC_PREFIX)
Beispiel #5
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)
Beispiel #6
0
def get_velibs():
    r = requests.get(
        "https://www.velib-metropole.fr/webapi/map/details?gpsTopLatitude=48.85240750385378&gpsTopLongitude=2.378431586815509&gpsBotLatitude=48.850687689726385&gpsBotLongitude=2.3723489091318015&zoomLevel=17.174858916253687"
    )
    velib_stations = json.loads(r.content.decode("utf-8"))
    statsd = DogStatsd(host=HOST, port=PORT, constant_tags=["host:api"])

    for station in velib_stations:
        tag = get_tag(station)
        bike_nb = station["nbBike"]
        ebike_nb = station["nbEbike"]
        free_dock_nb = station["nbFreeDock"] + station["nbFreeEDock"]
        dock_nb = station["nbDock"] + station["nbEDock"]
        statsd.gauge("velib.regular_bikes", bike_nb, tags=tag)
        statsd.gauge("velib.electric_bikes", ebike_nb, tags=tag)
        statsd.gauge("velib.free_docks", free_dock_nb, tags=tag)
        statsd.gauge("velib.total_docks", dock_nb, tags=tag)
        statsd.service_check(
            "velib.station_state",
            get_state(station),
            tags=tag,
            message=station["station"]["state"],
        )
        logger.info(
            "Found {} ebike(s), {} bike(s), {} free dock(s) on {} dock(s). The station is {}"
            .format(ebike_nb, bike_nb, free_dock_nb, dock_nb,
                    station["station"]["state"]),
            extra={"station": get_station_name(station)},
        )
Beispiel #7
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)
Beispiel #8
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
Beispiel #9
0
 def test_default_route(self):
     """
     Dogstatsd host can be dynamically set to the default route.
     """
     self.assertEqual(
         DogStatsd(use_default_route=True).host,
         "172.17.0.1"
     )
    def test_context_manager(self):
        fake_socket = FakeSocket()
        with DogStatsd() as statsd:
            statsd.socket = fake_socket
            statsd.gauge('page.views', 123)
            statsd.timing('timer', 123)

        t.assert_equal('page.views:123|g\ntimer:123|ms', fake_socket.recv())
 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())
Beispiel #12
0
    def test_batched_buffer_autoflush(self):
        fake_socket = FakeSocket()
        with DogStatsd() as statsd:
            statsd.socket = fake_socket
            for i in range(51):
                statsd.increment('mycounter')
            t.assert_equal('\n'.join(['mycounter:1|c' for i in range(50)]), fake_socket.recv())

        t.assert_equal('mycounter:1|c', fake_socket.recv())
Beispiel #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'
         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())
    def test_default_route(self):
        """
        Dogstatsd host can be dynamically set to the default route.
        """
        # Setup
        statsd = DogStatsd(use_default_route=True)

        # Assert
        t.assert_equal(statsd.host, "172.17.0.1")
Beispiel #15
0
 def test_context_manager(self):
     fake_socket = FakeSocket()
     with DogStatsd(telemetry_min_flush_interval=0) as dogstatsd:
         dogstatsd.socket = fake_socket
         dogstatsd.gauge('page.views', 123)
         dogstatsd.timing('timer', 123)
     metric = "page.views:123|g\ntimer:123|ms"
     self.assertEqual(metric, fake_socket.recv())
     self.assertEqual(telemetry_metrics(metrics=2, bytes_sent=len(metric)), fake_socket.recv())
Beispiel #16
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())
Beispiel #17
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"))
Beispiel #18
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())
Beispiel #19
0
    def test_context_manager(self):
        fake_socket = FakeSocket()
        with DogStatsd() as statsd:
            statsd.socket = fake_socket
            statsd.gauge('page.views', 123)
            statsd.timing('timer', 123)

        assert_equal_telemetry("page.views:123|g\ntimer:123|ms",
                               fake_socket.recv(),
                               telemetry=telemetry_metrics(metrics=2))
Beispiel #20
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())
Beispiel #21
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())
Beispiel #22
0
    def setUp(self):
        """
        Set up a default Dogstatsd instance and mock the proc filesystem.
        """
        #
        self.statsd = DogStatsd()
        self.statsd.socket = FakeSocket()

        # Mock the proc filesystem
        route_data = load_fixtures('route')
        self._procfs_mock = patch('datadog.util.compat.builtins.open', mock_open())
        self._procfs_mock.__enter__().return_value.readlines.return_value = route_data.split("\n")
Beispiel #23
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())
Beispiel #24
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())
Beispiel #25
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))
Beispiel #26
0
 def __init__(self, app, config, statsd=None):
     self.config = config
     for key, value in DEFAULTS.items():
         self.config.setdefault(key, value)
     self.statsd = DogStatsd(host=self.config['STATSD_HOST'],
                             port=self.config['STATSD_PORT'],
                             max_buffer_size=self.config['STATSD_MAX_BUFFER_SIZE'],
                             namespace=self.config['STATSD_NAMESPACE'],
                             constant_tags=self.config['STATSD_TAGS'],
                             use_ms=self.config['STATSD_USEMS']) \
         if statsd is None \
         else statsd
     self.app = app
    def test_socket_creation(self):
        """
        Socket creation plays well with multiple threads.
        """
        # Create a DogStatsd client but no socket
        statsd = DogStatsd()

        # Submit metrics from different threads to create a socket
        threads = []
        for value in range(10000):
            t = threading.Thread(target=statsd.gauge, args=("foo", value))
            threads.append(t)
            t.start()
        for t in threads:
            t.join()
Beispiel #28
0
    def test_dogstatsd_initialization_with_env_vars(self):
        """
        Dogstatsd can retrieve its config from env vars when
        not provided in constructor.
        """
        # Setup
        with preserve_environment_variable('DD_AGENT_HOST'):
            os.environ['DD_AGENT_HOST'] = 'myenvvarhost'
            with preserve_environment_variable('DD_DOGSTATSD_PORT'):
                os.environ['DD_DOGSTATSD_PORT'] = '4321'
                dogstatsd = DogStatsd()

        # Assert
        self.assertEqual(dogstatsd.host, "myenvvarhost")
        self.assertEqual(dogstatsd.port, 4321)
    def test_send_batch_metrics(self):
        """
        Metrics can be buffered, submitted from concurrent threads.
        """
        with DogStatsd() as batch_statsd:
            # Create a DogStatsd buffer client with a mocked socket
            batch_statsd.socket = self.socket

            # Samples
            values = set(range(10000))

            # Submit metrics from different threads
            self._submit_with_multiple_threads(batch_statsd, "gauge", 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)