Skip to content

Commit a52d0fb

Browse files
record dropping metrics and test
1 parent 2853d33 commit a52d0fb

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

sentry_sdk/_metrics_batcher.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ class MetricsBatcher:
1919
def __init__(
2020
self,
2121
capture_func, # type: Callable[[Envelope], None]
22+
record_lost_func, # type: Callable[..., None]
2223
):
2324
# type: (...) -> None
2425
self._metric_buffer = [] # type: List[Metric]
2526
self._capture_func = capture_func
27+
self._record_lost_func = record_lost_func
2628
self._running = True
2729
self._lock = threading.Lock()
2830

@@ -74,6 +76,11 @@ def add(
7476

7577
with self._lock:
7678
if len(self._metric_buffer) >= self.MAX_METRICS_BEFORE_DROP:
79+
self._record_lost_func(
80+
reason="queue_overflow",
81+
data_category="trace_metric",
82+
quantity=1,
83+
)
7784
return None
7885

7986
self._metric_buffer.append(metric)

sentry_sdk/client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,10 @@ def _capture_envelope(envelope):
377377

378378
self.metrics_batcher = None
379379
if has_metrics_enabled(self.options):
380-
self.metrics_batcher = MetricsBatcher(capture_func=_capture_envelope)
380+
self.metrics_batcher = MetricsBatcher(
381+
capture_func=_capture_envelope,
382+
record_lost_func=self.transport.record_lost_event,
383+
)
381384

382385
max_request_body_size = ("always", "never", "small", "medium")
383386
if self.options["max_request_body_size"] not in max_request_body_size:

tests/test_metrics.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from sentry_sdk.envelope import Envelope
99
from sentry_sdk.types import Metric
1010

11+
from sentry_sdk._metrics_batcher import MetricsBatcher
12+
1113

1214
def envelopes_to_metrics(envelopes):
1315
# type: (List[Envelope]) -> List[Metric]
@@ -204,3 +206,27 @@ def _before_metric(record, hint):
204206
assert len(metrics) == 1
205207
assert metrics[0]["name"] == "test.keep"
206208
assert before_metric_called
209+
210+
211+
def test_batcher_drops_metrics(sentry_init, monkeypatch):
212+
sentry_init()
213+
client = sentry_sdk.get_client()
214+
215+
def no_op_flush():
216+
pass
217+
218+
monkeypatch.setattr(client.metrics_batcher, "_flush", no_op_flush)
219+
220+
lost_event_calls = []
221+
222+
def record_lost_event(reason, data_category=None, item=None, *, quantity=1):
223+
lost_event_calls.append((reason, data_category, item, quantity))
224+
225+
monkeypatch.setattr(client.metrics_batcher, "_record_lost_func", record_lost_event)
226+
227+
for i in range(10_005): # 5 metrics over the hard limit
228+
sentry_sdk.metrics.count("test.counter", 1)
229+
230+
assert len(lost_event_calls) == 5
231+
for lost_event_call in lost_event_calls:
232+
assert lost_event_call == ("queue_overflow", "trace_metric", None, 1)

0 commit comments

Comments
 (0)