Skip to content
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#4649](https://github.com/open-telemetry/opentelemetry-python/pull/4649))
- proto: relax protobuf version requirement to support v6
([#4620](https://github.com/open-telemetry/opentelemetry-python/pull/4620))
- Rename several classes from Log to LogRecord
([#4647](https://github.com/open-telemetry/opentelemetry-python/pull/4647))

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

Expand Down
7 changes: 5 additions & 2 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,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 @@ -30,14 +30,14 @@
ResourceLogs,
ScopeLogs,
)
from opentelemetry.sdk._logs import LogData
from opentelemetry.sdk._logs import LogRecordData


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


def _encode_log(log_data: LogData) -> PB2LogRecord:
def _encode_log(log_data: LogRecordData) -> PB2LogRecord:
span_id = (
None
if log_data.log_record.span_id == 0
Expand Down Expand Up @@ -66,7 +66,9 @@ def _encode_log(log_data: LogData) -> PB2LogRecord:
)


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

for sdk_log in batch:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@
from opentelemetry.proto.resource.v1.resource_pb2 import (
Resource as PB2Resource,
)
from opentelemetry.sdk._logs import LogData, LogLimits
from opentelemetry.sdk._logs import LogRecord as SDKLogRecord
from opentelemetry.sdk._logs import LogRecordData, LogRecordLimits
from opentelemetry.sdk.resources import Resource as SDKResource
from opentelemetry.sdk.util.instrumentation import InstrumentationScope
from opentelemetry.trace import (
Expand Down Expand Up @@ -88,7 +88,7 @@ def test_dropped_attributes_count(self):
)

@staticmethod
def _get_sdk_log_data() -> List[LogData]:
def _get_sdk_log_data() -> List[LogRecordData]:
ctx_log1 = set_span_in_context(
NonRecordingSpan(
SpanContext(
Expand All @@ -99,7 +99,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log1 = LogData(
log1 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650195189786880,
observed_timestamp=1644650195189786881,
Expand All @@ -118,7 +118,7 @@ def _get_sdk_log_data() -> List[LogData]:
),
)

log2 = LogData(
log2 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650249738562048,
observed_timestamp=1644650249738562049,
Expand All @@ -143,7 +143,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log3 = LogData(
log3 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650427658989056,
observed_timestamp=1644650427658989057,
Expand All @@ -167,7 +167,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log4 = LogData(
log4 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650584292683008,
observed_timestamp=1644650584292683009,
Expand Down Expand Up @@ -196,7 +196,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log5 = LogData(
log5 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650584292683009,
observed_timestamp=1644650584292683010,
Expand All @@ -222,7 +222,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log6 = LogData(
log6 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650584292683022,
observed_timestamp=1644650584292683022,
Expand Down Expand Up @@ -253,7 +253,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log7 = LogData(
log7 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650584292683033,
observed_timestamp=1644650584292683033,
Expand Down Expand Up @@ -285,7 +285,7 @@ def _get_sdk_log_data() -> List[LogData]:
)
)
)
log8 = LogData(
log8 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650584292683044,
observed_timestamp=1644650584292683044,
Expand Down Expand Up @@ -601,7 +601,7 @@ def get_test_logs(
return sdk_logs, pb2_service_request

@staticmethod
def _get_test_logs_dropped_attributes() -> List[LogData]:
def _get_test_logs_dropped_attributes() -> List[LogRecordData]:
ctx_log1 = set_span_in_context(
NonRecordingSpan(
SpanContext(
Expand All @@ -612,7 +612,7 @@ def _get_test_logs_dropped_attributes() -> List[LogData]:
)
)
)
log1 = LogData(
log1 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650195189786880,
context=ctx_log1,
Expand All @@ -621,7 +621,7 @@ def _get_test_logs_dropped_attributes() -> List[LogData]:
body="Do not go gentle into that good night. Rage, rage against the dying of the light",
resource=SDKResource({"first_resource": "value"}),
attributes={"a": 1, "b": "c", "user_id": "B121092"},
limits=LogLimits(max_attributes=1),
limits=LogRecordLimits(max_attributes=1),
),
instrumentation_scope=InstrumentationScope(
"first_name", "first_version"
Expand All @@ -630,7 +630,7 @@ def _get_test_logs_dropped_attributes() -> List[LogData]:
ctx_log2 = set_span_in_context(
NonRecordingSpan(SpanContext(0, 0, False))
)
log2 = LogData(
log2 = LogRecordData(
log_record=SDKLogRecord(
timestamp=1644650249738562048,
context=ctx_log2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,12 @@
from opentelemetry.proto.collector.logs.v1.logs_service_pb2_grpc import (
LogsServiceStub,
)
from opentelemetry.sdk._logs import LogData
from opentelemetry.sdk._logs import LogRecord as SDKLogRecord
from opentelemetry.sdk._logs.export import LogExporter, LogExportResult
from opentelemetry.sdk._logs import LogRecordData
from opentelemetry.sdk._logs.export import (
LogRecordExporter,
LogRecordExportResult,
)
from opentelemetry.sdk.environment_variables import (
OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE,
OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE,
Expand All @@ -44,10 +47,12 @@


class OTLPLogExporter(
LogExporter,
OTLPExporterMixin[SDKLogRecord, ExportLogsServiceRequest, LogExportResult],
LogRecordExporter,
OTLPExporterMixin[
SDKLogRecord, ExportLogsServiceRequest, LogRecordExportResult
],
):
_result = LogExportResult
_result = LogRecordExportResult
_stub = LogsServiceStub

def __init__(
Expand Down Expand Up @@ -103,11 +108,11 @@ def __init__(
)

def _translate_data(
self, data: Sequence[LogData]
self, data: Sequence[LogRecordData]
) -> ExportLogsServiceRequest:
return encode_logs(data)

def export(self, batch: Sequence[LogData]) -> LogExportResult:
def export(self, batch: Sequence[LogRecordData]) -> LogRecordExportResult:
return self._export(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 @@ -39,7 +39,7 @@
from opentelemetry.proto.resource.v1.resource_pb2 import (
Resource as OTLPResource,
)
from opentelemetry.sdk._logs import LogData, LogRecord
from opentelemetry.sdk._logs import LogRecord, LogRecordData
from opentelemetry.sdk.environment_variables import (
OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE,
OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE,
Expand Down Expand Up @@ -74,7 +74,7 @@ def setUp(self):
)
)
)
self.log_data_1 = LogData(
self.log_data_1 = LogRecordData(
log_record=LogRecord(
timestamp=int(time.time() * 1e9),
context=ctx_log_data_1,
Expand All @@ -98,7 +98,7 @@ def setUp(self):
)
)
)
self.log_data_2 = LogData(
self.log_data_2 = LogRecordData(
log_record=LogRecord(
timestamp=int(time.time() * 1e9),
context=ctx_log_data_2,
Expand All @@ -122,7 +122,7 @@ def setUp(self):
)
)
)
self.log_data_3 = LogData(
self.log_data_3 = LogRecordData(
log_record=LogRecord(
timestamp=int(time.time() * 1e9),
context=ctx_log_data_3,
Expand All @@ -140,7 +140,7 @@ def setUp(self):
SpanContext(0, 5213367945872657629, False, TraceFlags(0x01))
)
)
self.log_data_4 = LogData(
self.log_data_4 = LogRecordData(
log_record=LogRecord(
timestamp=int(time.time() * 1e9),
context=ctx_log_data_4,
Expand All @@ -163,7 +163,7 @@ def setUp(self):
)
)
)
self.log_data_5 = LogData(
self.log_data_5 = LogRecordData(
log_record=LogRecord(
timestamp=int(time.time() * 1e9),
context=ctx_log_data_5,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,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 @@ -32,10 +32,10 @@
from opentelemetry.exporter.otlp.proto.http._common import (
_is_retryable,
)
from opentelemetry.sdk._logs import LogData
from opentelemetry.sdk._logs import LogRecordData
from opentelemetry.sdk._logs.export import (
LogExporter,
LogExportResult,
LogRecordExporter,
LogRecordExportResult,
)
from opentelemetry.sdk.environment_variables import (
OTEL_EXPORTER_OTLP_CERTIFICATE,
Expand Down Expand Up @@ -65,7 +65,7 @@
_MAX_RETRYS = 6


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

def export(self, batch: Sequence[LogData]) -> LogExportResult:
def export(self, batch: Sequence[LogRecordData]) -> 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 @@ -179,15 +179,15 @@ def export(self, batch: Sequence[LogData]) -> 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,
backoff_seconds,
)
sleep(backoff_seconds)
# Not possible to reach here but the linter is complaining.
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
Loading
Loading