Skip to content

Commit 8b6efb8

Browse files
committed
Update
1 parent 5f24b77 commit 8b6efb8

File tree

7 files changed

+52
-98
lines changed

7 files changed

+52
-98
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414

1515
- docs: Added sqlcommenter example
1616
([#4734](https://github.com/open-telemetry/opentelemetry-python/pull/4734))
17+
- [BREAKING] Remove LogData and extend SDK LogRecord to have instrumentation scope
18+
([#4676](https://github.com/open-telemetry/opentelemetry-python/pull/4676))
1719

1820
## Version 1.38.0/0.59b0 (2025-10-16)
1921

@@ -95,8 +97,6 @@ can cause a deadlock to occur over `logging._lock` in some cases ([#4636](https:
9597
([#4669](https://github.com/open-telemetry/opentelemetry-python/pull/4669))
9698
- Set expected User-Agent in HTTP headers for grpc OTLP exporter
9799
([#4658](https://github.com/open-telemetry/opentelemetry-python/pull/4658))
98-
- Remove LogData and extend SDK LogRecord to have instrumentation scope
99-
([#4676](https://github.com/open-telemetry/opentelemetry-python/pull/4676))
100100

101101
## Version 1.34.0/0.55b0 (2025-06-04)
102102

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

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from opentelemetry._events import EventLoggerProvider as APIEventLoggerProvider
2424
from opentelemetry._logs import NoOpLogger, SeverityNumber, get_logger_provider
2525
from opentelemetry.sdk._logs import (
26-
LogDeprecatedInitWarning,
2726
Logger,
2827
LoggerProvider,
2928
LogRecord,
@@ -58,22 +57,17 @@ def emit(self, event: Event) -> None:
5857
return
5958
span_context = trace.get_current_span().get_span_context()
6059

61-
# silence deprecation warnings from internal users
62-
with warnings.catch_warnings():
63-
warnings.simplefilter("ignore", category=LogDeprecatedInitWarning)
64-
65-
log_record = LogRecord(
66-
timestamp=event.timestamp or time_ns(),
67-
observed_timestamp=None,
68-
trace_id=event.trace_id or span_context.trace_id,
69-
span_id=event.span_id or span_context.span_id,
70-
trace_flags=event.trace_flags or span_context.trace_flags,
71-
severity_text=None,
72-
severity_number=event.severity_number or SeverityNumber.INFO,
73-
body=event.body,
74-
resource=getattr(self._logger, "resource", None),
75-
attributes=event.attributes,
76-
)
60+
log_record = LogRecord(
61+
timestamp=event.timestamp or time_ns(),
62+
observed_timestamp=None,
63+
trace_id=event.trace_id or span_context.trace_id,
64+
span_id=event.span_id or span_context.span_id,
65+
trace_flags=event.trace_flags or span_context.trace_flags,
66+
severity_text=None,
67+
severity_number=event.severity_number or SeverityNumber.INFO,
68+
body=event.body,
69+
attributes=event.attributes,
70+
)
7771
self._logger.emit(log_record)
7872

7973

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
15+
from opentelemetry._logs import LogRecord
1616
from opentelemetry.sdk._logs._internal import (
1717
LogDroppedAttributesWarning,
1818
Logger,
@@ -25,12 +25,13 @@
2525
)
2626

2727
__all__ = [
28+
"LogDroppedAttributesWarning",
2829
"Logger",
2930
"LoggerProvider",
3031
"LoggingHandler",
3132
"LogLimits",
33+
"LogRecord",
3234
"LogRecordProcessor",
33-
"LogDroppedAttributesWarning",
3435
"ReadableLogRecord",
3536
"ReadWriteLogRecord",
3637
]

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

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -78,18 +78,6 @@ class LogDroppedAttributesWarning(UserWarning):
7878
warnings.simplefilter("once", LogDroppedAttributesWarning)
7979

8080

81-
class LogDeprecatedInitWarning(UserWarning):
82-
"""Custom warning to indicate that deprecated and soon to be deprecated Log classes was used.
83-
84-
This class is used to filter and handle these specific warnings separately
85-
from other warnings, ensuring that they are only shown once without
86-
interfering with default user warnings.
87-
"""
88-
89-
90-
warnings.simplefilter("once", LogDeprecatedInitWarning)
91-
92-
9381
class LogLimits:
9482
"""This class is based on a SpanLimits class in the Tracing module.
9583
@@ -281,6 +269,7 @@ def _from_api_log_record(
281269
instrumentation_scope=instrumentation_scope,
282270
)
283271

272+
284273
class LogRecordProcessor(abc.ABC):
285274
"""Interface to hook the log record emitting action.
286275
@@ -518,7 +507,7 @@ def _get_attributes(record: logging.LogRecord) -> _ExtendedAttributes:
518507
)
519508
return attributes
520509

521-
def _translate(self, record: logging.LogRecord) -> dict:
510+
def _translate(self, record: logging.LogRecord) -> LogRecord:
522511
timestamp = int(record.created * 1e9)
523512
observered_timestamp = time_ns()
524513
attributes = self._get_attributes(record)
@@ -552,15 +541,15 @@ def _translate(self, record: logging.LogRecord) -> dict:
552541
"WARN" if record.levelname == "WARNING" else record.levelname
553542
)
554543

555-
return {
556-
"timestamp": timestamp,
557-
"observed_timestamp": observered_timestamp,
558-
"context": get_current() or None,
559-
"severity_text": level_name,
560-
"severity_number": severity_number,
561-
"body": body,
562-
"attributes": attributes,
563-
}
544+
return LogRecord(
545+
timestamp=timestamp,
546+
observed_timestamp=observered_timestamp,
547+
context=get_current() or None,
548+
severity_text=level_name,
549+
severity_number=severity_number,
550+
body=body,
551+
attributes=attributes,
552+
)
564553

565554
def emit(self, record: logging.LogRecord) -> None:
566555
"""
@@ -570,7 +559,7 @@ def emit(self, record: logging.LogRecord) -> None:
570559
"""
571560
logger = get_logger(record.name, logger_provider=self._logger_provider)
572561
if not isinstance(logger, NoOpLogger):
573-
logger.emit(**self._translate(record))
562+
logger.emit(self._translate(record))
574563

575564
def flush(self) -> None:
576565
"""
@@ -609,6 +598,7 @@ def __init__(
609598
def resource(self):
610599
return self._resource
611600

601+
# pylint: disable=arguments-differ
612602
def emit(self, record: LogRecord):
613603
"""Emits the :class:`ReadWriteLogRecord` by setting instrumentation scope
614604
and forwarding to the processor.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
set_value,
2828
)
2929
from opentelemetry.sdk._logs import (
30-
LogRecord
30+
LogRecord,
3131
LogRecordProcessor,
3232
ReadableLogRecord,
3333
ReadWriteLogRecord,

opentelemetry-sdk/tests/logs/test_log_record.py

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
ReadWriteLogRecord,
2626
)
2727
from opentelemetry.sdk.resources import Resource
28-
from opentelemetry.sdk.util.instrumentation import InstrumentationScope
2928
from opentelemetry.trace.span import TraceFlags
3029

3130

@@ -205,9 +204,6 @@ def test_log_record_from_api_log_record(self):
205204
timestamp=1,
206205
observed_timestamp=2,
207206
context=get_current(),
208-
trace_id=123,
209-
span_id=456,
210-
trace_flags=TraceFlags(0x01),
211207
severity_text="WARN",
212208
severity_number=SeverityNumber.WARN,
213209
body="a log line",
@@ -223,9 +219,10 @@ def test_log_record_from_api_log_record(self):
223219
self.assertEqual(record.log_record.timestamp, 1)
224220
self.assertEqual(record.log_record.observed_timestamp, 2)
225221
self.assertEqual(record.log_record.context, get_current())
226-
self.assertEqual(record.log_record.trace_id, 123)
227-
self.assertEqual(record.log_record.span_id, 456)
228-
self.assertEqual(record.log_record.trace_flags, TraceFlags(0x01))
222+
# trace_id, span_id, and trace_flags come from the context's span
223+
self.assertEqual(record.log_record.trace_id, 0)
224+
self.assertEqual(record.log_record.span_id, 0)
225+
self.assertEqual(record.log_record.trace_flags, TraceFlags(0x00))
229226
self.assertEqual(record.log_record.severity_text, "WARN")
230227
self.assertEqual(
231228
record.log_record.severity_number, SeverityNumber.WARN
@@ -234,33 +231,3 @@ def test_log_record_from_api_log_record(self):
234231
self.assertEqual(record.log_record.attributes, {"a": "b"})
235232
self.assertEqual(record.log_record.event_name, "an.event")
236233
self.assertEqual(record.resource, resource)
237-
238-
239-
class TestLogData(unittest.TestCase):
240-
def test_init_deprecated_warning(self):
241-
"""Test that LogData initialization emits a LogDeprecatedInitWarning."""
242-
log_record = LogRecord()
243-
244-
with warnings.catch_warnings(record=True) as cw:
245-
warnings.simplefilter("always")
246-
LogData(
247-
log_record=log_record,
248-
instrumentation_scope=InstrumentationScope("foo", "bar"),
249-
)
250-
251-
# Check that at least one LogDeprecatedInitWarning was emitted
252-
init_warnings = [
253-
w for w in cw if isinstance(w.message, LogDeprecatedInitWarning)
254-
]
255-
self.assertGreater(
256-
len(init_warnings),
257-
0,
258-
"Expected at least one LogDeprecatedInitWarning",
259-
)
260-
261-
# Check the message content of the LogDeprecatedInitWarning
262-
warning_message = str(init_warnings[0].message)
263-
self.assertIn(
264-
"LogData will be removed in 1.39.0 and replaced by ReadWriteLogRecord and ReadableLogRecord",
265-
warning_message,
266-
)

opentelemetry-sdk/tests/logs/test_logs.py

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
import unittest
1818
from unittest.mock import Mock, patch
1919

20-
from opentelemetry._logs import LogRecord as APILogRecord
21-
from opentelemetry._logs import SeverityNumber
20+
from opentelemetry._logs import LogRecord, SeverityNumber
2221
from opentelemetry.context import get_current
2322
from opentelemetry.sdk._logs import (
2423
Logger,
@@ -178,18 +177,18 @@ def test_can_emit_api_logrecord(self):
178177
self.assertTrue(isinstance(log_record, LogRecord))
179178
self.assertEqual(log_record.timestamp, None)
180179
self.assertEqual(log_record.observed_timestamp, 0)
181-
self.assertEqual(log_record.context, {})
180+
self.assertIsNotNone(log_record.context)
182181
self.assertEqual(log_record.severity_number, None)
183182
self.assertEqual(log_record.severity_text, None)
184183
self.assertEqual(log_record.body, "a log line")
185184
self.assertEqual(log_record.attributes, {})
186185
self.assertEqual(log_record.event_name, None)
187-
self.assertEqual(log_record.resource, logger.resource)
186+
self.assertEqual(log_data.resource, logger.resource)
188187

189188
def test_can_emit_with_keywords_arguments(self):
190189
logger, log_record_processor_mock = self._get_logger()
191190

192-
logger.emit(
191+
log_record = LogRecord(
193192
timestamp=100,
194193
observed_timestamp=101,
195194
context=get_current(),
@@ -199,16 +198,19 @@ def test_can_emit_with_keywords_arguments(self):
199198
attributes={"some": "attributes"},
200199
event_name="event_name",
201200
)
201+
logger.emit(log_record)
202202
log_record_processor_mock.on_emit.assert_called_once()
203203
log_data = log_record_processor_mock.on_emit.call_args.args[0]
204-
log_record = log_data.log_record
205-
self.assertTrue(isinstance(log_record, LogRecord))
206-
self.assertEqual(log_record.timestamp, 100)
207-
self.assertEqual(log_record.observed_timestamp, 101)
208-
self.assertEqual(log_record.context, {})
209-
self.assertEqual(log_record.severity_number, SeverityNumber.WARN)
210-
self.assertEqual(log_record.severity_text, "warn")
211-
self.assertEqual(log_record.body, "a body")
212-
self.assertEqual(log_record.attributes, {"some": "attributes"})
213-
self.assertEqual(log_record.event_name, "event_name")
214-
self.assertEqual(log_record.resource, logger.resource)
204+
result_log_record = log_data.log_record
205+
self.assertTrue(isinstance(result_log_record, LogRecord))
206+
self.assertEqual(result_log_record.timestamp, 100)
207+
self.assertEqual(result_log_record.observed_timestamp, 101)
208+
self.assertIsNotNone(result_log_record.context)
209+
self.assertEqual(
210+
result_log_record.severity_number, SeverityNumber.WARN
211+
)
212+
self.assertEqual(result_log_record.severity_text, "warn")
213+
self.assertEqual(result_log_record.body, "a body")
214+
self.assertEqual(result_log_record.attributes, {"some": "attributes"})
215+
self.assertEqual(result_log_record.event_name, "event_name")
216+
self.assertEqual(log_data.resource, logger.resource)

0 commit comments

Comments
 (0)