def test_set_sample_rate_by_service(self): cases = [ {"service:,env:":1}, {"service:,env:":1, "service:mcnulty,env:dev":0.33, "service:postgres,env:dev":0.7}, {"service:,env:":1, "service:mcnulty,env:dev": 0.25, "service:postgres,env:dev": 0.5, "service:redis,env:prod": 0.75} ] tracer = get_dummy_tracer() tracer.configure(sampler=AllSampler(), priority_sampling=True) priority_sampler = tracer.priority_sampler for case in cases: priority_sampler.set_sample_rate_by_service(case) rates = {} for k,v in iteritems(priority_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, "%s != %s" % (case, rates) # It's important to also test in reverse mode for we want to make sure key deletion # works as well as key insertion (and doing this both ways ensures we trigger both cases) cases.reverse() for case in cases: priority_sampler.set_sample_rate_by_service(case) rates = {} for k,v in iteritems(priority_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, "%s != %s" % (case, rates)
def test_set_sample_rate_by_service(self): cases = [{ "service:,env:": 1 }, { "service:,env:": 1, "service:mcnulty,env:dev": 0.33, "service:postgres,env:dev": 0.7 }, { "service:,env:": 1, "service:mcnulty,env:dev": 0.25, "service:postgres,env:dev": 0.5, "service:redis,env:prod": 0.75 }] tracer = get_dummy_tracer() tracer.configure(sampler=AllSampler(), priority_sampling=True) priority_sampler = tracer.priority_sampler for case in cases: priority_sampler.set_sample_rate_by_service(case) rates = {} for k, v in iteritems(priority_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, "%s != %s" % (case, rates) # It's important to also test in reverse mode for we want to make sure key deletion # works as well as key insertion (and doing this both ways ensures we trigger both cases) cases.reverse() for case in cases: priority_sampler.set_sample_rate_by_service(case) rates = {} for k, v in iteritems(priority_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, "%s != %s" % (case, rates)
def test_parse_response_json(self, log): tracer = get_dummy_tracer() tracer.debug_logging = True test_cases = {'OK': {'js': None, 'log': "please make sure trace-agent is up to date"}, 'OK\n': {'js': None, 'log': "please make sure trace-agent is up to date"}, 'error:unsupported-endpoint': {'js': None, 'log': "unable to load JSON 'error:unsupported-endpoint'"}, 42: {'js': None, 'log': "unable to load JSON '42'"}, # int as key to trigger TypeError '{}': {'js': {}}, '[]': {'js': []}, '{"rate_by_service": {"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}': {'js': {"rate_by_service": {"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}}, ' [4,2,1] ': {'js': [4,2,1]}} for k,v in iteritems(test_cases): r = ResponseMock(k) js =_parse_response_json(r) eq_(v['js'], js) if 'log' in v: ok_(1<=len(log.call_args_list), "not enough elements in call_args_list: %s" % log.call_args_list) print(log.call_args_list) l = log.call_args_list[-1][0][0] ok_(v['log'] in l, "unable to find %s in %s" % (v['log'], l))
def test_parse_response_json(self, log): tracer = get_dummy_tracer() tracer.debug_logging = True test_cases = { 'OK': dict( js=None, log= 'Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date', ), 'OK\n': dict( js=None, log= 'Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date', ), 'error:unsupported-endpoint': dict( js=None, log= 'Unable to parse Datadog Agent JSON response: .*? \'error:unsupported-endpoint\'', ), 42: dict( # int as key to trigger TypeError js=None, log='Unable to parse Datadog Agent JSON response: .*? 42', ), '{}': dict(js={}), '[]': dict(js=[]), # Priority sampling "rate_by_service" response ('{"rate_by_service": ' '{"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}'): dict(js=dict(rate_by_service={ 'service:,env:': 0.5, 'service:mcnulty,env:test': 0.9, 'service:postgres,env:test': 0.6, }, ), ), ' [4,2,1] ': dict(js=[4, 2, 1]), } for k, v in iteritems(test_cases): log.reset_mock() r = Response.from_http_response(ResponseMock(k)) js = r.get_json() assert v['js'] == js if 'log' in v: log.assert_called_once() msg = log.call_args[0][0] % log.call_args[0][1:] assert re.match(v['log'], msg), msg
def test_parse_response_json(self, log): tracer = get_dummy_tracer() tracer.debug_logging = True test_cases = { 'OK': { 'js': None, 'log': "please make sure trace-agent is up to date" }, 'OK\n': { 'js': None, 'log': "please make sure trace-agent is up to date" }, 'error:unsupported-endpoint': { 'js': None, 'log': "unable to load JSON 'error:unsupported-endpoint'" }, 42: { 'js': None, 'log': "unable to load JSON '42'" }, # int as key to trigger TypeError '{}': { 'js': {} }, '[]': { 'js': [] }, '{"rate_by_service": {"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}': { 'js': { "rate_by_service": { "service:,env:": 0.5, "service:mcnulty,env:test": 0.9, "service:postgres,env:test": 0.6 } } }, ' [4,2,1] ': { 'js': [4, 2, 1] } } for k, v in iteritems(test_cases): r = ResponseMock(k) js = _parse_response_json(r) eq_(v['js'], js) if 'log' in v: ok_( 1 <= len(log.call_args_list), "not enough elements in call_args_list: %s" % log.call_args_list) print(log.call_args_list) l = log.call_args_list[-1][0][0] ok_(v['log'] in l, "unable to find %s in %s" % (v['log'], l))
def test_parse_response_json(self, log): test_cases = { "OK": dict( js=None, log= "Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date", ), "OK\n": dict( js=None, log= "Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date", ), "error:unsupported-endpoint": dict( js=None, log= "Unable to parse Datadog Agent JSON response: 'error:unsupported-endpoint'", ), 42: dict( # int as key to trigger TypeError js=None, log="Unable to parse Datadog Agent JSON response: 42", ), "{}": dict(js={}), "[]": dict(js=[]), # Priority sampling "rate_by_service" response ('{"rate_by_service": ' '{"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}'): dict(js=dict(rate_by_service={ "service:,env:": 0.5, "service:mcnulty,env:test": 0.9, "service:postgres,env:test": 0.6, }, ), ), " [4,2,1] ": dict(js=[4, 2, 1]), } for k, v in iteritems(test_cases): log.reset_mock() r = Response.from_http_response(ResponseMock(k)) js = r.get_json() assert v["js"] == js if "log" in v: log.assert_called_once() msg = log.call_args[0][0] % log.call_args[0][1:] assert re.match(v["log"], msg), msg
def test_datadog_sampler_update_rate_by_service_sample_rates(dummy_tracer): cases = [ { "service:,env:": 1, }, { "service:,env:": 1, "service:mcnulty,env:dev": 0.33, "service:postgres,env:dev": 0.7, }, { "service:,env:": 1, "service:mcnulty,env:dev": 0.25, "service:postgres,env:dev": 0.5, "service:redis,env:prod": 0.75, }, ] # By default sampler sets it's default sampler to RateByServiceSampler sampler = DatadogSampler() for case in cases: sampler.update_rate_by_service_sample_rates(case) rates = {} for k, v in iteritems(sampler.default_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, "%s != %s" % (case, rates) # It's important to also test in reverse mode for we want to make sure key deletion # works as well as key insertion (and doing this both ways ensures we trigger both cases) cases.reverse() for case in cases: sampler.update_rate_by_service_sample_rates(case) rates = {} for k, v in iteritems(sampler.default_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, "%s != %s" % (case, rates)
def test_update_rate_by_service_sample_rates(self): cases = [ { 'service:,env:': 1, }, { 'service:,env:': 1, 'service:mcnulty,env:dev': 0.33, 'service:postgres,env:dev': 0.7, }, { 'service:,env:': 1, 'service:mcnulty,env:dev': 0.25, 'service:postgres,env:dev': 0.5, 'service:redis,env:prod': 0.75, }, ] tracer = get_dummy_tracer() tracer.configure(sampler=AllSampler()) priority_sampler = tracer.priority_sampler for case in cases: priority_sampler.update_rate_by_service_sample_rates(case) rates = {} for k, v in iteritems(priority_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, '%s != %s' % (case, rates) # It's important to also test in reverse mode for we want to make sure key deletion # works as well as key insertion (and doing this both ways ensures we trigger both cases) cases.reverse() for case in cases: priority_sampler.update_rate_by_service_sample_rates(case) rates = {} for k, v in iteritems(priority_sampler._by_service_samplers): rates[k] = v.sample_rate assert case == rates, '%s != %s' % (case, rates)