diff --git a/ddtrace/_trace/trace_handlers.py b/ddtrace/_trace/trace_handlers.py index 0ec66f8e9aa..5ceab330850 100644 --- a/ddtrace/_trace/trace_handlers.py +++ b/ddtrace/_trace/trace_handlers.py @@ -5,6 +5,7 @@ from typing import Callable from typing import Dict from typing import List +from typing import Mapping from typing import Optional from typing import Tuple from urllib import parse @@ -24,14 +25,20 @@ from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils from ddtrace.contrib.internal.botocore.constants import BOTOCORE_STEPFUNCTIONS_INPUT_KEY + +# from ddtrace.internal.utils import _copy_trace_level_tags +from ddtrace.contrib.internal.trace_utils import _copy_trace_level_tags from ddtrace.contrib.internal.trace_utils import _set_url_tag from ddtrace.ext import SpanKind +from ddtrace.ext import SpanLinkKind from ddtrace.ext import azure_servicebus as azure_servicebusx from ddtrace.ext import db from ddtrace.ext import http from ddtrace.ext import net from ddtrace.ext import redis as redisx +from ddtrace.ext import websocket from ddtrace.internal import core +from ddtrace.internal.compat import is_valid_ip from ddtrace.internal.compat import maybe_stringify from ddtrace.internal.constants import COMPONENT from ddtrace.internal.constants import FLASK_ENDPOINT @@ -42,7 +49,9 @@ from ddtrace.internal.constants import MESSAGING_MESSAGE_ID from ddtrace.internal.constants import MESSAGING_OPERATION from ddtrace.internal.constants import MESSAGING_SYSTEM +from ddtrace.internal.constants import SPAN_LINK_KIND from ddtrace.internal.logger import get_logger +from ddtrace.internal.sampling import _inherit_sampling_tags from ddtrace.internal.schema.span_attribute_schema import SpanDirection from ddtrace.propagation.http import HTTPPropagator @@ -131,7 +140,7 @@ def _start_span(ctx: core.ExecutionContext, call_trace: bool = True, **kwargs) - if config._inferred_proxy_services_enabled: # dispatch event for checking headers and possibly making an inferred proxy span - core.dispatch("inferred_proxy.start", (ctx, tracer, span_kwargs, call_trace, integration_config)) + core.dispatch("inferred_proxy.start", (ctx, tracer, span_kwargs, call_trace)) # re-get span_kwargs in case an inferred span was created and we have a new span_kwargs.child_of field span_kwargs = ctx.get_item("span_kwargs", span_kwargs) @@ -237,7 +246,7 @@ def _set_inferred_proxy_tags(span, status_code): inferred_span.set_tag(ERROR_STACK, span.get_tag(ERROR_STACK)) -def _on_inferred_proxy_start(ctx, tracer, span_kwargs, call_trace, integration_config): +def _on_inferred_proxy_start(ctx, tracer, span_kwargs, call_trace): # Skip creating another inferred span if one has already been created for this request if ctx.get_item("inferred_proxy_span"): return @@ -245,6 +254,7 @@ def _on_inferred_proxy_start(ctx, tracer, span_kwargs, call_trace, integration_c # some integrations like Flask / WSGI store headers from environ in 'distributed_headers' # and normalized headers in 'headers' headers = ctx.get_item("headers", ctx.get_item("distributed_headers", None)) + integration_config = ctx.get_item("integration_config") # Inferred Proxy Spans if integration_config and headers is not None: @@ -956,6 +966,168 @@ def _on_router_match(route): req_span.set_tag_str(http.ROUTE, route.template) +def _set_websocket_message_tags_on_span(websocket_span: Span, message: Mapping[str, Any]): + if "text" in message: + websocket_span.set_tag_str(websocket.MESSAGE_TYPE, "text") + websocket_span.set_metric(websocket.MESSAGE_LENGTH, len(message["text"].encode("utf-8"))) + elif "binary" in message: + websocket_span.set_tag_str(websocket.MESSAGE_TYPE, "binary") + websocket_span.set_metric(websocket.MESSAGE_LENGTH, len(message["bytes"])) + + +def _set_websocket_close_tags(span: Span, message: Mapping[str, Any]): + code = message.get("code") + reason = message.get("reason") + if code is not None: + span.set_metric(websocket.CLOSE_CODE, code) + if reason: + span.set_tag(websocket.CLOSE_REASON, reason) + + +def _set_client_ip_tags(scope: Mapping[str, Any], span: Span): + client = scope.get("client") + if len(client) >= 1: # type: ignore[arg-type] + client_ip = client[0] # type: ignore[index] + span.set_tag_str(net.TARGET_HOST, client_ip) + try: + is_valid_ip(client_ip) + span.set_tag_str("network.client.ip", client_ip) + except ValueError as e: + log.debug("Could not validate client IP address for websocket send message: %s", str(e)) + + +def _on_asgi_websocket_receive_message(ctx, scope, message): + """ + Handle websocket receive message events. + + This handler is called when a websocket receive message event is dispatched. + It sets up the span with appropriate tags, metrics, and links. + """ + span = ctx.span + integration_config = ctx.get_item("integration_config") + + span.set_tag_str(COMPONENT, integration_config.integration_name) + span.set_tag_str(SPAN_KIND, SpanKind.CONSUMER) + span.set_tag_str(websocket.RECEIVE_DURATION_TYPE, "blocking") + + _set_websocket_message_tags_on_span(span, message) + + span.set_metric(websocket.MESSAGE_FRAMES, 1) + + if hasattr(ctx, "parent") and ctx.parent.span: + span.set_link( + trace_id=ctx.parent.span.trace_id, + span_id=ctx.parent.span.span_id, + attributes={SPAN_LINK_KIND: SpanLinkKind.EXECUTED}, + ) + + if getattr(integration_config, "asgi_websocket_messages_inherit_sampling", True): + _inherit_sampling_tags(span, ctx.parent.span._local_root) + + _copy_trace_level_tags(span, ctx.parent.span) + + +def _on_asgi_websocket_send_message(ctx, scope, message): + """ + Handle websocket send message events. + + This handler is called when a websocket send message event is dispatched. + It sets up the span with appropriate tags, metrics, and links. + """ + span = ctx.span + integration_config = ctx.get_item("integration_config") + + span.set_tag_str(COMPONENT, integration_config.integration_name) + span.set_tag_str(SPAN_KIND, SpanKind.PRODUCER) + _set_client_ip_tags(scope, span) + _set_websocket_message_tags_on_span(span, message) + + span.set_metric(websocket.MESSAGE_FRAMES, 1) + + if hasattr(ctx, "parent") and ctx.parent.span: + span.set_link( + trace_id=ctx.parent.span.trace_id, + span_id=ctx.parent.span.span_id, + attributes={SPAN_LINK_KIND: SpanLinkKind.RESUMING}, + ) + + +def _on_asgi_websocket_close_message(ctx, scope, message): + """ + Handle websocket close message events. + + This handler is called when a websocket close message event is dispatched. + It sets up the span with appropriate tags, metrics, and links. + """ + span = ctx.span + integration_config = ctx.get_item("integration_config") + + span.set_tag_str(COMPONENT, integration_config.integration_name) + span.set_tag_str(SPAN_KIND, SpanKind.PRODUCER) + + _set_client_ip_tags(scope, span) + + _set_websocket_message_tags_on_span(span, message) + + _set_websocket_close_tags(span, message) + + if hasattr(ctx, "parent") and ctx.parent.span: + span.set_link( + trace_id=ctx.parent.span.trace_id, + span_id=ctx.parent.span.span_id, + attributes={SPAN_LINK_KIND: SpanLinkKind.RESUMING}, + ) + + _copy_trace_level_tags(span, ctx.parent.span) + + +def _on_asgi_websocket_disconnect_message(ctx, scope, message): + """ + Handle websocket disconnect message events. + + This handler is called when a websocket disconnect message event is dispatched. + It sets up the span with appropriate tags, metrics, and links. + """ + span = ctx.span + integration_config = ctx.get_item("integration_config") + + span.set_tag_str(COMPONENT, integration_config.integration_name) + span.set_tag_str(SPAN_KIND, SpanKind.CONSUMER) + + _set_websocket_close_tags(span, message) + + if hasattr(ctx, "parent") and ctx.parent.span: + span.set_link( + trace_id=ctx.parent_span.trace_id, + span_id=ctx.parent_span.span_id, + attributes={SPAN_LINK_KIND: SpanLinkKind.EXECUTED}, + ) + + if getattr(integration_config, "asgi_websocket_messages_inherit_sampling", True): + _inherit_sampling_tags(span, ctx.parent.span._local_root) + + _copy_trace_level_tags(span, ctx.parent.span) + + +def _on_asgi_request(ctx: core.ExecutionContext) -> None: + """Handler for ASGI request context started event.""" + scope = ctx.get_item("scope") + integration_config = ctx.get_item("integration_config") + + ctx.set_item("tags", {COMPONENT: integration_config.integration_name, SPAN_KIND: SpanKind.SERVER}) + + span = _start_span(ctx) + ctx.set_item("req_span", span) + + if scope["type"] == "websocket": + span.set_tag_str("http.upgraded", "websocket") + + if "datadog" not in scope: + scope["datadog"] = {"request_spans": [span]} + else: + scope["datadog"]["request_spans"].append(span) + + def listen(): core.on("wsgi.request.prepare", _on_request_prepare) core.on("wsgi.request.prepared", _on_request_prepared) @@ -1009,6 +1181,11 @@ def listen(): core.on("azure.functions.start_response", _on_azure_functions_start_response) core.on("azure.functions.trigger_call_modifier", _on_azure_functions_trigger_span_modifier) core.on("azure.functions.service_bus_trigger_modifier", _on_azure_functions_service_bus_trigger_span_modifier) + core.on("asgi.websocket.receive.message", _on_asgi_websocket_receive_message) + core.on("asgi.websocket.send.message", _on_asgi_websocket_send_message) + core.on("asgi.websocket.disconnect.message", _on_asgi_websocket_disconnect_message) + core.on("asgi.websocket.close.message", _on_asgi_websocket_close_message) + core.on("context.started.asgi.request", _on_asgi_request) core.on("azure.servicebus.message_modifier", _on_azure_servicebus_message_modifier) # web frameworks general handlers @@ -1042,11 +1219,10 @@ def listen(): "flask.call", "flask.jsonify", "flask.render_template", - "asgi.__call__", - "asgi.websocket.close_message", - "asgi.websocket.disconnect_message", - "asgi.websocket.receive_message", - "asgi.websocket.send_message", + "asgi.websocket.close.message", + "asgi.websocket.disconnect.message", + "asgi.websocket.receive.message", + "asgi.websocket.send.message", "wsgi.__call__", "django.cache", "django.middleware.__call__", @@ -1086,6 +1262,10 @@ def listen(): core.on(f"context.started.{context_name}", _start_span) for name in ( + "asgi.websocket.close.message", + "asgi.websocket.disconnect.message", + "asgi.websocket.receive.message", + "asgi.websocket.send.message", "django.middleware.__call__", "django.middleware.func", "django.middleware.process_exception", diff --git a/ddtrace/contrib/internal/asgi/middleware.py b/ddtrace/contrib/internal/asgi/middleware.py index f8edcb1cfce..33647ff3852 100644 --- a/ddtrace/contrib/internal/asgi/middleware.py +++ b/ddtrace/contrib/internal/asgi/middleware.py @@ -13,22 +13,14 @@ from ddtrace.constants import SPAN_KIND from ddtrace.contrib import trace_utils from ddtrace.contrib.internal.asgi.utils import guarantee_single_callable -from ddtrace.contrib.internal.trace_utils import _copy_trace_level_tags from ddtrace.ext import SpanKind -from ddtrace.ext import SpanLinkKind from ddtrace.ext import SpanTypes from ddtrace.ext import http -from ddtrace.ext import websocket -from ddtrace.ext.net import TARGET_HOST from ddtrace.internal import core from ddtrace.internal._exceptions import BlockingException from ddtrace.internal._exceptions import find_exception from ddtrace.internal.compat import is_valid_ip from ddtrace.internal.constants import COMPONENT -from ddtrace.internal.constants import SAMPLING_DECISION_MAKER_INHERITED -from ddtrace.internal.constants import SAMPLING_DECISION_MAKER_RESOURCE -from ddtrace.internal.constants import SAMPLING_DECISION_MAKER_SERVICE -from ddtrace.internal.constants import SPAN_LINK_KIND from ddtrace.internal.logger import get_logger from ddtrace.internal.schema import schematize_url_operation from ddtrace.internal.schema.span_attribute_schema import SpanDirection @@ -142,42 +134,6 @@ def _parse_response_cookies(response_headers: Mapping[str, str]) -> Mapping[str, return cookies -def _inherit_sampling_tags(span: Span, source: Span): - span.set_metric(SAMPLING_DECISION_MAKER_INHERITED, 1) - span.set_tag_str(SAMPLING_DECISION_MAKER_SERVICE, source.service) - span.set_tag_str(SAMPLING_DECISION_MAKER_RESOURCE, source.resource) - - -def _set_message_tags_on_span(websocket_span: Span, message: Mapping[str, Any]): - if "text" in message: - websocket_span.set_tag_str(websocket.MESSAGE_TYPE, "text") - websocket_span.set_metric(websocket.MESSAGE_LENGTH, len(message["text"].encode("utf-8"))) - elif "binary" in message: - websocket_span.set_tag_str(websocket.MESSAGE_TYPE, "binary") - websocket_span.set_metric(websocket.MESSAGE_LENGTH, len(message["bytes"])) - - -def _set_client_ip_tags(scope: Mapping[str, Any], span: Span): - client = scope.get("client") - if len(client) >= 1: - client_ip = client[0] - span.set_tag_str(TARGET_HOST, client_ip) - try: - is_valid_ip(client_ip) - span.set_tag_str("network.client.ip", client_ip) - except ValueError as e: - log.debug("Could not validate client IP address for websocket send message: %s", str(e)) - - -def _set_websocket_close_tags(span: Span, message: Mapping[str, Any]): - code = message.get("code") - reason = message.get("reason") - if code is not None: - span._metrics[websocket.CLOSE_CODE] = int(code) - if reason: - span.set_tag_str(websocket.CLOSE_REASON, reason) - - def _cleanup_previous_receive(scope: Mapping[str, Any]): current_receive_span = scope.get("datadog", {}).get("current_receive_span") if current_receive_span: @@ -254,7 +210,7 @@ async def __call__(self, scope: Mapping[str, Any], receive: Callable, send: Call operation_name = schematize_url_operation(operation_name, direction=SpanDirection.INBOUND, protocol="http") with core.context_with_data( - "asgi.__call__", + "asgi.request", remote_addr=scope.get("REMOTE_ADDR"), headers=headers, headers_case_sensitive=True, @@ -265,22 +221,10 @@ async def __call__(self, scope: Mapping[str, Any], receive: Callable, send: Call span_type=SpanTypes.WEB, service=trace_utils.int_service(None, self.integration_config), distributed_headers=headers, - integration_config=config.asgi, activate_distributed_headers=True, + scope=scope, + integration_config=self.integration_config, ) as ctx, ctx.span as span: - span.set_tag_str(COMPONENT, self.integration_config.integration_name) - ctx.set_item("req_span", span) - - span.set_tag_str(SPAN_KIND, SpanKind.SERVER) - - if scope["type"] == "websocket": - span.set_tag_str("http.upgraded", "websocket") - - if "datadog" not in scope: - scope["datadog"] = {"request_spans": [span]} - else: - scope["datadog"]["request_spans"].append(span) - if self.span_modifier: self.span_modifier(span, scope) @@ -369,7 +313,7 @@ async def wrapped_receive(): current_receive_span = scope.get("datadog", {}).get("current_receive_span") with core.context_with_data( - "asgi.websocket.receive_message", + "asgi.websocket.receive.message", tracer=self.tracer, integration_config=self.integration_config, span_name="websocket.receive", @@ -389,7 +333,7 @@ async def wrapped_receive(): message = await receive() if scope["type"] == "websocket" and message["type"] == "websocket.receive": - self._handle_websocket_receive_message(scope, message, recv_span, span) + self._handle_websocket_receive_message(ctx, scope, message, recv_span, span) elif message["type"] == "websocket.disconnect": self._handle_websocket_disconnect_message(scope, message, span) @@ -538,7 +482,7 @@ def _handle_websocket_send_message(self, scope: Mapping[str, Any], message: Mapp parent_span = request_span with core.context_with_data( - "asgi.websocket.send_message", + "asgi.websocket.send.message", tracer=self.tracer, integration_config=self.integration_config, span_name="websocket.send", @@ -549,18 +493,8 @@ def _handle_websocket_send_message(self, scope: Mapping[str, Any], message: Mapp call_trace=False, activate=True, tags={COMPONENT: self.integration_config.integration_name, SPAN_KIND: SpanKind.PRODUCER}, - ) as ctx, ctx.span as send_span: - # Propagate context from the handshake span (baggage, origin, sampling decision) - # set tags related to peer.hostname - _set_client_ip_tags(scope, send_span) - - send_span.set_link( - trace_id=request_span.trace_id, - span_id=request_span.span_id, - attributes={SPAN_LINK_KIND: SpanLinkKind.RESUMING}, - ) - send_span.set_metric(websocket.MESSAGE_FRAMES, 1) # PERF: avoid setting via Span.set_metric - _set_message_tags_on_span(send_span, message) + ) as ctx: # noqa: F841 + core.dispatch("asgi.websocket.send.message", (ctx, scope, message)) def _handle_websocket_close_message(self, scope: Mapping[str, Any], message: Mapping[str, Any], request_span: Span): current_receive_span = scope.get("datadog", {}).get("current_receive_span") @@ -572,7 +506,7 @@ def _handle_websocket_close_message(self, scope: Mapping[str, Any], message: Map parent_span = request_span with core.context_with_data( - "asgi.websocket.close_message", + "asgi.websocket.close.message", tracer=self.tracer, integration_config=self.integration_config, span_name="websocket.close", @@ -582,19 +516,8 @@ def _handle_websocket_close_message(self, scope: Mapping[str, Any], message: Map call_trace=False, activate=True, tags={COMPONENT: self.integration_config.integration_name, SPAN_KIND: SpanKind.PRODUCER}, - ) as ctx, ctx.span as close_span: - _set_client_ip_tags(scope, close_span) - - _set_message_tags_on_span(close_span, message) - # should act like send span (outgoing message) case - close_span.set_link( - trace_id=request_span.trace_id, - span_id=request_span.span_id, - attributes={SPAN_LINK_KIND: SpanLinkKind.RESUMING}, - ) - _copy_trace_level_tags(close_span, request_span) - - _set_websocket_close_tags(close_span, message) + ) as ctx: # noqa: F841 + core.dispatch("asgi.websocket.close.message", (ctx, scope, message)) _cleanup_previous_receive(scope) @@ -622,26 +545,15 @@ def _handle_http_response( core.dispatch("asgi.start_response", ("asgi",)) def _handle_websocket_receive_message( - self, scope: Mapping[str, Any], message: Mapping[str, Any], recv_span: Span, request_span: Span + self, + ctx: core.ExecutionContext, + scope: Mapping[str, Any], + message: Mapping[str, Any], + recv_span: Span, + request_span: Span, ): - recv_span.set_tag_str(COMPONENT, self.integration_config.integration_name) - recv_span.set_tag_str(SPAN_KIND, SpanKind.CONSUMER) - recv_span.set_tag_str(websocket.RECEIVE_DURATION_TYPE, "blocking") - - _set_message_tags_on_span(recv_span, message) - - recv_span.set_metric(websocket.MESSAGE_FRAMES, 1) - - recv_span.set_link( - trace_id=request_span.trace_id, - span_id=request_span.span_id, - attributes={SPAN_LINK_KIND: SpanLinkKind.EXECUTED}, - ) - - if self.integration_config.asgi_websocket_messages_inherit_sampling: - _inherit_sampling_tags(recv_span, request_span._local_root) - - _copy_trace_level_tags(recv_span, request_span) + _cleanup_previous_receive(scope) + core.dispatch("asgi.websocket.receive.message", (ctx, scope, message)) scope["datadog"]["current_receive_span"] = recv_span @@ -652,7 +564,7 @@ def _handle_websocket_disconnect_message( # Create the span when the handler is invoked (when receive() is called) with core.context_with_data( - "asgi.websocket.disconnect_message", + "asgi.websocket.disconnect.message", tracer=self.tracer, integration_config=self.integration_config, span_name="websocket.close", @@ -663,15 +575,8 @@ def _handle_websocket_disconnect_message( call_trace=False, activate=True, tags={COMPONENT: self.integration_config.integration_name, SPAN_KIND: SpanKind.CONSUMER}, - ) as ctx, ctx.span as disconnect_span: - disconnect_span.set_link( - trace_id=request_span.trace_id, - span_id=request_span.span_id, - attributes={SPAN_LINK_KIND: SpanLinkKind.EXECUTED}, - ) - - if self.integration_config.asgi_websocket_messages_inherit_sampling: - _inherit_sampling_tags(disconnect_span, request_span._local_root) + ) as ctx: + core.dispatch("asgi.websocket.disconnect.message", (ctx, scope, message)) - _copy_trace_level_tags(disconnect_span, request_span) - _set_websocket_close_tags(disconnect_span, message) + if request_span and request_span.error == 0: + request_span.finish() diff --git a/ddtrace/internal/sampling.py b/ddtrace/internal/sampling.py index c5493365f7b..1fe27bd8f67 100644 --- a/ddtrace/internal/sampling.py +++ b/ddtrace/internal/sampling.py @@ -16,6 +16,9 @@ from ddtrace.internal.constants import _KEEP_PRIORITY_INDEX from ddtrace.internal.constants import _REJECT_PRIORITY_INDEX from ddtrace.internal.constants import MAX_UINT_64BITS +from ddtrace.internal.constants import SAMPLING_DECISION_MAKER_INHERITED +from ddtrace.internal.constants import SAMPLING_DECISION_MAKER_RESOURCE +from ddtrace.internal.constants import SAMPLING_DECISION_MAKER_SERVICE from ddtrace.internal.constants import SAMPLING_DECISION_TRACE_TAG_KEY from ddtrace.internal.constants import SAMPLING_HASH_MODULO from ddtrace.internal.constants import SAMPLING_KNUTH_FACTOR @@ -257,6 +260,13 @@ def _set_sampling_tags(span: Span, sampled: bool, sample_rate: float, mechanism: span.context.sampling_priority = priorities[priority_index] +def _inherit_sampling_tags(target: Span, source: Span): + """Set sampling tags from source span on target span.""" + target.set_metric(SAMPLING_DECISION_MAKER_INHERITED, 1) + target.set_tag_str(SAMPLING_DECISION_MAKER_SERVICE, source.service) # type: ignore[arg-type] + target.set_tag_str(SAMPLING_DECISION_MAKER_RESOURCE, source.resource) + + def _get_highest_precedence_rule_matching(span: Span, rules: List[SamplingRule]) -> Optional[SamplingRule]: if not rules: return None diff --git a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_long_running_websocket_session.json b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_long_running_websocket_session.json index 2a68acce52b..97f2c1459ab 100644 --- a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_long_running_websocket_session.json +++ b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_long_running_websocket_session.json @@ -13,11 +13,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d700000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c46900000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -27,12 +27,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223, + "process_id": 34277, "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 1000615000, - "start": 1755796439554078000 + "duration": 1005209000, + "start": 1758643305014981000 }, { "name": "websocket.send", @@ -45,19 +45,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46900000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 3 }, - "duration": 70000, - "start": 1755796440554476000 + "duration": 69000, + "start": 1758643306020383000 }, { "name": "websocket.close", @@ -71,17 +75,21 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46900000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.close.code": 1000 }, - "duration": 46000, - "start": 1755796440554632000 + "duration": 64000, + "start": 1758643306020590000 }], [ { @@ -98,11 +106,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d600000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c46800000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -112,12 +120,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223, + "process_id": 34277, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 1005626000, - "start": 1755796438548472000 + "duration": 1005194000, + "start": 1758643304009420000 }, { "name": "websocket.send", @@ -130,19 +138,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46800000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 77000, - "start": 1755796439553922000 + "duration": 65000, + "start": 1758643305014793000 }], [ { @@ -159,11 +171,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d500000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c46700000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -173,12 +185,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223, + "process_id": 34277, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 1005539000, - "start": 1755796437542954000 + "duration": 1005222000, + "start": 1758643303003761000 }, { "name": "websocket.send", @@ -191,19 +203,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46700000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 60000, - "start": 1755796438548348000 + "duration": 76000, + "start": 1758643304009201000 }], [ { @@ -220,11 +236,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d400000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c46400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -234,12 +250,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223, + "process_id": 34277, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 1002745000, - "start": 1755796436540237000 + "duration": 1004006000, + "start": 1758643300993486000 }, { "name": "websocket.send", @@ -252,19 +268,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 118000, - "start": 1755796437542761000 + "duration": 69000, + "start": 1758643301997669000 }], [ { @@ -278,65 +298,43 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", + "_dd.dm.resource": "websocket /ws", + "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d300000000", - "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7" - }, - "metrics": { - "_dd.top_level": 1, - "_dd.tracer_kr": 1.0, - "_sampling_priority_v1": 1, - "process_id": 47223 - }, - "duration": 25000, - "start": 1755796435539001000 - }], -[ - { - "name": "fastapi.request", - "service": "fastapi", - "resource": "websocket /ws", - "trace_id": 5, - "span_id": 1, - "parent_id": 0, - "type": "web", - "error": 0, - "meta": { - "_dd.base_service": "tests.contrib.fastapi", - "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d300000000", + "_dd.p.tid": "68d2c46500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", - "http.upgraded": "websocket", - "http.url": "ws://testserver/ws", - "http.useragent": "testclient", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", - "span.kind": "server" + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", + "span.kind": "consumer", + "websocket.duration.style": "blocking", + "websocket.message.type": "text" }, "metrics": { + "_dd.dm.inherited": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223 + "process_id": 34277, + "websocket.message.frames": 1, + "websocket.message.length": 6 }, - "duration": 491000, - "start": 1755796435538742000 + "duration": 1005447000, + "start": 1758643301997850000 }, { "name": "websocket.send", "service": "fastapi", "resource": "websocket /ws", - "trace_id": 5, + "trace_id": 4, "span_id": 2, "parent_id": 1, "type": "websocket", "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d300000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", "language": "python", "network.client.ip": "testclient", @@ -348,46 +346,67 @@ "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, "websocket.message.frames": 1, - "websocket.message.length": 27 + "websocket.message.length": 6 }, - "duration": 116000, - "start": 1755796435539350000 + "duration": 87000, + "start": 1758643303003524000 }], [ { "name": "websocket.receive", "service": "fastapi", "resource": "websocket /ws", - "trace_id": 6, + "trace_id": 5, "span_id": 1, "parent_id": 0, "type": "websocket", "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.dm.resource": "websocket /ws", - "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d300000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c46400000000", + "language": "python", + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804" + }, + "metrics": { + "_dd.top_level": 1, + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "process_id": 34277 + }, + "duration": 44000, + "start": 1758643300991865000 + }], +[ + { + "name": "fastapi.request", + "service": "fastapi", + "resource": "websocket /ws", + "trace_id": 6, + "span_id": 1, + "parent_id": 0, + "type": "web", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.fastapi", + "_dd.p.dm": "-0", + "_dd.p.tid": "68d2c46400000000", "component": "fastapi", + "http.upgraded": "websocket", + "http.url": "ws://testserver/ws", + "http.useragent": "testclient", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", - "span.kind": "consumer", - "websocket.duration.style": "blocking", - "websocket.message.type": "text" + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", + "span.kind": "server" }, "metrics": { - "_dd.dm.inherited": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223, - "websocket.message.frames": 1, - "websocket.message.length": 6 + "process_id": 34277 }, - "duration": 231000, - "start": 1755796435539612000 + "duration": 1013000, + "start": 1758643300991262000 }, { "name": "websocket.send", @@ -400,19 +419,24 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.dm": "-0", + "_dd.p.tid": "68d2c46400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, - "websocket.message.length": 6 + "websocket.message.length": 27 }, - "duration": 40000, - "start": 1755796435539734000 + "duration": 250000, + "start": 1758643300992404000 }], [ { @@ -429,11 +453,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a753d300000000", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c46400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "ccb007b181d142c48a0b80d4c40c13a7", + "runtime-id": "6b5b6fae964f4ddbab43c1e47e58f804", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -443,12 +467,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 47223, + "process_id": 34277, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 1000432000, - "start": 1755796435539826000 + "duration": 199000, + "start": 1758643300992965000 }, { "name": "websocket.send", @@ -461,17 +485,21 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a753d30000000001c2885aa57b05a7\", \"span_id\": \"c592b54e118a95d9\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c46400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c46400000000a6bbb4b90a355441\", \"span_id\": \"2709a47da0f51a03\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 6 }, - "duration": 57000, - "start": 1755796436540117000 + "duration": 71000, + "start": 1758643300993288000 }]] diff --git a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_traced_websocket.json b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_traced_websocket.json index d8f09f4bf4e..14494b5a00b 100644 --- a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_traced_websocket.json +++ b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_traced_websocket.json @@ -11,54 +11,49 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "688a904700000000", + "_dd.p.tid": "68d2c2bf00000000", "language": "python", - "runtime-id": "9a8e75d4441b48c4a3a38229edd8507b" + "runtime-id": "76b16d36f658466199d15473483553db" }, "metrics": { "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 9597 + "process_id": 31635 }, - "duration": 26000, - "start": 1753911367252906000 + "duration": 31000, + "start": 1758642879500820000 }], [ { - "name": "websocket.receive", + "name": "fastapi.request", "service": "fastapi", "resource": "websocket /ws", "trace_id": 1, "span_id": 1, "parent_id": 0, - "type": "websocket", + "type": "web", "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.dm.resource": "websocket /ws", - "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "688a904700000000", - "_dd.span_links": "[{\"trace_id\": \"688a904700000000b31ac8aa72700bbb\", \"span_id\": \"c4a32cc3739c543d\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c2bf00000000", "component": "fastapi", + "http.upgraded": "websocket", + "http.url": "ws://testserver/ws", + "http.useragent": "testclient", "language": "python", - "runtime-id": "9a8e75d4441b48c4a3a38229edd8507b", - "span.kind": "consumer", - "websocket.duration.style": "blocking", - "websocket.message.type": "text" + "runtime-id": "76b16d36f658466199d15473483553db", + "span.kind": "server" }, "metrics": { - "_dd.dm.inherited": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 9597, - "websocket.message.frames": 1, - "websocket.message.length": 7 + "process_id": 31635 }, - "duration": 282000, - "start": 1753911367253383000 + "duration": 806000, + "start": 1758642879500376000 }, { "name": "websocket.send", @@ -71,19 +66,24 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"688a904700000000b31ac8aa72700bbb\", \"span_id\": \"c4a32cc3739c543d\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.dm": "-0", + "_dd.p.tid": "68d2c2bf00000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c2bf00000000cd3afe02024e8d43\", \"span_id\": \"dd6de1f8d0012900\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, - "websocket.message.length": 12 + "websocket.message.length": 27 }, - "duration": 40000, - "start": 1753911367253512000 + "duration": 154000, + "start": 1758642879501315000 }], [ { @@ -100,11 +100,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "688a904700000000", - "_dd.span_links": "[{\"trace_id\": \"688a904700000000b31ac8aa72700bbb\", \"span_id\": \"c4a32cc3739c543d\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c2bf00000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c2bf00000000cd3afe02024e8d43\", \"span_id\": \"dd6de1f8d0012900\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "9a8e75d4441b48c4a3a38229edd8507b", + "runtime-id": "76b16d36f658466199d15473483553db", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -114,12 +114,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 9597, + "process_id": 31635, "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 394000, - "start": 1753911367253616000 + "duration": 128000, + "start": 1758642879501610000 }, { "name": "websocket.send", @@ -132,73 +132,59 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"688a904700000000b31ac8aa72700bbb\", \"span_id\": \"c4a32cc3739c543d\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c2bf00000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c2bf00000000cd3afe02024e8d43\", \"span_id\": \"dd6de1f8d0012900\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, - "websocket.message.length": 3 - }, - "duration": 34000, - "start": 1753911367253849000 - }, - { - "name": "websocket.close", - "service": "fastapi", - "resource": "websocket /ws", - "trace_id": 2, - "span_id": 3, - "parent_id": 1, - "type": "websocket", - "error": 0, - "meta": { - "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"688a904700000000b31ac8aa72700bbb\", \"span_id\": \"c4a32cc3739c543d\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", - "component": "fastapi", - "network.client.ip": "testclient", - "out.host": "testclient", - "span.kind": "producer" - }, - "metrics": { - "websocket.close.code": 1000 + "websocket.message.length": 12 }, - "duration": 34000, - "start": 1753911367253955000 + "duration": 54000, + "start": 1758642879501841000 }], [ { - "name": "fastapi.request", + "name": "websocket.receive", "service": "fastapi", "resource": "websocket /ws", "trace_id": 3, "span_id": 1, "parent_id": 0, - "type": "web", + "type": "websocket", "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", + "_dd.dm.resource": "websocket /ws", + "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "688a904700000000", + "_dd.p.tid": "68d2c2bf00000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c2bf00000000cd3afe02024e8d43\", \"span_id\": \"dd6de1f8d0012900\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", - "http.upgraded": "websocket", - "http.url": "ws://testserver/ws", - "http.useragent": "testclient", "language": "python", - "runtime-id": "9a8e75d4441b48c4a3a38229edd8507b", - "span.kind": "server" + "runtime-id": "76b16d36f658466199d15473483553db", + "span.kind": "consumer", + "websocket.duration.style": "blocking", + "websocket.message.type": "text" }, "metrics": { + "_dd.dm.inherited": 1, "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 9597 + "process_id": 31635, + "websocket.message.frames": 1, + "websocket.message.length": 7 }, - "duration": 1524000, - "start": 1753911367252620000 + "duration": 82000, + "start": 1758642879501993000 }, { "name": "websocket.send", @@ -211,17 +197,49 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"688a904700000000b31ac8aa72700bbb\", \"span_id\": \"c4a32cc3739c543d\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c2bf00000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c2bf00000000cd3afe02024e8d43\", \"span_id\": \"dd6de1f8d0012900\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, - "websocket.message.length": 27 + "websocket.message.length": 3 + }, + "duration": 45000, + "start": 1758642879502159000 + }, + { + "name": "websocket.close", + "service": "fastapi", + "resource": "websocket /ws", + "trace_id": 3, + "span_id": 3, + "parent_id": 1, + "type": "websocket", + "error": 0, + "meta": { + "_dd.base_service": "tests.contrib.fastapi", + "_dd.p.dm": "-0", + "_dd.p.tid": "68d2c2bf00000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c2bf00000000cd3afe02024e8d43\", \"span_id\": \"dd6de1f8d0012900\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "component": "fastapi", + "language": "python", + "network.client.ip": "testclient", + "out.host": "testclient", + "span.kind": "producer" + }, + "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, + "websocket.close.code": 1000 }, - "duration": 101000, - "start": 1753911367253204000 + "duration": 53000, + "start": 1758642879502302000 }]] diff --git a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_only_sends.json b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_only_sends.json index 765b423422a..bb2f5f20d87 100644 --- a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_only_sends.json +++ b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_only_sends.json @@ -11,18 +11,18 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", + "_dd.p.tid": "68d2c35400000000", "language": "python", - "runtime-id": "bf9e20ca46234560a24ecd981d6e068e" + "runtime-id": "eee0a9608532411ea71611fcc2b40c8e" }, "metrics": { "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 51661 + "process_id": 32412 }, - "duration": 28000, - "start": 1755797020763320000 + "duration": 38000, + "start": 1758643028392432000 }], [ { @@ -37,23 +37,23 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", + "_dd.p.tid": "68d2c35400000000", "component": "fastapi", "http.upgraded": "websocket", "http.url": "ws://testserver/ws", "http.useragent": "testclient", "language": "python", - "runtime-id": "bf9e20ca46234560a24ecd981d6e068e", + "runtime-id": "eee0a9608532411ea71611fcc2b40c8e", "span.kind": "server" }, "metrics": { "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 51661 + "process_id": 32412 }, - "duration": 594000, - "start": 1755797020763006000 + "duration": 855000, + "start": 1758643028391975000 }, { "name": "websocket.send", @@ -67,8 +67,8 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", "language": "python", "network.client.ip": "testclient", @@ -82,8 +82,8 @@ "websocket.message.frames": 1, "websocket.message.length": 27 }, - "duration": 124000, - "start": 1755797020763726000 + "duration": 226000, + "start": 1758643028392959000 }], [ { @@ -100,11 +100,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "bf9e20ca46234560a24ecd981d6e068e", + "runtime-id": "eee0a9608532411ea71611fcc2b40c8e", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -114,12 +114,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 51661, + "process_id": 32412, "websocket.message.frames": 1, "websocket.message.length": 8 }, - "duration": 170000, - "start": 1755797020763969000 + "duration": 70000, + "start": 1758643028393331000 }, { "name": "websocket.send", @@ -132,19 +132,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 13 }, - "duration": 37000, - "start": 1755797020764043000 + "duration": 49000, + "start": 1758643028393497000 }], [ { @@ -161,11 +165,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "bf9e20ca46234560a24ecd981d6e068e", + "runtime-id": "eee0a9608532411ea71611fcc2b40c8e", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -175,12 +179,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 51661, + "process_id": 32412, "websocket.message.frames": 1, "websocket.message.length": 8 }, - "duration": 249000, - "start": 1755797020764123000 + "duration": 50000, + "start": 1758643028393637000 }, { "name": "websocket.send", @@ -193,19 +197,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 13 }, - "duration": 34000, - "start": 1755797020764283000 + "duration": 44000, + "start": 1758643028393769000 }], [ { @@ -222,11 +230,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "bf9e20ca46234560a24ecd981d6e068e", + "runtime-id": "eee0a9608532411ea71611fcc2b40c8e", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -236,12 +244,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 51661, + "process_id": 32412, "websocket.message.frames": 1, "websocket.message.length": 8 }, - "duration": 240000, - "start": 1755797020764357000 + "duration": 49000, + "start": 1758643028393897000 }, { "name": "websocket.send", @@ -254,19 +262,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 13 }, - "duration": 34000, - "start": 1755797020764509000 + "duration": 46000, + "start": 1758643028394032000 }], [ { @@ -283,11 +295,11 @@ "_dd.dm.resource": "websocket /ws", "_dd.dm.service": "fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a7561c00000000", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "bf9e20ca46234560a24ecd981d6e068e", + "runtime-id": "eee0a9608532411ea71611fcc2b40c8e", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -297,12 +309,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 51661, + "process_id": 32412, "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 279000, - "start": 1755797020764582000 + "duration": 50000, + "start": 1758643028394172000 }, { "name": "websocket.send", @@ -315,19 +327,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 3 }, - "duration": 33000, - "start": 1755797020764730000 + "duration": 46000, + "start": 1758643028394306000 }, { "name": "websocket.close", @@ -341,15 +357,19 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.span_links": "[{\"trace_id\": \"68a7561c000000000321bffb9f43e829\", \"span_id\": \"79f0c590f178ac33\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c35400000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c354000000000ab36f3693a9cb49\", \"span_id\": \"c000d57200b74041\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.close.code": 1000 }, - "duration": 38000, - "start": 1755797020764809000 + "duration": 55000, + "start": 1758643028394452000 }]] diff --git a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_not_separate_traces.json b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_not_separate_traces.json index d137b94087b..c0fddbd8549 100644 --- a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_not_separate_traces.json +++ b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_not_separate_traces.json @@ -11,23 +11,23 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754ac00000000", + "_dd.p.tid": "68d44d7200000000", "component": "fastapi", "http.upgraded": "websocket", "http.url": "ws://testserver/ws", "http.useragent": "testclient", "language": "python", - "runtime-id": "c63c4293e2734b8c89076429644b7ac7", + "runtime-id": "8f8a9adec1944786b373d1d0f0f64e88", "span.kind": "server" }, "metrics": { "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 48119 + "process_id": 31650 }, - "duration": 304000, - "start": 1755796652856346000 + "duration": 586000, + "start": 1758743922891823000 }, { "name": "websocket.receive", @@ -41,8 +41,8 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi" }, - "duration": 31000, - "start": 1755796652856594000 + "duration": 36000, + "start": 1758743922892299000 }, { "name": "websocket.send", @@ -56,8 +56,8 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754ac00000000", - "_dd.span_links": "[{\"trace_id\": \"68a754ac00000000d39276beedd27fac\", \"span_id\": \"c3cd04b3b7f62967\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d44d7200000000", + "_dd.span_links": "[{\"trace_id\": \"68d44d72000000008c188f646ba707da\", \"span_id\": \"b685dc792dfdbdc0\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", "language": "python", "network.client.ip": "testclient", @@ -71,8 +71,8 @@ "websocket.message.frames": 1, "websocket.message.length": 27 }, - "duration": 145000, - "start": 1755796652856908000 + "duration": 189000, + "start": 1758743922892760000 }, { "name": "websocket.receive", @@ -86,8 +86,8 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754ac00000000", - "_dd.span_links": "[{\"trace_id\": \"68a754ac00000000d39276beedd27fac\", \"span_id\": \"c3cd04b3b7f62967\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d44d7200000000", + "_dd.span_links": "[{\"trace_id\": \"68d44d72000000008c188f646ba707da\", \"span_id\": \"b685dc792dfdbdc0\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", "span.kind": "consumer", @@ -100,8 +100,8 @@ "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 254000, - "start": 1755796652857197000 + "duration": 163000, + "start": 1758743922893129000 }, { "name": "websocket.send", @@ -114,19 +114,24 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a754ac00000000d39276beedd27fac\", \"span_id\": \"c3cd04b3b7f62967\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.dm": "-0", + "_dd.p.tid": "68d44d7200000000", + "_dd.span_links": "[{\"trace_id\": \"68d44d72000000008c188f646ba707da\", \"span_id\": \"b685dc792dfdbdc0\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 12 }, - "duration": 40000, - "start": 1755796652857335000 + "duration": 58000, + "start": 1758743922893430000 }, { "name": "websocket.receive", @@ -140,18 +145,22 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.span_links": "[{\"trace_id\": \"68a754ac00000000d39276beedd27fac\", \"span_id\": \"c3cd04b3b7f62967\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d44d7200000000", + "_dd.span_links": "[{\"trace_id\": \"68d44d72000000008c188f646ba707da\", \"span_id\": \"b685dc792dfdbdc0\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", + "language": "python", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 276000, - "start": 1755796652857428000 + "duration": 114000, + "start": 1758743922893613000 }, { "name": "websocket.send", @@ -164,19 +173,24 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a754ac00000000d39276beedd27fac\", \"span_id\": \"c3cd04b3b7f62967\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.dm": "-0", + "_dd.p.tid": "68d44d7200000000", + "_dd.span_links": "[{\"trace_id\": \"68d44d72000000008c188f646ba707da\", \"span_id\": \"b685dc792dfdbdc0\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 3 }, - "duration": 38000, - "start": 1755796652857548000 + "duration": 48000, + "start": 1758743922893839000 }, { "name": "websocket.close", @@ -190,15 +204,19 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.span_links": "[{\"trace_id\": \"68a754ac00000000d39276beedd27fac\", \"span_id\": \"c3cd04b3b7f62967\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d44d7200000000", + "_dd.span_links": "[{\"trace_id\": \"68d44d72000000008c188f646ba707da\", \"span_id\": \"b685dc792dfdbdc0\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.close.code": 1000 }, - "duration": 47000, - "start": 1755796652857643000 + "duration": 68000, + "start": 1758743922893999000 }]] diff --git a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_sampling_not_inherited.json b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_sampling_not_inherited.json index ddc071330fd..ed494b3a909 100644 --- a/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_sampling_not_inherited.json +++ b/tests/snapshots/tests.contrib.fastapi.test_fastapi.test_websocket_tracing_sampling_not_inherited.json @@ -11,18 +11,18 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754f700000000", + "_dd.p.tid": "68d2c3c500000000", "language": "python", - "runtime-id": "691c7ade6c70491f82518db067c37597" + "runtime-id": "9a328cba2441453f9d216d5b42060384" }, "metrics": { "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 48490 + "process_id": 33262 }, - "duration": 26000, - "start": 1755796727323685000 + "duration": 35000, + "start": 1758643141753043000 }], [ { @@ -37,23 +37,23 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754f700000000", + "_dd.p.tid": "68d2c3c500000000", "component": "fastapi", "http.upgraded": "websocket", "http.url": "ws://testserver/ws", "http.useragent": "testclient", "language": "python", - "runtime-id": "691c7ade6c70491f82518db067c37597", + "runtime-id": "9a328cba2441453f9d216d5b42060384", "span.kind": "server" }, "metrics": { "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 48490 + "process_id": 33262 }, - "duration": 532000, - "start": 1755796727323387000 + "duration": 886000, + "start": 1758643141752547000 }, { "name": "websocket.send", @@ -67,8 +67,8 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754f700000000", - "_dd.span_links": "[{\"trace_id\": \"68a754f70000000008ce06c8fa23cc98\", \"span_id\": \"fc81487bb0b0d0c8\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c3c500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c3c500000000af55cac71ed4eb0b\", \"span_id\": \"2a8cbbe66740a901\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", "language": "python", "network.client.ip": "testclient", @@ -82,8 +82,8 @@ "websocket.message.frames": 1, "websocket.message.length": 27 }, - "duration": 129000, - "start": 1755796727324039000 + "duration": 207000, + "start": 1758643141753578000 }], [ { @@ -98,11 +98,11 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754f700000000", - "_dd.span_links": "[{\"trace_id\": \"68a754f70000000008ce06c8fa23cc98\", \"span_id\": \"fc81487bb0b0d0c8\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c3c500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c3c500000000af55cac71ed4eb0b\", \"span_id\": \"2a8cbbe66740a901\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "691c7ade6c70491f82518db067c37597", + "runtime-id": "9a328cba2441453f9d216d5b42060384", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -111,12 +111,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 48490, + "process_id": 33262, "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 240000, - "start": 1755796727324319000 + "duration": 134000, + "start": 1758643141753948000 }, { "name": "websocket.send", @@ -129,19 +129,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a754f70000000008ce06c8fa23cc98\", \"span_id\": \"fc81487bb0b0d0c8\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c3c500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c3c500000000af55cac71ed4eb0b\", \"span_id\": \"2a8cbbe66740a901\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 12 }, - "duration": 44000, - "start": 1755796727324443000 + "duration": 57000, + "start": 1758643141754187000 }], [ { @@ -156,11 +160,11 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.p.tid": "68a754f700000000", - "_dd.span_links": "[{\"trace_id\": \"68a754f70000000008ce06c8fa23cc98\", \"span_id\": \"fc81487bb0b0d0c8\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", + "_dd.p.tid": "68d2c3c500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c3c500000000af55cac71ed4eb0b\", \"span_id\": \"2a8cbbe66740a901\", \"attributes\": {\"dd.kind\": \"executed_by\"}}]", "component": "fastapi", "language": "python", - "runtime-id": "691c7ade6c70491f82518db067c37597", + "runtime-id": "9a328cba2441453f9d216d5b42060384", "span.kind": "consumer", "websocket.duration.style": "blocking", "websocket.message.type": "text" @@ -169,12 +173,12 @@ "_dd.top_level": 1, "_dd.tracer_kr": 1.0, "_sampling_priority_v1": 1, - "process_id": 48490, + "process_id": 33262, "websocket.message.frames": 1, "websocket.message.length": 7 }, - "duration": 377000, - "start": 1755796727324542000 + "duration": 116000, + "start": 1758643141754353000 }, { "name": "websocket.send", @@ -187,19 +191,23 @@ "error": 0, "meta": { "_dd.base_service": "tests.contrib.fastapi", - "_dd.span_links": "[{\"trace_id\": \"68a754f70000000008ce06c8fa23cc98\", \"span_id\": \"fc81487bb0b0d0c8\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c3c500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c3c500000000af55cac71ed4eb0b\", \"span_id\": \"2a8cbbe66740a901\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer", "websocket.message.type": "text" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.message.frames": 1, "websocket.message.length": 3 }, - "duration": 44000, - "start": 1755796727324759000 + "duration": 49000, + "start": 1758643141754568000 }, { "name": "websocket.close", @@ -213,15 +221,19 @@ "meta": { "_dd.base_service": "tests.contrib.fastapi", "_dd.p.dm": "-0", - "_dd.span_links": "[{\"trace_id\": \"68a754f70000000008ce06c8fa23cc98\", \"span_id\": \"fc81487bb0b0d0c8\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", + "_dd.p.tid": "68d2c3c500000000", + "_dd.span_links": "[{\"trace_id\": \"68d2c3c500000000af55cac71ed4eb0b\", \"span_id\": \"2a8cbbe66740a901\", \"attributes\": {\"dd.kind\": \"resuming\"}}]", "component": "fastapi", + "language": "python", "network.client.ip": "testclient", "out.host": "testclient", "span.kind": "producer" }, "metrics": { + "_dd.tracer_kr": 1.0, + "_sampling_priority_v1": 1, "websocket.close.code": 1000 }, - "duration": 40000, - "start": 1755796727324864000 + "duration": 62000, + "start": 1758643141754737000 }]]