Skip to content

Commit dffcf36

Browse files
committed
events: use optional context for initialiation instead of trace_id
Signed-off-by: emdneto <[email protected]>
1 parent 57cb935 commit dffcf36

File tree

4 files changed

+102
-30
lines changed

4 files changed

+102
-30
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
- Overwrite logging.config.fileConfig and logging.config.dictConfig to ensure
1111
the OTLP `LogHandler` remains attached to the root logger. Fix a bug that
1212
can cause a deadlock to occur over `logging._lock` in some cases ([#4636](https://github.com/open-telemetry/opentelemetry-python/pull/4636)).
13+
- events: use optional `context` for initialiation instead of (`trace_id`, `span_id`, `trace_flag`)
14+
([#4690](https://github.com/open-telemetry/opentelemetry-python/pull/4636))
1315

1416
## Version 1.35.0/0.56b0 (2025-07-11)
1517

@@ -31,7 +33,7 @@ can cause a deadlock to occur over `logging._lock` in some cases ([#4636](https:
3133
- Update logger level to NOTSET in logs example
3234
([#4637](https://github.com/open-telemetry/opentelemetry-python/pull/4637))
3335
- Logging API accepts optional `context`; deprecates `trace_id`, `span_id`, `trace_flags`.
34-
([#4597](https://github.com/open-telemetry/opentelemetry-python/pull/4597)) and
36+
([#4597](https://github.com/open-telemetry/opentelemetry-python/pull/4597)) and
3537
([#4668](https://github.com/open-telemetry/opentelemetry-python/pull/4668))
3638
- sdk: use context instead of trace_id,span_id for initializing LogRecord
3739
([#4653](https://github.com/open-telemetry/opentelemetry-python/pull/4653))

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919

2020
from opentelemetry._logs import LogRecord
2121
from opentelemetry._logs.severity import SeverityNumber
22+
from opentelemetry.context import Context
2223
from opentelemetry.environment_variables import (
2324
_OTEL_PYTHON_EVENT_LOGGER_PROVIDER,
2425
)
25-
from opentelemetry.trace.span import TraceFlags
2626
from opentelemetry.util._once import Once
2727
from opentelemetry.util._providers import _load_provider
2828
from opentelemetry.util.types import AnyValue, _ExtendedAttributes
@@ -35,9 +35,7 @@ def __init__(
3535
self,
3636
name: str,
3737
timestamp: Optional[int] = None,
38-
trace_id: Optional[int] = None,
39-
span_id: Optional[int] = None,
40-
trace_flags: Optional["TraceFlags"] = None,
38+
context: Optional[Context] = None,
4139
body: Optional[AnyValue] = None,
4240
severity_number: Optional[SeverityNumber] = None,
4341
attributes: Optional[_ExtendedAttributes] = None,
@@ -49,9 +47,7 @@ def __init__(
4947
}
5048
super().__init__(
5149
timestamp=timestamp,
52-
trace_id=trace_id,
53-
span_id=span_id,
54-
trace_flags=trace_flags,
50+
context=context,
5551
body=body,
5652
severity_number=severity_number,
5753
attributes=event_attributes,

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
from time import time_ns
1616
from typing import Optional
1717

18-
from opentelemetry import trace
1918
from opentelemetry._events import Event
2019
from opentelemetry._events import EventLogger as APIEventLogger
2120
from opentelemetry._events import EventLoggerProvider as APIEventLoggerProvider
2221
from opentelemetry._logs import NoOpLogger, SeverityNumber, get_logger_provider
22+
from opentelemetry.context import get_current
2323
from opentelemetry.sdk._logs import Logger, LoggerProvider, LogRecord
2424
from opentelemetry.util.types import _ExtendedAttributes
2525

@@ -49,13 +49,10 @@ def emit(self, event: Event) -> None:
4949
if isinstance(self._logger, NoOpLogger):
5050
# Do nothing if SDK is disabled
5151
return
52-
span_context = trace.get_current_span().get_span_context()
5352
log_record = LogRecord(
5453
timestamp=event.timestamp or time_ns(),
5554
observed_timestamp=None,
56-
trace_id=event.trace_id or span_context.trace_id,
57-
span_id=event.span_id or span_context.span_id,
58-
trace_flags=event.trace_flags or span_context.trace_flags,
55+
context=event.context or get_current(),
5956
severity_text=None,
6057
severity_number=event.severity_number or SeverityNumber.INFO,
6158
body=event.body,

opentelemetry-sdk/tests/events/test_events.py

Lines changed: 94 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
import unittest
1818
from unittest.mock import Mock, patch
1919

20+
from opentelemetry import trace as trace_api
2021
from opentelemetry._events import Event
21-
from opentelemetry._logs import SeverityNumber, set_logger_provider
22+
from opentelemetry._logs import NoOpLogger, SeverityNumber, set_logger_provider
23+
from opentelemetry.context import get_current
2224
from opentelemetry.sdk._events import EventLoggerProvider
2325
from opentelemetry.sdk._logs import LoggerProvider
24-
from opentelemetry.sdk._logs._internal import Logger, NoOpLogger
26+
from opentelemetry.sdk._logs._internal import Logger
2527
from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED
2628

2729

@@ -123,15 +125,9 @@ def test_event_logger_emit(self, logger_mock, log_record_mock):
123125
"name", "version", "schema_url", {"key": "value"}
124126
)
125127
now = Mock()
126-
trace_id = Mock()
127-
span_id = Mock()
128-
trace_flags = Mock()
129128
event = Event(
130129
name="test_event",
131130
timestamp=now,
132-
trace_id=trace_id,
133-
span_id=span_id,
134-
trace_flags=trace_flags,
135131
body="test body",
136132
severity_number=SeverityNumber.ERROR,
137133
attributes={
@@ -146,9 +142,7 @@ def test_event_logger_emit(self, logger_mock, log_record_mock):
146142
log_record_mock.assert_called_once_with(
147143
timestamp=now,
148144
observed_timestamp=None,
149-
trace_id=trace_id,
150-
span_id=span_id,
151-
trace_flags=trace_flags,
145+
context=get_current(),
152146
severity_text=None,
153147
severity_number=SeverityNumber.ERROR,
154148
body="test body",
@@ -179,15 +173,9 @@ def test_event_logger_emit_sdk_disabled(
179173
"name", "version", "schema_url", {"key": "value"}
180174
)
181175
now = Mock()
182-
trace_id = Mock()
183-
span_id = Mock()
184-
trace_flags = Mock()
185176
event = Event(
186177
name="test_event",
187178
timestamp=now,
188-
trace_id=trace_id,
189-
span_id=span_id,
190-
trace_flags=trace_flags,
191179
body="test body",
192180
severity_number=SeverityNumber.ERROR,
193181
attributes={
@@ -200,3 +188,92 @@ def test_event_logger_emit_sdk_disabled(
200188
log_record_mock.return_value = log_record_mock_inst
201189
event_logger.emit(event)
202190
logger_mock_inst.emit.assert_not_called()
191+
192+
@patch("opentelemetry.sdk._events.LogRecord")
193+
@patch("opentelemetry.sdk._logs._internal.LoggerProvider.get_logger")
194+
def test_event_logger_emit_with_context(
195+
self, logger_mock, log_record_mock
196+
):
197+
logger_provider = LoggerProvider()
198+
logger_mock_inst = Mock()
199+
logger_mock.return_value = logger_mock_inst
200+
event_logger = EventLoggerProvider(logger_provider).get_event_logger(
201+
"name",
202+
version="version",
203+
schema_url="schema_url",
204+
attributes={"key": "value"},
205+
)
206+
logger_mock.assert_called_once_with(
207+
"name", "version", "schema_url", {"key": "value"}
208+
)
209+
210+
span = trace_api.NonRecordingSpan(
211+
trace_api.SpanContext(
212+
2604504634922341076776623263868986797,
213+
5213367945872657620,
214+
False,
215+
trace_api.TraceFlags(0x01),
216+
)
217+
)
218+
ctx = trace_api.set_span_in_context(span)
219+
220+
now = Mock()
221+
event = Event(
222+
name="test_event",
223+
timestamp=now,
224+
body="test body",
225+
severity_number=SeverityNumber.ERROR,
226+
attributes={
227+
"key": "val",
228+
"foo": "bar",
229+
"event.name": "not this one",
230+
},
231+
)
232+
log_record_mock_inst = Mock()
233+
log_record_mock.return_value = log_record_mock_inst
234+
with trace_api.use_span(span):
235+
event_logger.emit(event)
236+
log_record_mock.assert_called_with(
237+
timestamp=now,
238+
observed_timestamp=None,
239+
context=ctx,
240+
severity_text=None,
241+
severity_number=SeverityNumber.ERROR,
242+
body="test body",
243+
resource=event_logger._logger.resource,
244+
attributes={
245+
"key": "val",
246+
"foo": "bar",
247+
"event.name": "test_event",
248+
},
249+
)
250+
251+
another_event = Event(
252+
name="another_event",
253+
timestamp=now,
254+
context=ctx,
255+
body="another body",
256+
severity_number=SeverityNumber.ERROR,
257+
attributes={
258+
"key": "val",
259+
"foo": "bar",
260+
"event.name": "not this one",
261+
},
262+
)
263+
event_logger.emit(another_event)
264+
log_record_mock.assert_called_with(
265+
timestamp=now,
266+
observed_timestamp=None,
267+
context=ctx,
268+
severity_text=None,
269+
severity_number=SeverityNumber.ERROR,
270+
body="another body",
271+
resource=event_logger._logger.resource,
272+
attributes={
273+
"key": "val",
274+
"foo": "bar",
275+
"event.name": "another_event",
276+
},
277+
)
278+
279+
self.assertEqual(log_record_mock.call_count, 2)

0 commit comments

Comments
 (0)