Skip to content

Commit 7e97780

Browse files
authored
Fix potential metric loss when open_buffer is combined with disable_buffering=False (#820)
* Don't reset buffer in open_buffer When disable_buffering=False, the buffer may contain still unsent metrics, which are lost when we reset the buffer. When disable_buffering=True, the reset is a noop anyway. * Remove invalid todos Even if disable_buffering defaults to False, the user may still opt to disable it, in which case the code in these methods still must execute as it is today.
1 parent 12c06db commit 7e97780

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

datadog/dogstatsd/base.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -734,14 +734,11 @@ def open_buffer(self, max_buffer_size=None):
734734

735735
self._config_lock.acquire()
736736

737-
# XXX Remove if `disable_buffering` default is changed to False
738737
self._send = self._send_to_buffer
739738

740739
if max_buffer_size is not None:
741740
log.warning("The parameter max_buffer_size is now deprecated and is not used anymore")
742741

743-
self._reset_buffer()
744-
745742
def close_buffer(self):
746743
"""
747744
Flush the buffer and switch back to single metric packets.
@@ -752,7 +749,6 @@ def close_buffer(self):
752749
try:
753750
self.flush()
754751
finally:
755-
# XXX Remove if `disable_buffering` default is changed to False
756752
if self._disable_buffering:
757753
self._send = self._send_to_server
758754

tests/integration/dogstatsd/test_statsd_sender.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,21 @@ def test_fork_hooks(disable_background_sender, disable_buffering):
8383

8484
foo.close()
8585
bar.close()
86+
87+
88+
def test_buffering_with_context():
89+
statsd = DogStatsd(
90+
telemetry_min_flush_interval=0,
91+
disable_buffering=False,
92+
)
93+
94+
foo, bar = socket.socketpair(socket.AF_UNIX, socket.SOCK_DGRAM, 0)
95+
statsd.socket = foo
96+
97+
statsd.increment("first")
98+
with statsd: # should not erase previously buffered metrics
99+
pass
100+
101+
bar.settimeout(5)
102+
msg = bar.recv(8192)
103+
assert msg == b"first:1|c\n"

0 commit comments

Comments
 (0)