From e2103692ffa7e171b8c1e2240deb76851729754c Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Fri, 28 Jun 2024 18:48:34 -0400 Subject: [PATCH 01/11] OTLP exporter encodes invalid trace/span IDs fix --- .../otlp/proto/common/_internal/_log_encoder/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 4252ab7f139..a9647507d18 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 @@ -39,11 +39,14 @@ def encode_logs(batch: Sequence[LogData]) -> ExportLogsServiceRequest: def _encode_log(log_data: LogData) -> PB2LogRecord: + span_id = None if log_data.log_record.span_id == 0 else _encode_span_id(log_data.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) + return PB2LogRecord( time_unix_nano=log_data.log_record.timestamp, observed_time_unix_nano=log_data.log_record.observed_timestamp, - span_id=_encode_span_id(log_data.log_record.span_id), - trace_id=_encode_trace_id(log_data.log_record.trace_id), + span_id=span_id, + trace_id=trace_id, flags=int(log_data.log_record.trace_flags), body=_encode_value(log_data.log_record.body), severity_text=log_data.log_record.severity_text, From 3647d61d32c3288a44ce9bc8429f944065aac087 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Fri, 28 Jun 2024 19:11:42 -0400 Subject: [PATCH 02/11] fix test cases and lint issues --- .../proto/common/_internal/_log_encoder/__init__.py | 13 ++++++++++--- .../tests/test_log_encoder.py | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) 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 a9647507d18..47ff0cf3e0f 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 @@ -39,9 +39,16 @@ def encode_logs(batch: Sequence[LogData]) -> ExportLogsServiceRequest: def _encode_log(log_data: LogData) -> PB2LogRecord: - span_id = None if log_data.log_record.span_id == 0 else _encode_span_id(log_data.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) - + span_id = ( + None + if log_data.log_record.span_id == 0 + else _encode_span_id(log_data.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) + ) return PB2LogRecord( time_unix_nano=log_data.log_record.timestamp, observed_time_unix_nano=log_data.log_record.observed_timestamp, diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py index 58620b963ea..158940585c1 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py @@ -239,8 +239,8 @@ def get_test_logs( PB2LogRecord( time_unix_nano=1644650249738562048, observed_time_unix_nano=1644650249738562049, - trace_id=_encode_trace_id(0), - span_id=_encode_span_id(0), + trace_id=None, + span_id=None, flags=int(TraceFlags.DEFAULT), severity_text="WARN", severity_number=SeverityNumber.WARN.value, From 6dc18af98dfbe991ae77289aadd282a4ac930f3b Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Mon, 1 Jul 2024 10:17:06 -0400 Subject: [PATCH 03/11] updated changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ef0e42824c..50a9a3fa0ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#3991](https://github.com/open-telemetry/opentelemetry-python/pull/3991)) ## Version 1.25.0/0.46b0 (2024-05-30) - +- OTLP exporter is encoding invalid span/trace IDs in the logs fix + ([#4006](https://github.com/open-telemetry/opentelemetry-python/pull/4006)) - Fix class BoundedAttributes to have RLock rather than Lock ([#3859](https://github.com/open-telemetry/opentelemetry-python/pull/3859)) - Remove thread lock by loading RuntimeContext explicitly. From 14965513c81320d51943574c63bfbe715cc47353 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Mon, 1 Jul 2024 10:40:02 -0400 Subject: [PATCH 04/11] update changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50a9a3fa0ec..72e6c0af2a3 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 +- OTLP exporter is encoding invalid span/trace IDs in the logs fix + ([#4006](https://github.com/open-telemetry/opentelemetry-python/pull/4006)) - Do not execute Flask Tests in debug mode ([#3956](https://github.com/open-telemetry/opentelemetry-python/pull/3956)) - When encountering an error encoding metric attributes in the OTLP exporter, log the key that had an error. @@ -36,8 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#3991](https://github.com/open-telemetry/opentelemetry-python/pull/3991)) ## Version 1.25.0/0.46b0 (2024-05-30) -- OTLP exporter is encoding invalid span/trace IDs in the logs fix - ([#4006](https://github.com/open-telemetry/opentelemetry-python/pull/4006)) + - Fix class BoundedAttributes to have RLock rather than Lock ([#3859](https://github.com/open-telemetry/opentelemetry-python/pull/3859)) - Remove thread lock by loading RuntimeContext explicitly. From be59ef76ebdaf13114da987d3a8a2a668451e2b8 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Wed, 3 Jul 2024 11:43:39 -0400 Subject: [PATCH 05/11] initial commit --- .../tests/logs/test_otlp_logs_exporter.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index c281cbebce1..cef7bbaaf6d 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -167,6 +167,36 @@ def setUp(self): "third_name", "third_version" ), ) + self.log_data_4 = LogData( + log_record=LogRecord( + timestamp=int(time.time() * 1e9), + trace_id=0, + span_id=5213367945872657629, + trace_flags=TraceFlags(0x01), + severity_text="ERROR", + severity_number=SeverityNumber.WARN, + body="Invalid trace id check", + resource=SDKResource({"service": "myapp"}), + ), + instrumentation_scope=InstrumentationScope( + "fourth_name", "fourth_version" + ), + ) + self.log_data_5 = LogData( + log_record=LogRecord( + timestamp=int(time.time() * 1e9), + trace_id=2604504634922341076776623263868986801, + span_id=0, + trace_flags=TraceFlags(0x01), + severity_text="ERROR", + severity_number=SeverityNumber.WARN, + body="Invalid span id check", + resource=SDKResource({"service": "myapp"}), + ), + instrumentation_scope=InstrumentationScope( + "fifth_name", "fifth_version" + ), + ) def tearDown(self): self.server.stop(None) @@ -342,6 +372,10 @@ def test_failure(self): self.exporter.export([self.log_data_1]), LogExportResult.FAILURE ) + def test_exported_log_without_trace_id(self): + export_result = self.exporter.export([self.log_data_4]) + self.assertEqual(export_result, LogExportResult.SUCCESS) + def test_translate_log_data(self): expected = ExportLogsServiceRequest( From 3fbd9a9599b430747e3704c9d6d00b2bb97818d9 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Wed, 3 Jul 2024 11:44:38 -0400 Subject: [PATCH 06/11] initial commit --- .../tests/logs/test_otlp_logs_exporter.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index cef7bbaaf6d..1578d5b9551 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -373,8 +373,14 @@ def test_failure(self): ) def test_exported_log_without_trace_id(self): - export_result = self.exporter.export([self.log_data_4]) - self.assertEqual(export_result, LogExportResult.SUCCESS) + translated_data = self.exporter._translate_data([self.log_data_4]) + log_record = translated_data.resource_logs[0].scope_logs[0].log_records[0] + self.assertFalse(log_record.HasField("trace_id")) + + def test_exported_log_without_span_id(self): + translated_data = self.exporter._translate_data([self.log_data_5]) + log_record = translated_data.resource_logs[0].scope_logs[0].log_records[0] + self.assertFalse(log_record.HasField("trace_id")) def test_translate_log_data(self): From 2eb33a74cf0dc2e3aa0df5cc24d9f6f4908d5807 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Wed, 3 Jul 2024 15:50:18 -0400 Subject: [PATCH 07/11] added test cases --- .../tests/logs/test_otlp_logs_exporter.py | 18 ++-- .../tests/test_proto_log_exporter.py | 82 ++++++++++++++++++- 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index 1578d5b9551..c28ede2511c 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -180,7 +180,7 @@ def setUp(self): ), instrumentation_scope=InstrumentationScope( "fourth_name", "fourth_version" - ), + ), ) self.log_data_5 = LogData( log_record=LogRecord( @@ -195,7 +195,7 @@ def setUp(self): ), instrumentation_scope=InstrumentationScope( "fifth_name", "fifth_version" - ), + ), ) def tearDown(self): @@ -374,13 +374,19 @@ def test_failure(self): def test_exported_log_without_trace_id(self): translated_data = self.exporter._translate_data([self.log_data_4]) - log_record = translated_data.resource_logs[0].scope_logs[0].log_records[0] - self.assertFalse(log_record.HasField("trace_id")) + log_record = ( + translated_data.resource_logs[0].scope_logs[0].log_records[0] + ) + self.assertFalse(log_record.trace_id) + self.assertTrue(log_record.span_id) def test_exported_log_without_span_id(self): translated_data = self.exporter._translate_data([self.log_data_5]) - log_record = translated_data.resource_logs[0].scope_logs[0].log_records[0] - self.assertFalse(log_record.HasField("trace_id")) + log_record = ( + translated_data.resource_logs[0].scope_logs[0].log_records[0] + ) + self.assertFalse(log_record.span_id) + self.assertTrue(log_record.trace_id) def test_translate_log_data(self): diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index 6b6aafd465f..7946ccecec9 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -17,10 +17,9 @@ import unittest from typing import List from unittest.mock import MagicMock, Mock, call, patch - import requests import responses - +from google.protobuf.json_format import MessageToDict from opentelemetry._logs import SeverityNumber from opentelemetry.exporter.otlp.proto.http import Compression from opentelemetry.exporter.otlp.proto.http._log_exporter import ( @@ -30,6 +29,9 @@ DEFAULT_TIMEOUT, OTLPLogExporter, ) +from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( + ExportLogsServiceRequest, +) from opentelemetry.exporter.otlp.proto.http.version import __version__ from opentelemetry.sdk._logs import LogData from opentelemetry.sdk._logs import LogRecord as SDKLogRecord @@ -167,6 +169,82 @@ def test_exporter_env(self): ) self.assertIsInstance(exporter._session, requests.Session) + @patch("requests.Session.post") + def test_exported_log_without_trace_id(self, mock_post): + exporter = OTLPLogExporter() + log = LogData( + log_record=SDKLogRecord( + timestamp=1644650195189786182, + trace_id=0, + span_id=1312458408527513292, + trace_flags=TraceFlags(0x01), + severity_text="WARN", + severity_number=SeverityNumber.WARN, + body="Invalid trace id check", + resource=SDKResource({"first_resource": "value"}), + attributes={"a": 1, "b": "c"}, + ), + instrumentation_scope=InstrumentationScope("name", "version"), + ) + exporter.export([log]) + request_body = mock_post.call_args[1]["data"] + request = ExportLogsServiceRequest() + request.ParseFromString(request_body) + request_dict = MessageToDict(request) + log_records = ( + request_dict.get("resourceLogs")[0] + .get("scopeLogs")[0] + .get("logRecords") + ) + if log_records: + log_record = log_records[0] + self.assertIn("spanId", log_record) + self.assertNotIn( + "traceId", + log_record, + "trace_id should not be present in the log record", + ) + else: + self.fail("No log records found") + + @patch("requests.Session.post") + def test_exported_log_without_span_id(self, mock_post): + exporter = OTLPLogExporter() + log = LogData( + log_record=SDKLogRecord( + timestamp=1644650195189786360, + trace_id=89564621134313219400156819398935297696, + span_id=0, + trace_flags=TraceFlags(0x01), + severity_text="WARN", + severity_number=SeverityNumber.WARN, + body="Invalid span id check", + resource=SDKResource({"first_resource": "value"}), + attributes={"a": 1, "b": "c"}, + ), + instrumentation_scope=InstrumentationScope("name", "version"), + ) + exporter.export([log]) + request_body = mock_post.call_args[1]["data"] + request = ExportLogsServiceRequest() + request.ParseFromString(request_body) + request_dict = MessageToDict(request) + log_records = ( + request_dict.get("resourceLogs")[0] + .get("scopeLogs")[0] + .get("logRecords") + ) + if log_records: + log_record = log_records[0] + self.assertIn("traceId", log_record) + self.assertNotIn( + "spanId", + log_record, + "spanId should not be present in the log record", + ) + else: + self.fail("No log records found") + @responses.activate @patch("opentelemetry.exporter.otlp.proto.http._log_exporter.sleep") def test_exponential_backoff(self, mock_sleep): From ba6b2631ffd916ebcf4c5dee02d351e7b9a91950 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Wed, 3 Jul 2024 16:06:31 -0400 Subject: [PATCH 08/11] fix linting issues --- .../tests/test_proto_log_exporter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index 7946ccecec9..693744b63c8 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -17,9 +17,11 @@ import unittest from typing import List from unittest.mock import MagicMock, Mock, call, patch + import requests import responses from google.protobuf.json_format import MessageToDict + from opentelemetry._logs import SeverityNumber from opentelemetry.exporter.otlp.proto.http import Compression from opentelemetry.exporter.otlp.proto.http._log_exporter import ( @@ -29,10 +31,10 @@ DEFAULT_TIMEOUT, OTLPLogExporter, ) +from opentelemetry.exporter.otlp.proto.http.version import __version__ from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ) -from opentelemetry.exporter.otlp.proto.http.version import __version__ from opentelemetry.sdk._logs import LogData from opentelemetry.sdk._logs import LogRecord as SDKLogRecord from opentelemetry.sdk._logs.export import LogExportResult From 65cd351c6728d241904eaac6d5f4f738c2eaa0b4 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Wed, 3 Jul 2024 16:31:47 -0400 Subject: [PATCH 09/11] fixing lint issues --- .../tests/logs/test_otlp_logs_exporter.py | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index c28ede2511c..063b6687ea4 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -21,6 +21,7 @@ from google.protobuf.duration_pb2 import ( # pylint: disable=no-name-in-module Duration, ) +from google.protobuf.json_format import MessageToDict from google.rpc.error_details_pb2 import RetryInfo from grpc import ChannelCredentials, Compression, StatusCode, server @@ -373,20 +374,44 @@ def test_failure(self): ) def test_exported_log_without_trace_id(self): + # pylint: disable=protected-access translated_data = self.exporter._translate_data([self.log_data_4]) - log_record = ( - translated_data.resource_logs[0].scope_logs[0].log_records[0] + request_dict = MessageToDict(translated_data) + log_records = ( + request_dict.get("resourceLogs")[0] + .get("scopeLogs")[0] + .get("logRecords") ) - self.assertFalse(log_record.trace_id) - self.assertTrue(log_record.span_id) + if log_records: + log_record = log_records[0] + self.assertIn("spanId", log_record) + self.assertNotIn( + "traceId", + log_record, + "traceId should not be present in the log record", + ) + else: + self.fail("No log records found") def test_exported_log_without_span_id(self): + # pylint: disable=protected-access translated_data = self.exporter._translate_data([self.log_data_5]) - log_record = ( - translated_data.resource_logs[0].scope_logs[0].log_records[0] + request_dict = MessageToDict(translated_data) + log_records = ( + request_dict.get("resourceLogs")[0] + .get("scopeLogs")[0] + .get("logRecords") ) - self.assertFalse(log_record.span_id) - self.assertTrue(log_record.trace_id) + if log_records: + log_record = log_records[0] + self.assertIn("traceId", log_record) + self.assertNotIn( + "spanId", + log_record, + "spanId should not be present in the log record", + ) + else: + self.fail("No log records found") def test_translate_log_data(self): From 4cbefa7e1dd7991228b3db573a14fda6ca8c6c18 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Mon, 8 Jul 2024 14:30:20 -0400 Subject: [PATCH 10/11] refactored tests --- .../tests/logs/test_otlp_logs_exporter.py | 17 ++++---- .../tests/test_proto_log_exporter.py | 41 ++++++++----------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index 063b6687ea4..b81fa4e7bbc 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -373,15 +373,19 @@ def test_failure(self): self.exporter.export([self.log_data_1]), LogExportResult.FAILURE ) - def test_exported_log_without_trace_id(self): + def export_log_and_deserialize(self, log_data): # pylint: disable=protected-access - translated_data = self.exporter._translate_data([self.log_data_4]) + translated_data = self.exporter._translate_data([log_data]) request_dict = MessageToDict(translated_data) log_records = ( request_dict.get("resourceLogs")[0] .get("scopeLogs")[0] .get("logRecords") ) + return log_records + + def test_exported_log_without_trace_id(self): + log_records = self.export_log_and_deserialize(self.log_data_4) if log_records: log_record = log_records[0] self.assertIn("spanId", log_record) @@ -394,14 +398,7 @@ def test_exported_log_without_trace_id(self): self.fail("No log records found") def test_exported_log_without_span_id(self): - # pylint: disable=protected-access - translated_data = self.exporter._translate_data([self.log_data_5]) - request_dict = MessageToDict(translated_data) - log_records = ( - request_dict.get("resourceLogs")[0] - .get("scopeLogs")[0] - .get("logRecords") - ) + log_records = self.export_log_and_deserialize(self.log_data_5) if log_records: log_record = log_records[0] self.assertIn("traceId", log_record) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index 693744b63c8..99ec4ea53a1 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -172,8 +172,21 @@ def test_exporter_env(self): self.assertIsInstance(exporter._session, requests.Session) @patch("requests.Session.post") - def test_exported_log_without_trace_id(self, mock_post): + def export_log_and_deserialize(self, log, mock_post): exporter = OTLPLogExporter() + exporter.export([log]) + request_body = mock_post.call_args[1]["data"] + request = ExportLogsServiceRequest() + request.ParseFromString(request_body) + request_dict = MessageToDict(request) + log_records = ( + request_dict.get("resourceLogs")[0] + .get("scopeLogs")[0] + .get("logRecords") + ) + return log_records + + def test_exported_log_without_trace_id(self): log = LogData( log_record=SDKLogRecord( timestamp=1644650195189786182, @@ -188,16 +201,7 @@ def test_exported_log_without_trace_id(self, mock_post): ), instrumentation_scope=InstrumentationScope("name", "version"), ) - exporter.export([log]) - request_body = mock_post.call_args[1]["data"] - request = ExportLogsServiceRequest() - request.ParseFromString(request_body) - request_dict = MessageToDict(request) - log_records = ( - request_dict.get("resourceLogs")[0] - .get("scopeLogs")[0] - .get("logRecords") - ) + log_records = self.export_log_and_deserialize(log) if log_records: log_record = log_records[0] self.assertIn("spanId", log_record) @@ -209,9 +213,7 @@ def test_exported_log_without_trace_id(self, mock_post): else: self.fail("No log records found") - @patch("requests.Session.post") - def test_exported_log_without_span_id(self, mock_post): - exporter = OTLPLogExporter() + def test_exported_log_without_span_id(self): log = LogData( log_record=SDKLogRecord( timestamp=1644650195189786360, @@ -226,16 +228,7 @@ def test_exported_log_without_span_id(self, mock_post): ), instrumentation_scope=InstrumentationScope("name", "version"), ) - exporter.export([log]) - request_body = mock_post.call_args[1]["data"] - request = ExportLogsServiceRequest() - request.ParseFromString(request_body) - request_dict = MessageToDict(request) - log_records = ( - request_dict.get("resourceLogs")[0] - .get("scopeLogs")[0] - .get("logRecords") - ) + log_records = self.export_log_and_deserialize(log) if log_records: log_record = log_records[0] self.assertIn("traceId", log_record) From 7f6b95c0974e9963334e269240057275f227e858 Mon Sep 17 00:00:00 2001 From: soumyadeepm04 Date: Mon, 8 Jul 2024 15:14:59 -0400 Subject: [PATCH 11/11] fixed lint issue --- .../tests/test_proto_log_exporter.py | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index 99ec4ea53a1..e92ea389afb 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -171,20 +171,21 @@ def test_exporter_env(self): ) self.assertIsInstance(exporter._session, requests.Session) - @patch("requests.Session.post") - def export_log_and_deserialize(self, log, mock_post): - exporter = OTLPLogExporter() - exporter.export([log]) - request_body = mock_post.call_args[1]["data"] - request = ExportLogsServiceRequest() - request.ParseFromString(request_body) - request_dict = MessageToDict(request) - log_records = ( - request_dict.get("resourceLogs")[0] - .get("scopeLogs")[0] - .get("logRecords") - ) - return log_records + @staticmethod + def export_log_and_deserialize(log): + with patch("requests.Session.post") as mock_post: + exporter = OTLPLogExporter() + exporter.export([log]) + request_body = mock_post.call_args[1]["data"] + request = ExportLogsServiceRequest() + request.ParseFromString(request_body) + request_dict = MessageToDict(request) + log_records = ( + request_dict.get("resourceLogs")[0] + .get("scopeLogs")[0] + .get("logRecords") + ) + return log_records def test_exported_log_without_trace_id(self): log = LogData( @@ -201,7 +202,7 @@ def test_exported_log_without_trace_id(self): ), instrumentation_scope=InstrumentationScope("name", "version"), ) - log_records = self.export_log_and_deserialize(log) + log_records = TestOTLPHTTPLogExporter.export_log_and_deserialize(log) if log_records: log_record = log_records[0] self.assertIn("spanId", log_record) @@ -228,7 +229,7 @@ def test_exported_log_without_span_id(self): ), instrumentation_scope=InstrumentationScope("name", "version"), ) - log_records = self.export_log_and_deserialize(log) + log_records = TestOTLPHTTPLogExporter.export_log_and_deserialize(log) if log_records: log_record = log_records[0] self.assertIn("traceId", log_record)