From 464683cf34a2dc45e68ddafdd7a8282ccbbab2d8 Mon Sep 17 00:00:00 2001 From: Dylan Russell Date: Mon, 23 Jun 2025 13:41:02 +0000 Subject: [PATCH 1/5] Initial commit adding event name to the LogRecord --- CHANGELOG.md | 2 ++ .../otlp/proto/common/_internal/_log_encoder/__init__.py | 1 + .../src/opentelemetry/_logs/_internal/__init__.py | 4 ++++ .../src/opentelemetry/sdk/_logs/_internal/__init__.py | 7 ++++++- opentelemetry-sdk/tests/logs/test_log_record.py | 3 ++- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19a3434190e..610a8cfccd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Add `event_name` as a top level field in the `LogRecord`. Events are now simply logs with the +`event_name` field set, the logs SDK should be used to emit events. - Update OTLP gRPC/HTTP exporters: the export timeout is now inclusive of all retries and backoffs. A +/-20% jitter was added to all backoffs. A pointless 32 second sleep that occurred after all retries had completed/failed was removed. diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py index 9d713cb7ff0..000e56ed8bf 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py @@ -62,6 +62,7 @@ def _encode_log(log_data: LogData) -> PB2LogRecord: ), dropped_attributes_count=log_data.log_record.dropped_attributes, severity_number=log_data.log_record.severity_number.value, + event_name=log_data.log_record.event_name, ) diff --git a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py index e2d416d5992..825a5b6295c 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py @@ -69,6 +69,7 @@ def __init__( severity_number: Optional[SeverityNumber] = None, body: AnyValue = None, attributes: Optional[_ExtendedAttributes] = None, + event_name: Optional[str] = None, ) -> None: ... @overload @@ -84,6 +85,7 @@ def __init__( severity_number: Optional[SeverityNumber] = None, body: AnyValue = None, attributes: Optional[_ExtendedAttributes] = None, + event_name: Optional[str] = None, ) -> None: ... def __init__( @@ -99,6 +101,7 @@ def __init__( severity_number: Optional[SeverityNumber] = None, body: AnyValue = None, attributes: Optional[_ExtendedAttributes] = None, + event_name: Optional[str] = None, ) -> None: self.timestamp = timestamp if observed_timestamp is None: @@ -112,6 +115,7 @@ def __init__( self.severity_number = severity_number self.body = body self.attributes = attributes + self.event_name = event_name class Logger(ABC): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index 8201b6c78f0..148671e1e28 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -206,6 +206,7 @@ def __init__( resource: Resource | None = None, attributes: _ExtendedAttributes | None = None, limits: LogLimits | None = _UnsetLogLimits, + event_name: str | None = None, ): ... @overload @@ -222,9 +223,10 @@ def __init__( resource: Resource | None = None, attributes: _ExtendedAttributes | None = None, limits: LogLimits | None = _UnsetLogLimits, + event_name: str | None = None, ): ... - def __init__( + def __init__( # pylint:disable=too-many-locals self, timestamp: int | None = None, observed_timestamp: int | None = None, @@ -238,6 +240,7 @@ def __init__( resource: Resource | None = None, attributes: _ExtendedAttributes | None = None, limits: LogLimits | None = _UnsetLogLimits, + event_name: str | None = None, ): if trace_id or span_id or trace_flags: warnings.warn( @@ -275,6 +278,7 @@ def __init__( max_value_len=limits.max_attribute_length, extended_attributes=True, ), + "event_name": event_name, } ) self.resource = ( @@ -318,6 +322,7 @@ def to_json(self, indent: int | None = 4) -> str: ), "trace_flags": self.trace_flags, "resource": json.loads(self.resource.to_json()), + "event_name": self.event_name if self.event_name else "", }, indent=indent, cls=BytesEncoder, diff --git a/opentelemetry-sdk/tests/logs/test_log_record.py b/opentelemetry-sdk/tests/logs/test_log_record.py index d7aa0faa649..5175cb8c860 100644 --- a/opentelemetry-sdk/tests/logs/test_log_record.py +++ b/opentelemetry-sdk/tests/logs/test_log_record.py @@ -42,11 +42,12 @@ def test_log_record_to_json(self): "sequence": [1, 2], "str": "string", }, + event_name="a.event", ) self.assertEqual( log_record.to_json(indent=None), - '{"body": {"key": "logLine", "bytes": "MTIz"}, "severity_number": null, "severity_text": null, "attributes": {"mapping": {"key": "value"}, "none": null, "sequence": [1, 2], "str": "string"}, "dropped_attributes": 0, "timestamp": "1970-01-01T00:00:00.000000Z", "observed_timestamp": "1970-01-01T00:00:00.000000Z", "trace_id": "", "span_id": "", "trace_flags": null, "resource": {"attributes": {"service.name": "foo"}, "schema_url": ""}}', + '{"body": {"key": "logLine", "bytes": "MTIz"}, "severity_number": null, "severity_text": null, "attributes": {"mapping": {"key": "value"}, "none": null, "sequence": [1, 2], "str": "string"}, "dropped_attributes": 0, "timestamp": "1970-01-01T00:00:00.000000Z", "observed_timestamp": "1970-01-01T00:00:00.000000Z", "trace_id": "", "span_id": "", "trace_flags": null, "resource": {"attributes": {"service.name": "foo"}, "schema_url": ""}, "event_name": "a.event"}', ) def test_log_record_to_json_serializes_severity_number_as_int(self): From 3cf334556871698d8d8afa012454cd488bf5a873 Mon Sep 17 00:00:00 2001 From: Dylan Russell Date: Mon, 23 Jun 2025 13:55:25 +0000 Subject: [PATCH 2/5] Update changelog with PR number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 610a8cfccd8..eea68f3d766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - Add `event_name` as a top level field in the `LogRecord`. Events are now simply logs with the -`event_name` field set, the logs SDK should be used to emit events. +`event_name` field set, the logs SDK should be used to emit events ([#4652](https://github.com/open-telemetry/opentelemetry-python/pull/4652)). - Update OTLP gRPC/HTTP exporters: the export timeout is now inclusive of all retries and backoffs. A +/-20% jitter was added to all backoffs. A pointless 32 second sleep that occurred after all retries had completed/failed was removed. From 1744e3f3d1629c5d5dd71d4d03081af89bbfea98 Mon Sep 17 00:00:00 2001 From: Dylan Russell Date: Mon, 23 Jun 2025 20:23:35 +0000 Subject: [PATCH 3/5] Remove event_name from deprecated initializer overloads.. --- opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py | 2 -- .../src/opentelemetry/sdk/_logs/_internal/__init__.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py index 825a5b6295c..e698f275249 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py @@ -85,7 +85,6 @@ def __init__( severity_number: Optional[SeverityNumber] = None, body: AnyValue = None, attributes: Optional[_ExtendedAttributes] = None, - event_name: Optional[str] = None, ) -> None: ... def __init__( @@ -101,7 +100,6 @@ def __init__( severity_number: Optional[SeverityNumber] = None, body: AnyValue = None, attributes: Optional[_ExtendedAttributes] = None, - event_name: Optional[str] = None, ) -> None: self.timestamp = timestamp if observed_timestamp is None: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index 148671e1e28..524ad9ffa8b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -223,7 +223,6 @@ def __init__( resource: Resource | None = None, attributes: _ExtendedAttributes | None = None, limits: LogLimits | None = _UnsetLogLimits, - event_name: str | None = None, ): ... def __init__( # pylint:disable=too-many-locals @@ -240,7 +239,6 @@ def __init__( # pylint:disable=too-many-locals resource: Resource | None = None, attributes: _ExtendedAttributes | None = None, limits: LogLimits | None = _UnsetLogLimits, - event_name: str | None = None, ): if trace_id or span_id or trace_flags: warnings.warn( From 06465e791f3414b6bb9b9edbee45547bd21c9d06 Mon Sep 17 00:00:00 2001 From: Dylan Russell Date: Mon, 23 Jun 2025 20:25:12 +0000 Subject: [PATCH 4/5] remove_pylint --- .../src/opentelemetry/sdk/_logs/_internal/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index 524ad9ffa8b..2d9bd26d938 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -225,7 +225,7 @@ def __init__( limits: LogLimits | None = _UnsetLogLimits, ): ... - def __init__( # pylint:disable=too-many-locals + def __init__( self, timestamp: int | None = None, observed_timestamp: int | None = None, From b41933a0114ecb80420a1f19af9136ff316ae2cc Mon Sep 17 00:00:00 2001 From: Dylan Russell Date: Mon, 23 Jun 2025 20:32:46 +0000 Subject: [PATCH 5/5] Add event_name back in some places --- .../src/opentelemetry/_logs/_internal/__init__.py | 1 + .../src/opentelemetry/sdk/_logs/_internal/__init__.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py index e698f275249..d1da2e99956 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py @@ -100,6 +100,7 @@ def __init__( severity_number: Optional[SeverityNumber] = None, body: AnyValue = None, attributes: Optional[_ExtendedAttributes] = None, + event_name: Optional[str] = None, ) -> None: self.timestamp = timestamp if observed_timestamp is None: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index 2d9bd26d938..d3e6079c560 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -225,7 +225,7 @@ def __init__( limits: LogLimits | None = _UnsetLogLimits, ): ... - def __init__( + def __init__( # pylint:disable=too-many-locals self, timestamp: int | None = None, observed_timestamp: int | None = None, @@ -239,6 +239,7 @@ def __init__( resource: Resource | None = None, attributes: _ExtendedAttributes | None = None, limits: LogLimits | None = _UnsetLogLimits, + event_name: str | None = None, ): if trace_id or span_id or trace_flags: warnings.warn(