Skip to content

Commit eb28a8d

Browse files
Add special LogDeprecatedInitWarning that logs once
1 parent 84c6b33 commit eb28a8d

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
from opentelemetry.sdk._logs._internal import (
1717
LogData,
18+
LogDeprecatedInitWarning,
1819
LogDroppedAttributesWarning,
1920
Logger,
2021
LoggerProvider,
@@ -32,5 +33,6 @@
3233
"LogLimits",
3334
"LogRecord",
3435
"LogRecordProcessor",
36+
"LogDeprecatedInitWarning",
3537
"LogDroppedAttributesWarning",
3638
]

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,18 @@ class LogDroppedAttributesWarning(UserWarning):
7777
warnings.simplefilter("once", LogDroppedAttributesWarning)
7878

7979

80+
class LogDeprecatedInitWarning(UserWarning):
81+
"""Custom warning to indicate deprecated LogRecord init was used.
82+
83+
This class is used to filter and handle these specific warnings separately
84+
from other warnings, ensuring that they are only shown once without
85+
interfering with default user warnings.
86+
"""
87+
88+
89+
warnings.simplefilter("once", LogDeprecatedInitWarning)
90+
91+
8092
class LogLimits:
8193
"""This class is based on a SpanLimits class in the Tracing module.
8294
@@ -224,6 +236,13 @@ def __init__(
224236
attributes: _ExtendedAttributes | None = None,
225237
limits: LogLimits | None = _UnsetLogLimits,
226238
):
239+
if trace_id or span_id or trace_flags:
240+
warnings.warn(
241+
"LogRecord init with `trace_id`, `span_id`, and/or `trace_flags` is deprecated. Use `context` instead.",
242+
LogDeprecatedInitWarning,
243+
stacklevel=2,
244+
)
245+
227246
if not context:
228247
context = get_current()
229248

opentelemetry-sdk/tests/logs/test_log_record.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@
1818

1919
from opentelemetry._logs.severity import SeverityNumber
2020
from opentelemetry.attributes import BoundedAttributes
21+
from opentelemetry.context import get_current
2122
from opentelemetry.sdk._logs import (
23+
LogDeprecatedInitWarning,
2224
LogDroppedAttributesWarning,
2325
LogLimits,
2426
LogRecord,
2527
)
2628
from opentelemetry.sdk.resources import Resource
29+
from opentelemetry.trace.span import TraceFlags
2730

2831

2932
class TestLogRecord(unittest.TestCase):
@@ -168,3 +171,28 @@ def test_log_record_dropped_attributes_unset_limits(self):
168171
)
169172
self.assertTrue(result.dropped_attributes == 0)
170173
self.assertEqual(attr, result.attributes)
174+
175+
def test_log_record_deprecated_init_warning(self):
176+
test_cases = [
177+
{"trace_id": 123},
178+
{"span_id": 123},
179+
{"trace_flags": TraceFlags(0x01)},
180+
]
181+
182+
for params in test_cases:
183+
with self.subTest(params=params):
184+
with warnings.catch_warnings(record=True) as cw:
185+
for _ in range(10):
186+
LogRecord(**params)
187+
188+
self.assertEqual(len(cw), 1)
189+
self.assertIsInstance(cw[-1].message, LogDeprecatedInitWarning)
190+
self.assertIn(
191+
"LogRecord init with `trace_id`, `span_id`, and/or `trace_flags` is deprecated. Use `context` instead.",
192+
str(cw[-1].message),
193+
)
194+
195+
with warnings.catch_warnings(record=True) as cw:
196+
for _ in range(10):
197+
LogRecord(context=get_current())
198+
self.assertEqual(len(cw), 0)

0 commit comments

Comments
 (0)