def test_tracer_with_env(): t = ddtrace.Tracer() # With global `config.env` defined with override_global_config(dict(env="prod")): with t.trace("test.span") as span: assert span.get_tag(ENV_KEY) == "prod" # override manually span.set_tag(ENV_KEY, "prod-staging") assert span.get_tag(ENV_KEY) == "prod-staging" # With no `config.env` defined with t.trace("test.span") as span: assert span.get_tag(ENV_KEY) is None # explicitly set in the span span.set_tag(ENV_KEY, "prod-staging") assert span.get_tag(ENV_KEY) == "prod-staging" # With global tags set t.set_tags({ENV_KEY: "tags.env"}) with override_global_config(dict(env="config.env")): with t.trace("test.span") as span: assert span.get_tag(ENV_KEY) == "config.env"
def test_tracer_with_version(): t = ddtrace.Tracer() # With global `config.version` defined with override_global_config(dict(version="1.2.3")): with t.trace("test.span") as span: assert span.get_tag(VERSION_KEY) == "1.2.3" # override manually span.set_tag(VERSION_KEY, "4.5.6") assert span.get_tag(VERSION_KEY) == "4.5.6" # With no `config.version` defined with t.trace("test.span") as span: assert span.get_tag(VERSION_KEY) is None # explicitly set in the span span.set_tag(VERSION_KEY, "1.2.3") assert span.get_tag(VERSION_KEY) == "1.2.3" # With global tags set t.set_tags({VERSION_KEY: "tags.version"}) with override_global_config(dict(version="config.version")): with t.trace("test.span") as span: assert span.get_tag(VERSION_KEY) == "config.version"
def test_metrics(): with override_global_config(dict(health_metrics_enabled=True)): t = Tracer() statsd_mock = mock.Mock() t.writer.dogstatsd = statsd_mock assert t.writer._report_metrics with mock.patch("ddtrace.internal.writer.log") as log: for _ in range(5): spans = [] for i in range(3000): spans.append(t.trace("op")) for s in spans: s.finish() t.shutdown() log.warning.assert_not_called() log.error.assert_not_called() statsd_mock.distribution.assert_has_calls( [ mock.call("datadog.tracer.buffer.accepted.traces", 5, tags=[]), mock.call( "datadog.tracer.buffer.accepted.spans", 15000, tags=[]), mock.call("datadog.tracer.http.requests", 1, tags=[]), mock.call("datadog.tracer.http.sent.bytes", AnyInt()), ], any_order=True, )
def test_custom_logging_injection_no_span(self): """Ensure custom log injection via get_correlation_log_record with no active span returns empty record.""" capture_log = structlog.testing.LogCapture() structlog.configure(processors=[ tracer_injection, capture_log, structlog.processors.JSONRenderer() ]) logger = structlog.get_logger() with override_global_config( dict(version="global-version", env="global-env", service="global-service")): logger.msg("No Span!") assert len(capture_log.entries) == 1 assert capture_log.entries[0]["event"] == "No Span!" dd_log_record = capture_log.entries[0]["dd"] assert dd_log_record == { "span_id": "0", "trace_id": "0", "service": "global-service", "env": "global-env", "version": "global-version", }
def test_custom_logging_injection_global_config(self): """Ensure custom log injection via get_correlation_log_record returns proper tracer information.""" capture_log = structlog.testing.LogCapture() structlog.configure(processors=[ tracer_injection, capture_log, structlog.processors.JSONRenderer() ]) logger = structlog.get_logger() with override_global_config( dict(version="global-version", env="global-env", service="global-service")): with tracer.trace("test span") as span: logger.msg("Hello!") assert len(capture_log.entries) == 1 assert capture_log.entries[0]["event"] == "Hello!" dd_log_record = capture_log.entries[0]["dd"] assert dd_log_record == { "span_id": str(span.span_id), "trace_id": str(span.trace_id), "service": "global-service", "env": "global-env", "version": "global-version", }
def test_unicode_config_vals(): t = ddtrace.Tracer() with override_global_config(dict(version=u"😇", env=u"😇")): with t.trace("1"): pass t.shutdown()
def test_span_nonstring_set_str_tag_warning(span_log): with override_global_config(dict(_raise=False)): span = Span(None, None) span._set_str_tag("foo", dict(a=1)) span_log.warning.assert_called_once_with( "Failed to set text tag '%s'", "foo", exc_info=True, )
def test_enable_bad_rules(rule, exc, tracer): with override_env(dict(DD_APPSEC_RULES=rule)): with pytest.raises(exc): _enable_appsec(tracer) # by default enable must not crash but display errors in the logs with override_global_config(dict(_raise=False)): with override_env(dict(DD_APPSEC_RULES=rule)): _enable_appsec(tracer)
def test_int_service_integration(int_config): pin = Pin() tracer = Tracer() assert trace_utils.int_service(pin, int_config.myint) is None with override_global_config(dict(service="global-svc")): assert trace_utils.int_service(pin, int_config.myint) is None with tracer.trace("something", service=trace_utils.int_service(pin, int_config.myint)) as s: assert s.service == "global-svc"
def test_get_report_hostname_default(get_hostname, tracer, test_spans): get_hostname.return_value = "test-hostname" with override_global_config(dict(report_hostname=False)): with tracer.trace("span"): with tracer.trace("child"): pass spans = test_spans.pop() root = spans[0] child = spans[1] assert root.get_tag(HOSTNAME_KEY) is None assert child.get_tag(HOSTNAME_KEY) is None
async def test_user_specified_service(tracer): """ When a service name is specified by the user The aiobotocore integration should use it as the service name """ with override_global_config(dict(service="mysvc")): # Repatch to take config into account unpatch() patch() with aiobotocore_client("ec2", tracer) as ec2: await ec2.describe_instances() traces = tracer.pop_traces() assert len(traces) == 1 assert len(traces[0]) == 1 span = traces[0][0] assert span.service == "mysvc"
async def test_user_specified_service(tracer, aiohttp_client, loop): """ When a service name is specified by the user The aiohttp integration should use it as the service name """ unpatch() with override_global_config(dict(service="mysvc")): patch() app = setup_app() trace_app(app, tracer) Pin.override(aiohttp_jinja2, tracer=tracer) client = await aiohttp_client(app) request = await client.request("GET", "/template/") await request.text() traces = tracer.pop_traces() assert 1 == len(traces) assert 2 == len(traces[0]) request_span = traces[0][0] assert request_span.service == "mysvc" template_span = traces[0][1] assert template_span.service == "mysvc"