Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
5333893
removing LogData and extending SDK LogRecord to have instrumentation …
hectorhdzg Jul 9, 2025
c3c3bac
Fix tests
hectorhdzg Jul 9, 2025
b7cda72
Keep LogData to avoid errors
hectorhdzg Jul 9, 2025
489fb85
Removing LogData
hectorhdzg Jul 11, 2025
9d61737
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Jul 14, 2025
748d50a
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Jul 17, 2025
59a4f7e
Update
hectorhdzg Jul 17, 2025
7591d05
Update test
hectorhdzg Jul 17, 2025
9ed04bb
Update
hectorhdzg Jul 18, 2025
13f927d
Update event test
hectorhdzg Jul 18, 2025
180c189
Update
hectorhdzg Jul 19, 2025
671eb69
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Jul 21, 2025
5f9e550
Address comments
hectorhdzg Jul 21, 2025
ba283ab
Update
hectorhdzg Jul 21, 2025
292c70f
Merge remote-tracking branch 'upstream/main' into hectorhdzg/removelo…
hectorhdzg Jul 29, 2025
c3f1607
Add ReadableLogRecord and ReadWriteLogRecord
hectorhdzg Sep 9, 2025
540bfe7
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Sep 9, 2025
d1cd9e5
Update
hectorhdzg Sep 9, 2025
9387ff1
Update tests
hectorhdzg Sep 9, 2025
940f642
Add dropped_attributes in ReadableLogRecord, this is used to encode l…
hectorhdzg Sep 9, 2025
dbef47b
Convert to ReadWriteLogRecord before exporting
hectorhdzg Sep 9, 2025
0e0b451
Update EventLogger
hectorhdzg Sep 9, 2025
d7a467a
Update
hectorhdzg Sep 9, 2025
5955465
Fix events tests
hectorhdzg Sep 9, 2025
9da84bc
Update
hectorhdzg Sep 9, 2025
34d2a1b
Update event test
hectorhdzg Sep 9, 2025
b232ac8
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Sep 10, 2025
d7f58f0
Update after merge
hectorhdzg Sep 10, 2025
4ca4db8
Update otlp common test
hectorhdzg Sep 10, 2025
1025fb1
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Sep 11, 2025
7eb9f58
Update
hectorhdzg Sep 11, 2025
53ecfa5
Address comments
hectorhdzg Sep 12, 2025
5f24b77
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Oct 16, 2025
8b6efb8
Update
hectorhdzg Oct 17, 2025
2146d3d
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Oct 17, 2025
7ff66d1
Update
hectorhdzg Oct 17, 2025
49540d2
Update
hectorhdzg Oct 17, 2025
1278a64
Update
hectorhdzg Nov 7, 2025
0da6bd3
Merge branch 'main' into hectorhdzg/removelogdata
hectorhdzg Nov 7, 2025
53c085b
ruff
hectorhdzg Nov 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,51 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#4782](https://github.com/open-telemetry/opentelemetry-python/pull/4782))
- semantic-conventions: Bump to 1.38.0
([#4791](https://github.com/open-telemetry/opentelemetry-python/pull/4791))
- [BREAKING] Remove LogData and extend SDK LogRecord to have instrumentation scope
([#4676](https://github.com/open-telemetry/opentelemetry-python/pull/4676))

**Migration Guide:**

`LogData` has been removed. Users should update their code as follows:

- **For Log Exporters:** Change from `Sequence[LogData]` to `Sequence[ReadableLogRecord]`
```python
# Before
from opentelemetry.sdk._logs import LogData
def export(self, batch: Sequence[LogData]) -> LogExportResult:
...

# After
from opentelemetry.sdk._logs import ReadableLogRecord
def export(self, batch: Sequence[ReadableLogRecord]) -> LogExportResult:
...
```

- **For Log Processors:** Use `ReadWriteLogRecord` for processing, `ReadableLogRecord` for exporting
```python
# Before
from opentelemetry.sdk._logs import LogData
def on_emit(self, log_data: LogData):
...

# After
from opentelemetry.sdk._logs import ReadWriteLogRecord, ReadableLogRecord
def on_emit(self, log_record: ReadWriteLogRecord):
# Convert to ReadableLogRecord before exporting
readable = ReadableLogRecord(
log_record=log_record.log_record,
resource=log_record.resource or Resource.create({}),
instrumentation_scope=log_record.instrumentation_scope,
limits=log_record.limits,
)
...
```

- **Accessing log data:** Use the same attributes on `ReadableLogRecord`/`ReadWriteLogRecord`
- `log_record.log_record` - The API LogRecord (contains body, severity, attributes, etc.)
- `log_record.resource` - The Resource
- `log_record.instrumentation_scope` - The InstrumentationScope (now included, was in LogData before)
- `log_record.limits` - The LogLimits

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,51 +30,55 @@
ResourceLogs,
ScopeLogs,
)
from opentelemetry.sdk._logs import LogData
from opentelemetry.sdk._logs import ReadableLogRecord


def encode_logs(batch: Sequence[LogData]) -> ExportLogsServiceRequest:
def encode_logs(
batch: Sequence[ReadableLogRecord],
) -> ExportLogsServiceRequest:
return ExportLogsServiceRequest(resource_logs=_encode_resource_logs(batch))


def _encode_log(log_data: LogData) -> PB2LogRecord:
def _encode_log(readable_log_record: ReadableLogRecord) -> PB2LogRecord:
span_id = (
None
if log_data.log_record.span_id == 0
else _encode_span_id(log_data.log_record.span_id)
if readable_log_record.log_record.span_id == 0
else _encode_span_id(readable_log_record.log_record.span_id)
)
trace_id = (
None
if log_data.log_record.trace_id == 0
else _encode_trace_id(log_data.log_record.trace_id)
if readable_log_record.log_record.trace_id == 0
else _encode_trace_id(readable_log_record.log_record.trace_id)
)
body = log_data.log_record.body
body = readable_log_record.log_record.body
return PB2LogRecord(
time_unix_nano=log_data.log_record.timestamp,
observed_time_unix_nano=log_data.log_record.observed_timestamp,
time_unix_nano=readable_log_record.log_record.timestamp,
observed_time_unix_nano=readable_log_record.log_record.observed_timestamp,
span_id=span_id,
trace_id=trace_id,
flags=int(log_data.log_record.trace_flags),
flags=int(readable_log_record.log_record.trace_flags),
body=_encode_value(body, allow_null=True),
severity_text=log_data.log_record.severity_text,
severity_text=readable_log_record.log_record.severity_text,
attributes=_encode_attributes(
log_data.log_record.attributes, allow_null=True
readable_log_record.log_record.attributes, allow_null=True
),
dropped_attributes_count=log_data.log_record.dropped_attributes,
dropped_attributes_count=readable_log_record.dropped_attributes,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.log_record in missing, probably got overwritten

Copy link
Contributor

@xrmx xrmx Oct 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we missing a test or an assertion? This is calling an helper function in ReadableLogRecord that proxies the log_record value if available.

severity_number=getattr(
log_data.log_record.severity_number, "value", None
readable_log_record.log_record.severity_number, "value", None
),
event_name=log_data.log_record.event_name,
event_name=readable_log_record.log_record.event_name,
)


def _encode_resource_logs(batch: Sequence[LogData]) -> List[ResourceLogs]:
def _encode_resource_logs(
batch: Sequence[ReadableLogRecord],
) -> List[ResourceLogs]:
sdk_resource_logs = defaultdict(lambda: defaultdict(list))

for sdk_log in batch:
sdk_resource = sdk_log.log_record.resource
sdk_instrumentation = sdk_log.instrumentation_scope or None
pb2_log = _encode_log(sdk_log)
for readable_log in batch:
sdk_resource = readable_log.resource
sdk_instrumentation = readable_log.instrumentation_scope or None
pb2_log = _encode_log(readable_log)

sdk_resource_logs[sdk_resource][sdk_instrumentation].append(pb2_log)

Expand Down
Loading
Loading