Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 5 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.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))
- [BREAKING] Rename several classes from Log to LogRecord
([#4647](https://github.com/open-telemetry/opentelemetry-python/pull/4647))

**Migration Guide:**

Expand All @@ -32,12 +34,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
```python
# Before
from opentelemetry.sdk._logs import LogData
def export(self, batch: Sequence[LogData]) -> LogExportResult:
def export(self, batch: Sequence[LogData]) -> LogRecordExportResult:
...

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

Expand Down Expand Up @@ -65,7 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `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
- `log_record.limits` - The LogRecordLimits

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

Expand Down
7 changes: 5 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,11 @@
"py:class",
"opentelemetry.proto.collector.metrics.v1.metrics_service_pb2.ExportMetricsServiceRequest",
),
("py:class", "opentelemetry.sdk._logs._internal.export.LogExporter"),
("py:class", "opentelemetry.sdk._logs._internal.export.LogExportResult"),
("py:class", "opentelemetry.sdk._logs._internal.export.LogRecordExporter"),
(
"py:class",
"opentelemetry.sdk._logs._internal.export.LogRecordExportResult",
),
(
"py:class",
"opentelemetry.proto.collector.logs.v1.logs_service_pb2.ExportLogsServiceRequest",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
from opentelemetry.proto.resource.v1.resource_pb2 import (
Resource as PB2Resource,
)
from opentelemetry.sdk._logs import LogLimits, ReadWriteLogRecord
from opentelemetry.sdk._logs import LogRecordLimits, ReadWriteLogRecord
from opentelemetry.sdk.resources import Resource as SDKResource
from opentelemetry.sdk.util.instrumentation import InstrumentationScope
from opentelemetry.trace import (
Expand Down Expand Up @@ -667,7 +667,7 @@ def _get_test_logs_dropped_attributes() -> List[ReadWriteLogRecord]:
attributes={"a": 1, "b": "c", "user_id": "B121092"},
),
resource=SDKResource({"first_resource": "value"}),
limits=LogLimits(max_attributes=1),
limits=LogRecordLimits(max_attributes=1),
instrumentation_scope=InstrumentationScope(
"first_name", "first_version"
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@
LogsServiceStub,
)
from opentelemetry.sdk._logs import ReadableLogRecord
from opentelemetry.sdk._logs.export import LogExporter, LogExportResult
from opentelemetry.sdk._logs.export import (
LogRecordExporter,
LogRecordExportResult,
)
from opentelemetry.sdk.environment_variables import (
_OTEL_PYTHON_EXPORTER_OTLP_GRPC_LOGS_CREDENTIAL_PROVIDER,
OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE,
Expand All @@ -44,11 +47,11 @@


class OTLPLogExporter(
LogExporter,
LogRecordExporter,
OTLPExporterMixin[
Sequence[ReadableLogRecord],
ExportLogsServiceRequest,
LogExportResult,
LogRecordExportResult,
LogsServiceStub,
],
):
Expand Down Expand Up @@ -100,7 +103,7 @@ def __init__(
timeout=timeout or environ_timeout,
compression=compression,
stub=LogsServiceStub,
result=LogExportResult,
result=LogRecordExportResult,
channel_options=channel_options,
)

Expand All @@ -112,7 +115,7 @@ def _translate_data(
def export( # type: ignore [reportIncompatibleMethodOverride]
self,
batch: Sequence[ReadableLogRecord],
) -> Literal[LogExportResult.SUCCESS, LogExportResult.FAILURE]:
) -> Literal[LogRecordExportResult.SUCCESS, LogRecordExportResult.FAILURE]:
return OTLPExporterMixin._export(self, batch)

def shutdown(self, timeout_millis: float = 30_000, **kwargs) -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
)
from opentelemetry.proto.resource.v1.resource_pb2 import Resource # noqa: F401
from opentelemetry.sdk._logs import ReadableLogRecord
from opentelemetry.sdk._logs.export import LogExportResult
from opentelemetry.sdk._logs.export import LogRecordExportResult
from opentelemetry.sdk._shared_internal import DuplicateFilter
from opentelemetry.sdk.environment_variables import (
_OTEL_PYTHON_EXPORTER_OTLP_GRPC_CREDENTIAL_PROVIDER,
Expand Down Expand Up @@ -132,7 +132,7 @@
)
ExportResultT = TypeVar(
"ExportResultT",
LogExportResult,
LogRecordExportResult,
MetricExportResult,
SpanExportResult,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@


# The below tests use this test SpanExporter and Spans, but are testing the
# underlying behavior in the mixin. A MetricExporter or LogExporter could
# underlying behavior in the mixin. A MetricExporter or LogRecordExporter could
# just as easily be used.
class OTLPSpanExporterForTesting(
SpanExporter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@
)
from opentelemetry.sdk._logs import ReadableLogRecord
from opentelemetry.sdk._logs.export import (
LogExporter,
LogExportResult,
LogRecordExporter,
LogRecordExportResult,
)
from opentelemetry.sdk._shared_internal import DuplicateFilter
from opentelemetry.sdk.environment_variables import (
Expand Down Expand Up @@ -71,7 +71,7 @@
_MAX_RETRYS = 6


class OTLPLogExporter(LogExporter):
class OTLPLogExporter(LogRecordExporter):
def __init__(
self,
endpoint: Optional[str] = None,
Expand Down Expand Up @@ -176,17 +176,19 @@ def _export(
)
return resp

def export(self, batch: Sequence[ReadableLogRecord]) -> LogExportResult:
def export(
self, batch: Sequence[ReadableLogRecord]
) -> LogRecordExportResult:
if self._shutdown:
_logger.warning("Exporter already shutdown, ignoring batch")
return LogExportResult.FAILURE
return LogRecordExportResult.FAILURE

serialized_data = encode_logs(batch).SerializeToString()
deadline_sec = time() + self._timeout
for retry_num in range(_MAX_RETRYS):
resp = self._export(serialized_data, deadline_sec - time())
if resp.ok:
return LogExportResult.SUCCESS
return LogRecordExportResult.SUCCESS
# multiplying by a random number between .8 and 1.2 introduces a +/20% jitter to each backoff.
backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2)
if (
Expand All @@ -200,7 +202,7 @@ def export(self, batch: Sequence[ReadableLogRecord]) -> LogExportResult:
resp.status_code,
resp.text,
)
return LogExportResult.FAILURE
return LogRecordExportResult.FAILURE
_logger.warning(
"Transient error %s encountered while exporting logs batch, retrying in %.2fs.",
resp.reason,
Expand All @@ -210,7 +212,7 @@ def export(self, batch: Sequence[ReadableLogRecord]) -> LogExportResult:
if shutdown:
_logger.warning("Shutdown in progress, aborting retry.")
break
return LogExportResult.FAILURE
return LogRecordExportResult.FAILURE

def force_flush(self, timeout_millis: float = 10_000) -> bool:
"""Nothing is buffered in this exporter, so this method does nothing."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
ExportLogsServiceRequest,
)
from opentelemetry.sdk._logs import ReadWriteLogRecord
from opentelemetry.sdk._logs.export import LogExportResult
from opentelemetry.sdk._logs.export import LogRecordExportResult
from opentelemetry.sdk.environment_variables import (
_OTEL_PYTHON_EXPORTER_OTLP_HTTP_LOGS_CREDENTIAL_PROVIDER,
OTEL_EXPORTER_OTLP_CERTIFICATE,
Expand Down Expand Up @@ -454,7 +454,8 @@ def test_2xx_status_code(self, mock_otlp_metric_exporter):
"""

self.assertEqual(
OTLPLogExporter().export(MagicMock()), LogExportResult.SUCCESS
OTLPLogExporter().export(MagicMock()),
LogRecordExportResult.SUCCESS,
)

@patch.object(Session, "post")
Expand All @@ -470,7 +471,7 @@ def test_retry_timeout(self, mock_post):
# Set timeout to 1.5 seconds
self.assertEqual(
exporter.export(self._get_sdk_log_data()),
LogExportResult.FAILURE,
LogRecordExportResult.FAILURE,
)
after = time.time()
# First call at time 0, second at time 1, then an early return before the second backoff sleep b/c it would exceed timeout.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@

from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import (
InMemoryLogExporter,
InMemoryLogRecordExporter,
SimpleLogRecordProcessor,
)


def _set_up_logging_handler(level):
logger_provider = LoggerProvider()
exporter = InMemoryLogExporter()
exporter = InMemoryLogRecordExporter()
processor = SimpleLogRecordProcessor(exporter=exporter)
logger_provider.add_log_record_processor(processor)
handler = LoggingHandler(level=level, logger_provider=logger_provider)
Expand Down
2 changes: 1 addition & 1 deletion opentelemetry-sdk/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ parentbased_traceidratio = "opentelemetry.sdk.trace.sampling:ParentBasedTraceIdR
sdk_logger_provider = "opentelemetry.sdk._logs:LoggerProvider"

[project.entry-points.opentelemetry_logs_exporter]
console = "opentelemetry.sdk._logs.export:ConsoleLogExporter"
console = "opentelemetry.sdk._logs.export:ConsoleLogRecordExporter"

[project.entry-points.opentelemetry_meter_provider]
sdk_meter_provider = "opentelemetry.sdk.metrics:MeterProvider"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@
from opentelemetry.metrics import set_meter_provider
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor, LogExporter
from opentelemetry.sdk._logs.export import (
BatchLogRecordProcessor,
LogRecordExporter,
)
from opentelemetry.sdk.environment_variables import (
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED,
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL,
Expand Down Expand Up @@ -97,7 +100,7 @@
Type[SpanExporter],
Type[MetricExporter],
Type[MetricReader],
Type[LogExporter],
Type[LogRecordExporter],
],
Mapping[str, Any],
]
Expand Down Expand Up @@ -250,7 +253,7 @@ def _init_metrics(


def _init_logging(
exporters: dict[str, Type[LogExporter]],
exporters: dict[str, Type[LogRecordExporter]],
resource: Resource | None = None,
setup_logging_handler: bool = True,
exporter_args_map: ExporterArgsMap | None = None,
Expand Down Expand Up @@ -309,7 +312,7 @@ def _import_exporters(
) -> tuple[
dict[str, Type[SpanExporter]],
dict[str, Union[Type[MetricExporter], Type[MetricReader]]],
dict[str, Type[LogExporter]],
dict[str, Type[LogRecordExporter]],
]:
trace_exporters = {}
metric_exporters = {}
Expand Down Expand Up @@ -345,7 +348,7 @@ def _import_exporters(
) in _import_config_components(
log_exporter_names, "opentelemetry_logs_exporter"
):
if issubclass(exporter_impl, LogExporter):
if issubclass(exporter_impl, LogRecordExporter):
log_exporters[exporter_name] = exporter_impl
else:
raise RuntimeError(f"{exporter_name} is not a log exporter")
Expand Down
6 changes: 5 additions & 1 deletion opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,22 @@
LoggerProvider,
LoggingHandler,
LogLimits,
LogRecordDroppedAttributesWarning,
LogRecordLimits,
LogRecordProcessor,
ReadableLogRecord,
ReadWriteLogRecord,
)

__all__ = [
"LogDroppedAttributesWarning",
"Logger",
"LoggerProvider",
"LoggingHandler",
"LogLimits",
"LogRecordLimits",
"LogRecordProcessor",
"LogDroppedAttributesWarning",
"LogRecordDroppedAttributesWarning",
"ReadableLogRecord",
"ReadWriteLogRecord",
]
Loading
Loading