Skip to content

Commit 044a3be

Browse files
committed
Move logic to api
1 parent 4ac5d78 commit 044a3be

File tree

5 files changed

+30
-64
lines changed

5 files changed

+30
-64
lines changed

opentelemetry-api/src/opentelemetry/attributes/__init__.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,6 @@ def _clean_extended_attribute_value(
180180
# Freeze mutable sequences defensively
181181
return tuple(cleaned_seq)
182182

183-
raise TypeError(
184-
f"Invalid type {type(value).__name__} for attribute value. "
185-
f"Expected one of {[valid_type.__name__ for valid_type in _VALID_ANY_VALUE_TYPES]} or a "
186-
"sequence of those types",
187-
)
188183

189184

190185
def _clean_extended_attribute(
@@ -279,6 +274,9 @@ def __setitem__(self, key: str, value: types.AnyValue) -> None:
279274
return
280275

281276
if self._extended_attributes:
277+
# Convert types other than AnyValue to strings before cleaning
278+
if not isinstance(value, _VALID_ANY_VALUE_TYPES):
279+
value = str(value)
282280
value = _clean_extended_attribute(
283281
key, value, self.max_value_len
284282
)

opentelemetry-api/tests/attributes/test_attributes.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,30 @@ def test_extended_attributes(self):
301301
bdict["key"] = "value"
302302

303303
clean_extended_attribute_mock.assert_called_once()
304+
305+
def test_wsgi_request_conversion_to_string(self):
306+
"""Test that WSGI request objects are converted to strings before calling _clean_extended_attribute."""
307+
308+
class DummyWSGIRequest:
309+
def __str__(self):
310+
return "<DummyWSGIRequest method=GET path=/example/>"
311+
312+
bdict = BoundedAttributes(extended_attributes=True, immutable=False)
313+
wsgi_request = DummyWSGIRequest()
314+
original_request = wsgi_request # Keep reference to original object
315+
316+
with unittest.mock.patch(
317+
"opentelemetry.attributes._clean_extended_attribute",
318+
return_value="stringified_request",
319+
) as clean_extended_attribute_mock:
320+
bdict["request"] = wsgi_request
321+
322+
# Verify that _clean_extended_attribute was called
323+
clean_extended_attribute_mock.assert_called_once()
324+
325+
# Verify that the value passed to _clean_extended_attribute is a string, not the original object
326+
call_args = clean_extended_attribute_mock.call_args
327+
passed_value = call_args[0][1] # Second argument is the value
328+
self.assertIsInstance(passed_value, str)
329+
self.assertNotEqual(passed_value, original_request) # Should be stringified, not the original object
330+
self.assertIn("DummyWSGIRequest", passed_value) # String representation includes class name

opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
from opentelemetry.sdk._shared_internal import (
3737
BatchProcessor,
3838
DuplicateFilter,
39-
RequestFilter,
4039
)
4140
from opentelemetry.sdk.environment_variables import (
4241
OTEL_BLRP_EXPORT_TIMEOUT,
@@ -55,8 +54,6 @@
5554
)
5655
_logger = logging.getLogger(__name__)
5756
_logger.addFilter(DuplicateFilter())
58-
_wsgi_request_logger = logging.getLogger("django.request")
59-
_wsgi_request_logger.addFilter(RequestFilter())
6057

6158

6259
class LogRecordExportResult(enum.Enum):

opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,6 @@ def filter(self, record):
6262
return False
6363

6464

65-
class RequestFilter(logging.Filter):
66-
def filter(self, record: logging.LogRecord) -> bool:
67-
request = getattr(record, "request", None)
68-
record.request = str(request)
69-
return True
70-
71-
7265
class BatchExportStrategy(enum.Enum):
7366
EXPORT_ALL = 0
7467
EXPORT_WHILE_BATCH_EXCEEDS_THRESHOLD = 1
@@ -120,8 +113,6 @@ def __init__(
120113
)
121114
self._logger = logging.getLogger(__name__)
122115
self._logger.addFilter(DuplicateFilter())
123-
self._wsgi_request_logger = logging.getLogger("django.request")
124-
self._wsgi_request_logger.addFilter(RequestFilter())
125116
self._exporting = exporting
126117

127118
self._shutdown = False

opentelemetry-sdk/tests/shared_internal/test_batch_processor.py

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
)
3939
from opentelemetry.sdk._shared_internal import (
4040
DuplicateFilter,
41-
RequestFilter,
4241
)
4342
from opentelemetry.sdk.trace import ReadableSpan
4443
from opentelemetry.sdk.trace.export import BatchSpanProcessor
@@ -265,49 +264,3 @@ def test_duplicate_logs_filter_works(self):
265264
test_logger.info("message")
266265
test_logger.info("message")
267266
self.assertEqual(len(cm.output), 1)
268-
269-
270-
class TestRequestFilter(unittest.TestCase):
271-
def test_converts_http_request_to_string(self):
272-
class DummyRequest:
273-
def __str__(self):
274-
return "<DummyRequest method=GET path=/example/>"
275-
276-
request = DummyRequest()
277-
278-
record = logging.LogRecord(
279-
name="django.request",
280-
level=logging.ERROR,
281-
pathname=__file__,
282-
lineno=0,
283-
msg="test message",
284-
args=(),
285-
exc_info=None,
286-
)
287-
record.request = request
288-
289-
expected_repr = str(request)
290-
291-
request_filter = RequestFilter()
292-
result = request_filter.filter(record)
293-
294-
self.assertTrue(result)
295-
self.assertEqual(getattr(record, "request", None), expected_repr)
296-
self.assertIsInstance(getattr(record, "request", None), str)
297-
298-
def test_handles_missing_request_attribute(self):
299-
record = logging.LogRecord(
300-
name="django.request",
301-
level=logging.INFO,
302-
pathname=__file__,
303-
lineno=0,
304-
msg="no request",
305-
args=(),
306-
exc_info=None,
307-
)
308-
309-
request_filter = RequestFilter()
310-
result = request_filter.filter(record)
311-
312-
self.assertTrue(result)
313-
self.assertEqual(getattr(record, "request", None), "None")

0 commit comments

Comments
 (0)