diff --git a/CHANGELOG.md b/CHANGELOG.md index 87a6fd6d38..e64bef1366 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#4979](https://github.com/open-telemetry/opentelemetry-python/pull/4979)) - `opentelemetry-sdk`: Map Python `CRITICAL` log level to OTel `FATAL` severity text per the specification ([#4984](https://github.com/open-telemetry/opentelemetry-python/issues/4984)) +- `opentelemetry-sdk`: Optimize `LogRecord` memory in `BatchLogRecordProcessor` by clearing the `Context` object before buffering. + ([#4957](https://github.com/open-telemetry/opentelemetry-python/issues/4957)) - `opentelemetry-sdk`: Add file configuration support with YAML/JSON loading, environment variable substitution, and schema validation against the vendored OTel config JSON schema ([#4898](https://github.com/open-telemetry/opentelemetry-python/pull/4898)) - Fix intermittent CI failures in `getting-started` and `tracecontext` jobs caused by GitHub git CDN SHA propagation lag by installing contrib packages from the already-checked-out local copy instead of a second git clone diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py index 1c0f82ac05..34383e8df2 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -14,6 +14,7 @@ from __future__ import annotations import abc +import copy import enum import logging import sys @@ -25,6 +26,7 @@ from opentelemetry.context import ( _ON_EMIT_RECURSION_COUNT_KEY, _SUPPRESS_INSTRUMENTATION_KEY, + Context, attach, detach, get_value, @@ -315,8 +317,13 @@ def on_emit(self, log_record: ReadWriteLogRecord) -> None: if log_record.resource is not None else Resource.create({}) ) + # Shallow copy the API log record to break the reference to the potentially large context + # while keeping the original context intact for other processors. + api_log_record = copy.copy(log_record.log_record) + api_log_record.context = Context() + readable_log_record = ReadableLogRecord( - log_record=log_record.log_record, + log_record=api_log_record, resource=resource, instrumentation_scope=log_record.instrumentation_scope, limits=log_record.limits,