Skip to content
This repository was archived by the owner on Oct 23, 2023. It is now read-only.

Commit d75f21b

Browse files
committed
Add provision to sample per message
- If `sample_rate` is present in the `extra` kwarg, use that value to overwrite the client's sample_rate. This allows event-level granularity for sampling
1 parent 9c309c8 commit d75f21b

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

raven/base.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,13 @@ def capture(self, event_type, data=None, date=None, time_spent=None,
636636
**kwargs)
637637

638638
# should this event be sampled?
639-
if self._random.random() < self.sample_rate:
639+
sample_rate = self.sample_rate
640+
try:
641+
sample_rate = float(extra['sample_rate'])
642+
except (TypeError, KeyError, ValueError):
643+
pass
644+
645+
if self._random.random() < sample_rate:
640646
self.send(**data)
641647

642648
self._local_state.last_event_id = data['event_id']

tests/base/tests.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,44 @@ def test_client_extra_context(self):
551551
expected = {'logger': "u'test'", 'foo': "u'bar'"}
552552
self.assertEquals(event['extra'], expected)
553553

554+
def test_sample_rate(self):
555+
self.client.sample_rate = 0.0
556+
self.client.captureMessage(message='test')
557+
self.assertEquals(len(self.client.events), 0)
558+
559+
def test_sample_rate_per_message(self):
560+
self.client.extra = {
561+
'foo': 'bar',
562+
}
563+
self.client.sample_rate = 1
564+
self.client.captureMessage(message='test', extra={'sample_rate': 0.0})
565+
self.assertEquals(len(self.client.events), 0)
566+
567+
self.client.sample_rate = 0
568+
self.client.captureMessage(message='test', extra={'sample_rate': 1.0})
569+
self.assertEquals(len(self.client.events), 1)
570+
event = self.client.events.pop(0)
571+
if not PY2:
572+
expected = {'sample_rate': 1.0, 'foo': "'bar'"}
573+
else:
574+
expected = {'sample_rate': 1.0, 'foo': "u'bar'"}
575+
self.assertEquals(event['extra'], expected)
576+
577+
def test_sample_rate_per_message_is_resilient_to_bad_values(self):
578+
self.client.sample_rate = 0
579+
580+
# sample_rate is not a number
581+
self.client.captureMessage(message='test', extra={'sample_rate': 'foo'})
582+
self.assertEquals(len(self.client.events), 0)
583+
584+
# sample_rate is not present
585+
self.client.captureMessage(message='test', extra={'foo': '1.0'})
586+
self.assertEquals(len(self.client.events), 0)
587+
588+
# sample_rate can be cast into a float
589+
self.client.captureMessage(message='test', extra={'sample_rate': '1.0'})
590+
self.assertEquals(len(self.client.events), 1)
591+
554592
def test_transport_registration(self):
555593
client = Client('http://public:[email protected]/1',
556594
transport=HTTPTransport)

0 commit comments

Comments
 (0)