Skip to content

Commit 8947896

Browse files
authored
[statsd] Restore buffering state when exiting context manager (#715)
When exiting the context or when manual close_buffer is invoked, we should restore the buffering state that existed before the context/manual buffer changes were applied. Fixes: #714
1 parent ee5ac16 commit 8947896

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

datadog/dogstatsd/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,8 @@ def close_buffer(self):
519519
self.flush()
520520
finally:
521521
# XXX Remove if `disable_buffering` default is changed to False
522-
self._send = self._send_to_server
522+
if self._disable_buffering:
523+
self._send = self._send_to_server
523524

524525
self._buffering_toggle_lock.release()
525526

tests/unit/dogstatsd/test_statsd.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,67 @@ def test_context_manager(self):
14221422
)
14231423
self.assertEqual(metrics_packet, fake_socket.recv(no_wait=True))
14241424

1425+
def test_context_manager_restores_enabled_buffering_state(self):
1426+
fake_socket = FakeSocket()
1427+
dogstatsd = DogStatsd(telemetry_min_flush_interval=0, disable_buffering=False)
1428+
dogstatsd.socket = fake_socket
1429+
1430+
with dogstatsd:
1431+
dogstatsd.gauge('page.views', 123)
1432+
dogstatsd.timing('timer', 123)
1433+
1434+
dogstatsd.gauge('newpage.views', 123)
1435+
dogstatsd.timing('newtimer', 123)
1436+
1437+
metric1 = "page.views:123|g"
1438+
metric2 = "timer:123|ms"
1439+
metric3 = "newpage.views:123|g"
1440+
metric4 = "newtimer:123|ms"
1441+
1442+
metrics1 = '\n'.join([metric1, metric2]) + "\n"
1443+
self.assertEqual(metrics1, fake_socket.recv(no_wait=True))
1444+
1445+
metrics_packet1 = telemetry_metrics(metrics=2, bytes_sent=len(metrics1), packets_sent=1)
1446+
self.assertEqual(metrics_packet1, fake_socket.recv(no_wait=True))
1447+
1448+
metrics2 = '\n'.join([metric3, metric4]) + "\n"
1449+
metrics_packet2 = telemetry_metrics(metrics=2, bytes_sent=len(metrics_packet1 + metrics2), packets_sent=2)
1450+
self.assertEqual(metrics2, fake_socket.recv(reset_wait=True))
1451+
self.assertEqual(metrics_packet2, fake_socket.recv())
1452+
1453+
def test_context_manager_restores_disabled_buffering_state(self):
1454+
fake_socket = FakeSocket()
1455+
dogstatsd = DogStatsd(telemetry_min_flush_interval=0, disable_buffering=True)
1456+
dogstatsd.socket = fake_socket
1457+
1458+
with dogstatsd:
1459+
dogstatsd.gauge('page.views', 123)
1460+
dogstatsd.timing('timer', 123)
1461+
1462+
dogstatsd.gauge('newpage.views', 123)
1463+
dogstatsd.timing('newtimer', 123)
1464+
1465+
metric1 = "page.views:123|g"
1466+
metric2 = "timer:123|ms"
1467+
metric3 = "newpage.views:123|g"
1468+
metric4 = "newtimer:123|ms"
1469+
1470+
metrics1 = '\n'.join([metric1, metric2]) + "\n"
1471+
self.assertEqual(metrics1, fake_socket.recv(no_wait=True))
1472+
1473+
metrics_packet1 = telemetry_metrics(metrics=2, bytes_sent=len(metrics1), packets_sent=1)
1474+
self.assertEqual(metrics_packet1, fake_socket.recv(no_wait=True))
1475+
1476+
metrics2 = '\n'.join([metric3]) + "\n"
1477+
metrics_packet2 = telemetry_metrics(metrics=1, bytes_sent=len(metrics_packet1 + metrics2), packets_sent=2)
1478+
self.assertEqual(metrics2, fake_socket.recv())
1479+
self.assertEqual(metrics_packet2, fake_socket.recv(no_wait=True))
1480+
1481+
metrics3 = '\n'.join([metric4]) + "\n"
1482+
metrics_packet3 = telemetry_metrics(metrics=1, bytes_sent=len(metrics_packet2 + metrics3), packets_sent=2)
1483+
self.assertEqual(metrics3, fake_socket.recv())
1484+
self.assertEqual(metrics_packet3, fake_socket.recv(no_wait=True))
1485+
14251486
def test_batched_buffer_autoflush(self):
14261487
fake_socket = FakeSocket()
14271488
bytes_sent = 0

0 commit comments

Comments
 (0)