Skip to content

Commit 017c6ab

Browse files
committed
Remove URL credentials (httpx)
1 parent 4bf3577 commit 017c6ab

File tree

4 files changed

+18
-2
lines changed

4 files changed

+18
-2
lines changed

instrumentation/opentelemetry-instrumentation-httpx/pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ dependencies = [
2828
"opentelemetry-api ~= 1.12",
2929
"opentelemetry-instrumentation == 0.43b0.dev",
3030
"opentelemetry-semantic-conventions == 0.43b0.dev",
31+
"opentelemetry-util-http == 0.43b0.dev",
3132
]
3233

3334
[project.optional-dependencies]

instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ async def async_response_hook(span, request, response):
206206
from opentelemetry.trace import SpanKind, TracerProvider, get_tracer
207207
from opentelemetry.trace.span import Span
208208
from opentelemetry.trace.status import Status
209+
from opentelemetry.util.http import remove_url_credentials
209210

210211
_logger = logging.getLogger(__name__)
211212

@@ -269,7 +270,7 @@ def _extract_parameters(args, kwargs):
269270
# In httpx >= 0.20.0, handle_request receives a Request object
270271
request: httpx.Request = args[0]
271272
method = request.method.encode()
272-
url = request.url
273+
url = remove_url_credentials(str(request.url))
273274
headers = request.headers
274275
stream = request.stream
275276
extensions = request.extensions

instrumentation/opentelemetry-instrumentation-httpx/tests/test_httpx_integration.py

+14
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,13 @@ def perform_request(
604604
return self.client.request(method, url, headers=headers)
605605
return client.request(method, url, headers=headers)
606606

607+
def test_credential_removal(self):
608+
new_url = "http://username:password@mock/status/200"
609+
self.perform_request(new_url)
610+
span = self.assert_span()
611+
612+
self.assertEqual(span.attributes[SpanAttributes.HTTP_URL], self.URL)
613+
607614

608615
class TestAsyncIntegration(BaseTestCases.BaseManualTest):
609616
response_hook = staticmethod(_async_response_hook)
@@ -664,6 +671,13 @@ def test_basic_multiple(self):
664671
)
665672
self.assert_span(num_spans=2)
666673

674+
def test_credential_removal(self):
675+
new_url = "http://username:password@mock/status/200"
676+
self.perform_request(new_url)
677+
span = self.assert_span()
678+
679+
self.assertEqual(span.attributes[SpanAttributes.HTTP_URL], self.URL)
680+
667681

668682
class TestSyncInstrumentationIntegration(BaseTestCases.BaseInstrumentorTest):
669683
def create_client(

tox.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ commands_pre =
386386

387387
grpc: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc[test]
388388

389-
falcon{1,2,3},flask{213,220},django{1,2,3,4},pyramid,tornado,starlette,fastapi,aiohttp,asgi,requests,urllib,urllib3v{1,2},wsgi: pip install {toxinidir}/util/opentelemetry-util-http[test]
389+
falcon{1,2,3},flask{213,220},django{1,2,3,4},pyramid,tornado,starlette,fastapi,aiohttp,asgi,httpx{18,21},requests,urllib,urllib3v{1,2},wsgi: pip install {toxinidir}/util/opentelemetry-util-http[test]
390390
wsgi,falcon{1,2,3},flask{213,220},django{1,2,3,4},pyramid: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-wsgi[test]
391391
asgi,django{3,4},starlette,fastapi: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-asgi[test]
392392

0 commit comments

Comments
 (0)