From e7dd9b62fff32efb254af6620595449c238df7d0 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Mon, 30 Mar 2026 12:05:21 -0700 Subject: [PATCH 1/8] Add instrumentation scope --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py index 362d9ccc88c0..8165c622c1d0 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py @@ -182,6 +182,12 @@ def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> Telemetr stack_trace = log_record.attributes.get(EXCEPTION_STACKTRACE) severity_level = _get_severity_level(log_record.severity_number) + instrumentation_scope = readable_log_record.instrumentation_scope + if instrumentation_scope is not None and hasattr(instrumentation_scope, "name"): + properties["code.instrumentation_scope_name"] = instrumentation_scope.name + pass + + # Exception telemetry if exc_type is not None or exc_message is not None: envelope.name = _EXCEPTION_ENVELOPE_NAME From 566df3ec4e86e189d9c81990a9b664cf71af2ed6 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Tue, 31 Mar 2026 15:33:44 -0700 Subject: [PATCH 2/8] Fix property name --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py index 8165c622c1d0..3b5d41a6a9ae 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py @@ -184,8 +184,7 @@ def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> Telemetr instrumentation_scope = readable_log_record.instrumentation_scope if instrumentation_scope is not None and hasattr(instrumentation_scope, "name"): - properties["code.instrumentation_scope_name"] = instrumentation_scope.name - pass + properties["code.logger_name"] = instrumentation_scope.name # Exception telemetry From c0d94297a7b77b9735b60d22b7ebc215ab9dcbca Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Wed, 1 Apr 2026 15:59:11 -0700 Subject: [PATCH 3/8] Modify logic --- .../opentelemetry/exporter/export/logs/_exporter.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py index 3b5d41a6a9ae..620c69be3bc7 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py @@ -182,10 +182,11 @@ def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> Telemetr stack_trace = log_record.attributes.get(EXCEPTION_STACKTRACE) severity_level = _get_severity_level(log_record.severity_number) - instrumentation_scope = readable_log_record.instrumentation_scope - if instrumentation_scope is not None and hasattr(instrumentation_scope, "name"): - properties["code.logger_name"] = instrumentation_scope.name - + if readable_log_record and readable_log_record.instrumentation_scope is not None: + instrumentation_scope = readable_log_record.instrumentation_scope + if instrumentation_scope is not None and hasattr(instrumentation_scope, "name"): + properties["logger_name"] = str(instrumentation_scope.name) + # Exception telemetry if exc_type is not None or exc_message is not None: From d46d7ef586e4762c84d08f347fe6c473afd390d5 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Thu, 2 Apr 2026 17:00:55 -0700 Subject: [PATCH 4/8] Add unit tests and CHANGELOG --- .../azure-monitor-opentelemetry-exporter/CHANGELOG.md | 2 ++ .../tests/logs/test_logs.py | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index d47cb351c920..4b5065b10776 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -3,6 +3,8 @@ ## 1.0.0b51 (Unreleased) ### Features Added +- Add logger name to custom dimensions for Message, Exception and Event telemetry + ### Breaking Changes diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py index f45efc1dc3b1..52dc14d5744b 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py @@ -232,7 +232,7 @@ def setUpClass(cls): }, ), resource=Resource.create(attributes={"asd": "test_resource"}), - instrumentation_scope=InstrumentationScope("test_name"), + instrumentation_scope=InstrumentationScope("custom-event-logger"), ) cls._exc_data = _logs.ReadWriteLogRecord( LogRecord( @@ -283,7 +283,7 @@ def setUpClass(cls): }, ), resource=Resource.create(attributes={"asd": "test_resource"}), - instrumentation_scope=InstrumentationScope("test_name"), + instrumentation_scope=InstrumentationScope("blank_exception_logger"), ) cls._exc_data_empty = _logs.ReadWriteLogRecord( LogRecord( @@ -467,6 +467,7 @@ def test_log_to_envelope_user_fields(self): self.assertEqual(envelope.tags.get(ContextTagKeys.AI_USER_ID), "test-user") self.assertNotIn("enduser.id", envelope.data.base_data.properties) self.assertNotIn("enduser.pseudo.id", envelope.data.base_data.properties) + self.assertEqual(envelope.data.base_data.properties.get("logger_name"), "test_name") def test_log_to_envelope_log_none(self): exporter = self._exporter @@ -577,6 +578,8 @@ def test_log_to_envelope_exception_with_blank_exception(self): self.assertEqual(envelope.data.base_data.exceptions[0].message, "test exception") self.assertTrue(envelope.data.base_data.exceptions[0].has_full_stack) self.assertEqual(envelope.data.base_data.exceptions[0].stack, "") + self.assertEqual(envelope.data.base_data.properties.get("logger_name"), "blank_exception_logger") + def test_log_to_envelope_event(self): exporter = self._exporter @@ -618,6 +621,7 @@ def test_log_to_envelope_custom_event(self): self.assertEqual(envelope.data.base_type, "EventData") self.assertEqual(envelope.data.base_data.name, "event_name") self.assertEqual(envelope.data.base_data.properties["event_key"], "event_attribute") + self.assertEqual(self._log_data_custom_event.instrumentation_scope.name, "custom-event-logger") def test_log_to_envelope_timestamp(self): exporter = self._exporter From 910655c607facfa6284596c2926722c15953eeb4 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Thu, 2 Apr 2026 17:09:26 -0700 Subject: [PATCH 5/8] Update CHANGELOG --- sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index 4b5065b10776..8d092d177950 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -4,7 +4,7 @@ ### Features Added - Add logger name to custom dimensions for Message, Exception and Event telemetry - + ([#46096](https://github.com/Azure/azure-sdk-for-python/pull/46096)) ### Breaking Changes From 398fd3c7d8224cd0d56aa7d0daddfc8b4c9882f3 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Thu, 2 Apr 2026 17:10:31 -0700 Subject: [PATCH 6/8] Remove duplicate check --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py index 620c69be3bc7..736e81ad59d4 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py @@ -184,7 +184,7 @@ def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> Telemetr if readable_log_record and readable_log_record.instrumentation_scope is not None: instrumentation_scope = readable_log_record.instrumentation_scope - if instrumentation_scope is not None and hasattr(instrumentation_scope, "name"): + if hasattr(instrumentation_scope, "name"): properties["logger_name"] = str(instrumentation_scope.name) From 9e96eabb77465b0f8630daab832484422bb671ee Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Fri, 3 Apr 2026 09:03:29 -0700 Subject: [PATCH 7/8] Fix lint and format --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 1 - .../azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py | 1 - 2 files changed, 2 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py index 736e81ad59d4..3abdcfc58ce4 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py @@ -186,7 +186,6 @@ def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> Telemetr instrumentation_scope = readable_log_record.instrumentation_scope if hasattr(instrumentation_scope, "name"): properties["logger_name"] = str(instrumentation_scope.name) - # Exception telemetry if exc_type is not None or exc_message is not None: diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py index 52dc14d5744b..a266abd9b0f3 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py @@ -580,7 +580,6 @@ def test_log_to_envelope_exception_with_blank_exception(self): self.assertEqual(envelope.data.base_data.exceptions[0].stack, "") self.assertEqual(envelope.data.base_data.properties.get("logger_name"), "blank_exception_logger") - def test_log_to_envelope_event(self): exporter = self._exporter envelope = exporter._log_to_envelope(self._log_data_event) From 39a91fd1ded1be7f97d72506767b29c92b8d8f0a Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Fri, 3 Apr 2026 10:12:21 -0700 Subject: [PATCH 8/8] Addressed comments --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 4 ++-- .../tests/logs/test_logs.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py index 3abdcfc58ce4..a1c374dff5f0 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/logs/_exporter.py @@ -184,8 +184,8 @@ def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> Telemetr if readable_log_record and readable_log_record.instrumentation_scope is not None: instrumentation_scope = readable_log_record.instrumentation_scope - if hasattr(instrumentation_scope, "name"): - properties["logger_name"] = str(instrumentation_scope.name) + if hasattr(instrumentation_scope, "name") and instrumentation_scope.name is not None: + properties.setdefault("logger_name", str(instrumentation_scope.name)) # Exception telemetry if exc_type is not None or exc_message is not None: diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py index a266abd9b0f3..6014b52e0e13 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/logs/test_logs.py @@ -620,7 +620,7 @@ def test_log_to_envelope_custom_event(self): self.assertEqual(envelope.data.base_type, "EventData") self.assertEqual(envelope.data.base_data.name, "event_name") self.assertEqual(envelope.data.base_data.properties["event_key"], "event_attribute") - self.assertEqual(self._log_data_custom_event.instrumentation_scope.name, "custom-event-logger") + self.assertEqual(envelope.data.base_data.properties.get("logger_name"), "custom-event-logger") def test_log_to_envelope_timestamp(self): exporter = self._exporter