def test_deterministic_interop(self): '''test a specific set of ids that should always have the given result (at sample rate 2) Ensures interoperability with other beelines''' ids = [ "4YeYygWjTZ41zOBKUoYUaSVxPGm78rdU", "iow4KAFBl9u6lF4EYIcsFz60rXGvu7ph", "EgQMHtruEfqaqQqRs5nwaDXsegFGmB5n", "UnVVepVdyGIiwkHwofyva349tVu8QSDn", "rWuxi2uZmBEprBBpxLLFcKtXHA8bQkvJ", "8PV5LN1IGm5T0ZVIaakb218NvTEABNZz", "EMSmscnxwfrkKd1s3hOJ9bL4zqT1uud5", "YiLx0WGJrQAge2cVoAcCscDDVidbH4uE", "IjD0JHdQdDTwKusrbuiRO4NlFzbPotvg", "ADwiQogJGOS4X8dfIcidcfdT9fY2WpHC", "DyGaS7rfQsMX0E6TD9yORqx7kJgUYvNR", "MjOCkn11liCYZspTAhdULMEfWJGMHvpK", "wtGa41YcFMR5CBNr79lTfRAFi6Vhr6UF", "3AsMjnpTBawWv2AAPDxLjdxx4QYl9XXb", "sa2uMVNPiZLK52zzxlakCUXLaRNXddBz", "NYH9lkdbvXsiUFKwJtjSkQ1RzpHwWloK", "8AwzQeY5cudY8YUhwxm3UEP7Oos61RTY", "ADKWL3p5gloRYO3ptarTCbWUHo5JZi3j", "UAnMARj5x7hkh9kwBiNRfs5aYDsbHKpw", "Aes1rgTLMNnlCkb9s6bH7iT5CbZTdxUw", "eh1LYTOfgISrZ54B7JbldEpvqVur57tv", "u5A1wEYax1kD9HBeIjwyNAoubDreCsZ6", "mv70SFwpAOHRZt4dmuw5n2lAsM1lOrcx", "i4nIu0VZMuh5hLrUm9w2kqNxcfYY7Y3a", "UqfewK2qFZqfJ619RKkRiZeYtO21ngX1", ] expected = [ False, True, True, True, True, False, True, True, False, False, True, False, True, False, False, False, False, False, True, True, False, False, True, True, False, ] for i in range(len(ids)): self.assertEqual(_should_sample(ids[i], 2), expected[i])
def test_deterministic(self): ''' test a specific id that should always work with the given sample rate ''' trace_id = 'b8d674f1-04ed-4ea8-b16d-b4dbbe87c78e' n = 0 while n < 1000: self.assertTrue(_should_sample(trace_id, 1000)) n += 1
def test_deterministic(self): ''' test a specific id that should always work with the given sample rate ''' trace_id = '8bd68312-a3ce-4bf8-a2df-896cef4289e5' n = 0 while n < 1000: self.assertTrue(_should_sample(trace_id, 1000)) n += 1
def _sampler(fields): sample_rate = def_sample_rate route = fields.get('route') or '' if route in sample_routes: sample_rate = sample_routes[route] # XXX: to support auth if 'billing' in route: sample_rate = 1 method = fields.get('request.method') if method != 'GET': sample_rate = 1 response_code = fields.get('response.status_code') if response_code != 200: sample_rate = 1 token = fields.get('access_token') if token is not None and token in debug_tokens: sample_rate = 1 if _should_sample(fields.get('trace.trace_id'), sample_rate): return True, sample_rate return False, 0
def sampler(fields): sample_rate = 2 route = fields.get('route') or '' if route == 'heartbeat': sample_rate = 100 elif route == 'api.me': sample_rate = 10 elif 'billing.' in route: sample_rate = 1 response_code = fields.get('response.status_code') if response_code != 200: sample_rate = 1 if _should_sample(fields.get('trace.trace_id'), sample_rate): return True, sample_rate return False, 0
def test_probability(self): ''' test that _should_sample approximates 1 in N sampling for random IDs ''' tests_count = 50000 error_margin = 0.05 sample_rates = [1, 2, 10] for rate in sample_rates: sampled = n = 0 while n < tests_count: n += 1 if _should_sample(str(uuid.uuid4()), rate): sampled += 1 expected = tests_count // rate acceptable_lower_bound = int(expected - (expected * error_margin)) acceptable_upper_bound = int(expected + (expected * error_margin)) self.assertLessEqual(sampled, acceptable_upper_bound) self.assertGreaterEqual(sampled, acceptable_lower_bound)
def should_sample_always_returns_true_when_sample_rate_is_1(self): for _ in range(1000): self.assertTrue(_should_sample(binascii.b2a_hex(os.urandom(16)), 1))