Skip to content

Commit 3f3ce7b

Browse files
authored
Merge pull request #3281 from amadeuppereira/use-name-in-requests-trace
Forward explicitly set request name to OTEL span
2 parents 9202965 + b2cd6cd commit 3f3ce7b

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

locust/clients.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from locust.event import EventHook
44

55
import re
6+
import sys
67
import time
78
from contextlib import contextmanager
89
from typing import TYPE_CHECKING, cast
@@ -17,8 +18,13 @@
1718

1819
from .exception import CatchResponseError, LocustError, ResponseError
1920

21+
if sys.version_info >= (3, 12):
22+
from typing import override
23+
else:
24+
from typing_extensions import override
25+
26+
2027
if TYPE_CHECKING:
21-
import sys
2228
from collections.abc import Callable, Generator, Iterable, Mapping, MutableMapping
2329
from typing import Any, TypedDict
2430

@@ -177,6 +183,8 @@ def request( # type: ignore[override]
177183
if self.request_name and not name:
178184
name = self.request_name
179185

186+
self.explicit_name = name
187+
180188
# prepend url with hostname unless it's already an absolute URL
181189
complete_url = self._build_url(url)
182190

@@ -235,6 +243,13 @@ def _send_request_safe_mode(self, method, url, **kwargs) -> Response:
235243
except RequestException as e:
236244
return ResponseContextManager(e) # this is inconsistent, we should fix this some time
237245

246+
@override
247+
def prepare_request(self, request) -> requests.PreparedRequest:
248+
prep = super().prepare_request(request)
249+
if self.explicit_name:
250+
prep._explicit_name = self.explicit_name # type: ignore
251+
return prep
252+
238253
def get(
239254
self, url: str | bytes, *, data: Any = None, json: Any = None, **kwargs: Unpack[RESTKwargs]
240255
) -> ResponseContextManager:

locust/opentelemetry.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import os
3+
from urllib.parse import urlparse
34

45
from ._version import __version__
56

@@ -134,8 +135,11 @@ def _setup_auto_instrumentation():
134135
from opentelemetry.sdk.trace import Span
135136

136137
def request_hook(span: Span, request: requests.PreparedRequest):
137-
span.update_name(f"{request.method} {request.url}")
138-
return
138+
if name := getattr(request, "_explicit_name", None):
139+
span.update_name(f"{request.method} {name}")
140+
else:
141+
parsed = urlparse(request.url)
142+
span.update_name(f"{request.method} {str(parsed.path) or '/'}")
139143

140144
RequestsInstrumentor().instrument(request_hook=request_hook)
141145
except ImportError:

0 commit comments

Comments
 (0)