Skip to content

Commit 0983337

Browse files
committed
Added the redaction capability in the instrumentations
1 parent 49da997 commit 0983337

File tree

9 files changed

+22
-17
lines changed
  • instrumentation
    • opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client
    • opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server
    • opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi
    • opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx
    • opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests
    • opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado
    • opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib
    • opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi
  • util/opentelemetry-util-http/tests

9 files changed

+22
-17
lines changed

instrumentation/opentelemetry-instrumentation-aiohttp-client/src/opentelemetry/instrumentation/aiohttp_client/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def response_hook(span: Span, params: typing.Union[
119119
from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE
120120
from opentelemetry.trace import Span, SpanKind, TracerProvider, get_tracer
121121
from opentelemetry.trace.status import Status, StatusCode
122-
from opentelemetry.util.http import remove_url_credentials, sanitize_method
122+
from opentelemetry.util.http import remove_url_credentials, sanitize_method, redact_query_parameters
123123

124124
_UrlFilterT = typing.Optional[typing.Callable[[yarl.URL], str]]
125125
_RequestHookT = typing.Optional[
@@ -240,9 +240,9 @@ async def on_request_start(
240240
method = params.method
241241
request_span_name = _get_span_name(method)
242242
request_url = (
243-
remove_url_credentials(trace_config_ctx.url_filter(params.url))
243+
redact_query_parameters(remove_url_credentials(trace_config_ctx.url_filter(params.url)))
244244
if callable(trace_config_ctx.url_filter)
245-
else remove_url_credentials(str(params.url))
245+
else redact_query_parameters(remove_url_credentials(str(params.url)))
246246
)
247247

248248
span_attributes = {}

instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def hello(request):
5757
from opentelemetry.semconv.metrics import MetricInstruments
5858
from opentelemetry.semconv.trace import SpanAttributes
5959
from opentelemetry.trace.status import Status, StatusCode
60-
from opentelemetry.util.http import get_excluded_urls, remove_url_credentials
60+
from opentelemetry.util.http import get_excluded_urls, remove_url_credentials, redact_query_parameters
6161

6262
_duration_attrs = [
6363
SpanAttributes.HTTP_METHOD,
@@ -146,7 +146,7 @@ def collect_request_attributes(request: web.Request) -> Dict:
146146
SpanAttributes.HTTP_ROUTE: _get_view_func(request),
147147
SpanAttributes.HTTP_FLAVOR: f"{request.version.major}.{request.version.minor}",
148148
SpanAttributes.HTTP_TARGET: request.path,
149-
SpanAttributes.HTTP_URL: remove_url_credentials(http_url),
149+
SpanAttributes.HTTP_URL: redact_query_parameters(remove_url_credentials(http_url)),
150150
}
151151

152152
http_method = request.method

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
260260
normalise_response_header_name,
261261
remove_url_credentials,
262262
sanitize_method,
263+
redact_query_parameters,
263264
)
264265

265266

@@ -355,7 +356,7 @@ def collect_request_attributes(
355356
if _report_old(sem_conv_opt_in_mode):
356357
_set_http_url(
357358
result,
358-
remove_url_credentials(http_url),
359+
redact_query_parameters(remove_url_credentials(http_url)),
359360
_StabilityMode.DEFAULT,
360361
)
361362
http_method = scope.get("method", "")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ async def async_response_hook(span, request, response):
244244
from opentelemetry.trace import SpanKind, Tracer, TracerProvider, get_tracer
245245
from opentelemetry.trace.span import Span
246246
from opentelemetry.trace.status import StatusCode
247-
from opentelemetry.util.http import remove_url_credentials, sanitize_method
247+
from opentelemetry.util.http import remove_url_credentials, sanitize_method, redact_query_parameters
248248

249249
_logger = logging.getLogger(__name__)
250250

@@ -298,7 +298,7 @@ def _extract_parameters(
298298
# In httpx >= 0.20.0, handle_request receives a Request object
299299
request: httpx.Request = args[0]
300300
method = request.method.encode()
301-
url = httpx.URL(remove_url_credentials(str(request.url)))
301+
url = httpx.URL(redact_query_parameters(remove_url_credentials(str(request.url))))
302302
headers = request.headers
303303
stream = request.stream
304304
extensions = request.extensions

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ def response_hook(span, request_obj, response):
149149
parse_excluded_urls,
150150
remove_url_credentials,
151151
sanitize_method,
152+
redact_query_parameters,
152153
)
153154
from opentelemetry.util.http.httplib import set_ip_on_next_http_connection
154155

@@ -232,7 +233,8 @@ def get_or_create_headers():
232233
method = request.method
233234
span_name = get_default_span_name(method)
234235

235-
url = remove_url_credentials(request.url)
236+
url = redact_query_parameters(remove_url_credentials(request.url))
237+
236238

237239
span_attributes = {}
238240
_set_http_method(

instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from opentelemetry.propagate import inject
2323
from opentelemetry.semconv.trace import SpanAttributes
2424
from opentelemetry.trace.status import Status, StatusCode
25-
from opentelemetry.util.http import remove_url_credentials
25+
from opentelemetry.util.http import remove_url_credentials, redact_query_parameters
2626

2727

2828
def _normalize_request(args, kwargs):
@@ -75,7 +75,7 @@ def fetch_async(
7575

7676
if span.is_recording():
7777
attributes = {
78-
SpanAttributes.HTTP_URL: remove_url_credentials(request.url),
78+
SpanAttributes.HTTP_URL: redact_query_parameters(remove_url_credentials(request.url)),
7979
SpanAttributes.HTTP_METHOD: request.method,
8080
}
8181
for key, value in attributes.items():
@@ -161,7 +161,7 @@ def _finish_tracing_callback(
161161
def _create_metric_attributes(response):
162162
metric_attributes = {
163163
SpanAttributes.HTTP_STATUS_CODE: response.code,
164-
SpanAttributes.HTTP_URL: remove_url_credentials(response.request.url),
164+
SpanAttributes.HTTP_URL: redact_query_parameters(remove_url_credentials(response.request.url)),
165165
SpanAttributes.HTTP_METHOD: response.request.method,
166166
}
167167

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ def response_hook(span: Span, request: Request, response: HTTPResponse):
137137
parse_excluded_urls,
138138
remove_url_credentials,
139139
sanitize_method,
140+
redact_query_parameters,
140141
)
141142
from opentelemetry.util.types import Attributes
142143

@@ -257,7 +258,7 @@ def _instrumented_open_call(
257258

258259
span_name = _get_span_name(method)
259260

260-
url = remove_url_credentials(url)
261+
url = redact_query_parameters(remove_url_credentials(url))
261262

262263
data = getattr(request, "data", None)
263264
request_size = 0 if data is None else len(data)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ def response_hook(span: Span, environ: WSGIEnvironment, status: str, response_he
270270
normalise_response_header_name,
271271
remove_url_credentials,
272272
sanitize_method,
273+
redact_query_parameters
273274
)
274275

275276
if TYPE_CHECKING:
@@ -365,9 +366,9 @@ def collect_request_attributes(
365366
else:
366367
# old semconv v1.20.0
367368
if _report_old(sem_conv_opt_in_mode):
368-
result[SpanAttributes.HTTP_URL] = remove_url_credentials(
369+
result[SpanAttributes.HTTP_URL] = redact_query_parameters(remove_url_credentials(
369370
wsgiref_util.request_uri(environ)
370-
)
371+
))
371372

372373
remote_addr = environ.get("REMOTE_ADDR")
373374
if remote_addr:

util/opentelemetry-util-http/tests/test_remove_credentials.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ def test_remove_no_credentials(self):
1010
self.assertEqual(cleaned_url, url)
1111

1212
def test_remove_credentials(self):
13-
url = "http://someuser:[email protected]:8080/test/path?query=value"
13+
url = "http://someuser:[email protected]:8080/test/path?sig=value"
1414
cleaned_url = remove_url_credentials(url)
1515
self.assertEqual(
16-
cleaned_url, "http://REDACTED:[email protected]:8080/test/path?query=value"
16+
cleaned_url, "http://REDACTED:[email protected]:8080/test/path?sig=value"
1717
)
1818

1919
def test_remove_credentials_ipv4_literal(self):

0 commit comments

Comments
 (0)