diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index 1cfff7928099..333f98b7dbfc 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -7,6 +7,8 @@ ### Breaking Changes ### Bugs Fixed +- Modified logic for message body on Microsoft.ApplicationInsights.MessageData to include default message for messages with empty body and export logs + ([#43091](https://github.com/Azure/azure-sdk-for-python/pull/43091)) ### Other Changes diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py index 6a156834a1ea..5f1628fc6b61 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_constants.py @@ -326,4 +326,7 @@ class _RP_Names(Enum): _DEFAULT_AAD_SCOPE = "https://monitor.azure.com//.default" +# Default message for messages(MessageData) with empty body +_DEFAULT_LOG_MESSAGE = "n/a" + # cSpell:disable 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 f062354cdab9..9e3b12f7de39 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 @@ -18,6 +18,7 @@ from azure.monitor.opentelemetry.exporter._constants import ( _EXCEPTION_ENVELOPE_NAME, _MESSAGE_ENVELOPE_NAME, + _DEFAULT_LOG_MESSAGE, ) from azure.monitor.opentelemetry.exporter._generated.models import ( ContextTagKeys, @@ -189,6 +190,9 @@ def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: severity_level=severity_level, # type: ignore properties=properties, ) + data.message = data.message.strip() + if len(data.message) == 0: + data.message = _DEFAULT_LOG_MESSAGE envelope.data = MonitorBase(base_data=data, base_type="MessageData") return envelope 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 2905fcd62386..5c6aa8171ebb 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 @@ -29,6 +29,7 @@ from azure.monitor.opentelemetry.exporter._constants import ( _APPLICATION_INSIGHTS_EVENT_MARKER_ATTRIBUTE, _MICROSOFT_CUSTOM_EVENT_NAME, + _DEFAULT_LOG_MESSAGE, ) from azure.monitor.opentelemetry.exporter._generated.models import ContextTagKeys from azure.monitor.opentelemetry.exporter._utils import ( @@ -132,6 +133,20 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) + cls._log_data_empty_with_whitespaces = _logs.LogData( + _logs.LogRecord( + timestamp=1646865018558419456, + trace_id=125960616039069540489478540494783893221, + span_id=2909973987304607650, + severity_text="WARNING", + trace_flags=None, + severity_number=SeverityNumber.WARN, + body=" ", + resource=Resource.create(attributes={"asd": "test_resource"}), + attributes={"test": "attribute"}, + ), + InstrumentationScope("test_name"), + ) cls._log_data_event = _logs.LogData( _logs.LogRecord( timestamp=1646865018558419456, @@ -410,14 +425,21 @@ def test_log_to_envelope_log_none(self): envelope = exporter._log_to_envelope(self._log_data_none) self.assertEqual(envelope.name, "Microsoft.ApplicationInsights.Message") self.assertEqual(envelope.data.base_type, "MessageData") - self.assertEqual(envelope.data.base_data.message, "") + self.assertEqual(envelope.data.base_data.message, _DEFAULT_LOG_MESSAGE) def test_log_to_envelope_log_empty(self): exporter = self._exporter envelope = exporter._log_to_envelope(self._log_data_empty) self.assertEqual(envelope.name, "Microsoft.ApplicationInsights.Message") self.assertEqual(envelope.data.base_type, "MessageData") - self.assertEqual(envelope.data.base_data.message, "") + self.assertEqual(envelope.data.base_data.message, _DEFAULT_LOG_MESSAGE) + + def test_log_to_envelope_log_empty_with_whitespaces(self): + exporter = self._exporter + envelope = exporter._log_to_envelope(self._log_data_empty_with_whitespaces) + self.assertEqual(envelope.name, "Microsoft.ApplicationInsights.Message") + self.assertEqual(envelope.data.base_type, "MessageData") + self.assertEqual(envelope.data.base_data.message, _DEFAULT_LOG_MESSAGE) def test_log_to_envelope_log_complex_body(self): exporter = self._exporter