Skip to content

Commit ff9f020

Browse files
authored
AMLII-1086 fix stale client_transport tag (#802)
initialize reassigns socket_path property on the global statsd instance, but the client_transport tag was computed in the constructor and never updated, causing client to misreport transport as udp when a unix socket was actually used. This patch makes the tag dynamic and updates it every time the socket_path property is updated.
1 parent 5455e9c commit ff9f020

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

datadog/dogstatsd/base.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,14 +325,12 @@ def __init__(
325325
self.socket_path = socket_path # type: Optional[text]
326326
self.host = None
327327
self.port = None
328-
transport = "uds"
329328
if not self._max_payload_size:
330329
self._max_payload_size = UDS_OPTIMAL_PAYLOAD_LENGTH
331330
else:
332331
self.socket_path = None
333332
self.host = self.resolve_host(host, use_default_route)
334333
self.port = int(port)
335-
transport = "udp"
336334
if not self._max_payload_size:
337335
self._max_payload_size = UDP_OPTIMAL_PAYLOAD_LENGTH
338336

@@ -381,7 +379,6 @@ def __init__(
381379
self._client_tags = [
382380
"client:py",
383381
"client_version:{}".format(__version__),
384-
"client_transport:{}".format(transport),
385382
]
386383
self._reset_telemetry()
387384
self._telemetry_flush_interval = telemetry_min_flush_interval
@@ -417,6 +414,15 @@ def __init__(
417414
if not disable_background_sender:
418415
self.enable_background_sender(sender_queue_size, sender_queue_timeout)
419416

417+
@property
418+
def socket_path(self):
419+
return self._socket_path
420+
421+
@socket_path.setter
422+
def socket_path(self, path):
423+
self._socket_path = path
424+
self._transport = "udp" if path is None else "uds"
425+
420426
def enable_background_sender(self, sender_queue_size=0, sender_queue_timeout=0):
421427
"""
422428
Use a background thread to communicate with the dogstatsd server.
@@ -943,7 +949,10 @@ def bytes_dropped(self):
943949
return self.bytes_dropped_queue + self.bytes_dropped_writer
944950

945951
def _flush_telemetry(self):
946-
telemetry_tags = ",".join(self._add_constant_tags(self._client_tags))
952+
tags = self._client_tags[:]
953+
tags.append("client_transport:{}".format(self._transport))
954+
tags.extend(self.constant_tags)
955+
telemetry_tags = ",".join(tags)
947956

948957
return TELEMETRY_FORMATTING_STR % (
949958
self.metrics_count,

tests/unit/dogstatsd/test_statsd.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,9 @@ def tearDown(self):
145145
"""
146146
self._procfs_mock.stop()
147147

148-
def assert_equal_telemetry(self, expected_payload, actual_payload, telemetry=None):
148+
def assert_equal_telemetry(self, expected_payload, actual_payload, telemetry=None, **kwargs):
149149
if telemetry is None:
150-
telemetry = telemetry_metrics(bytes_sent=len(expected_payload))
150+
telemetry = telemetry_metrics(bytes_sent=len(expected_payload), **kwargs)
151151

152152
if expected_payload:
153153
expected_payload = "\n".join([expected_payload, telemetry])
@@ -705,6 +705,14 @@ def test_udp_socket_ensures_min_receive_buffer(self, mock_socket_create):
705705
MIN_SEND_BUFFER_SIZE,
706706
)
707707

708+
def test_socket_path_updates_telemetry(self):
709+
self.statsd.gauge("foo", 1)
710+
self.assert_equal_telemetry("foo:1|g\n", self.recv(2), transport="udp")
711+
self.statsd.socket_path = "/fake/path"
712+
self.statsd._reset_telemetry()
713+
self.statsd.gauge("foo", 2)
714+
self.assert_equal_telemetry("foo:2|g\n", self.recv(2), transport="uds")
715+
708716
def test_distributed(self):
709717
"""
710718
Measure the distribution of a function's run time using distribution custom metric.

0 commit comments

Comments
 (0)