diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index d47cb351c920..8d092d177950 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 + ([#46096](https://github.com/Azure/azure-sdk-for-python/pull/46096)) ### Breaking Changes 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..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 @@ -182,6 +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) + 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") 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: envelope.name = _EXCEPTION_ENVELOPE_NAME 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..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 @@ -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,7 @@ 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 +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(envelope.data.base_data.properties.get("logger_name"), "custom-event-logger") def test_log_to_envelope_timestamp(self): exporter = self._exporter