diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index 333f98b7dbfc..62ee9ec1c35a 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -5,6 +5,8 @@ ### Features Added ### Breaking Changes +- Fix to accomodate breaking log changes from Otel + ([#43626](https://github.com/Azure/azure-sdk-for-python/pull/43626)) ### Bugs Fixed - Modified logic for message body on Microsoft.ApplicationInsights.MessageData to include default message for messages with empty body and export logs diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_manager.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_manager.py index ec7c0d289d66..34d53c376a39 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_manager.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_manager.py @@ -9,7 +9,7 @@ from opentelemetry import metrics from opentelemetry.metrics import CallbackOptions, Observation -from opentelemetry.sdk._logs import LogData +from opentelemetry.sdk._logs import ReadableLogRecord from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.semconv.attributes.exception_attributes import ( EXCEPTION_MESSAGE, @@ -632,13 +632,13 @@ def _record_span(self, span: ReadableSpan) -> None: except Exception: # pylint: disable=broad-except _logger.exception("Exception occurred while recording span.") # pylint: disable=C4769 - def _record_log_record(self, log_data: LogData) -> None: + def _record_log_record(self, readable_log_record: ReadableLogRecord) -> None: try: # pylint: disable=global-statement global _EXCEPTIONS_COUNT - if log_data.log_record: + if readable_log_record.log_record: exc_type = None - log_record = log_data.log_record + log_record = readable_log_record.log_record if log_record.attributes: exc_type = log_record.attributes.get(EXCEPTION_TYPE) exc_message = log_record.attributes.get(EXCEPTION_MESSAGE) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_processor.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_processor.py index 8c42fc7b379f..f31e9318007c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_processor.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_performance_counters/_processor.py @@ -1,7 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -from opentelemetry.sdk._logs import LogData, LogRecordProcessor +from opentelemetry.sdk._logs import ReadableLogRecord, LogRecordProcessor from opentelemetry.sdk.trace import ReadableSpan, SpanProcessor from azure.monitor.opentelemetry.exporter._performance_counters._manager import _PerformanceCountersManager @@ -13,18 +13,18 @@ def __init__(self): super().__init__() self.call_on_emit = hasattr(super(), 'on_emit') - def on_emit(self, log_data: LogData) -> None: # type: ignore + def on_emit(self, readable_log_record: ReadableLogRecord) -> None: # type: ignore pcm = _PerformanceCountersManager() if pcm: - pcm._record_log_record(log_data) + pcm._record_log_record(readable_log_record) if self.call_on_emit: - super().on_emit(log_data) # type: ignore[safe-super] + super().on_emit(readable_log_record) # type: ignore[safe-super] else: # this method was removed in opentelemetry-sdk and replaced with on_emit - super().emit(log_data) # type: ignore[safe-super,misc] # pylint: disable=no-member + super().emit(readable_log_record) # type: ignore[safe-super,misc] # pylint: disable=no-member - def emit(self, log_data: LogData) -> None: - self.on_emit(log_data) + def emit(self, readable_log_record: ReadableLogRecord) -> None: + self.on_emit(readable_log_record) def shutdown(self): pass diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_manager.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_manager.py index 533cdc83247a..e6d5c8aa4077 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_manager.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_manager.py @@ -9,7 +9,7 @@ import psutil -from opentelemetry.sdk._logs import LogData +from opentelemetry.sdk._logs import ReadableLogRecord from opentelemetry.sdk.metrics import MeterProvider, Meter from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import ReadableSpan @@ -353,7 +353,7 @@ def _record_span(self, span: ReadableSpan) -> None: except Exception as e: # pylint: disable=broad-except _logger.exception("Exception occurred while recording span: %s", e) # pylint: disable=C4769 - def _record_log_record(self, log_data: LogData) -> None: + def _record_log_record(self, readable_log_record: ReadableLogRecord) -> None: # Only record if in post state and manager is initialized if not (_is_post_state() and self.is_initialized()): return @@ -364,9 +364,9 @@ def _record_log_record(self, log_data: LogData) -> None: return try: - if log_data.log_record: + if readable_log_record.log_record: exc_type = None - log_record = log_data.log_record + log_record = readable_log_record.log_record if log_record.attributes: exc_type = log_record.attributes.get(SpanAttributes.EXCEPTION_TYPE) exc_message = log_record.attributes.get(SpanAttributes.EXCEPTION_MESSAGE) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_processor.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_processor.py index 97414109ea29..d075f3b57b88 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_processor.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_processor.py @@ -1,7 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -from opentelemetry.sdk._logs import LogData, LogRecordProcessor +from opentelemetry.sdk._logs import ReadableLogRecord, LogRecordProcessor from opentelemetry.sdk.trace import ReadableSpan, SpanProcessor from azure.monitor.opentelemetry.exporter._quickpulse._state import get_quickpulse_manager @@ -13,18 +13,18 @@ def __init__(self): super().__init__() self.call_on_emit = hasattr(super(), 'on_emit') - def on_emit(self, log_data: LogData) -> None: # type: ignore + def on_emit(self, readable_log_record: ReadableLogRecord) -> None: # type: ignore qpm = get_quickpulse_manager() if qpm: - qpm._record_log_record(log_data) + qpm._record_log_record(readable_log_record) if self.call_on_emit: - super().on_emit(log_data) # type: ignore[safe-super] + super().on_emit(readable_log_record) # type: ignore[safe-super] else: # this method was removed in opentelemetry-sdk and replaced with on_emit - super().emit(log_data) # type: ignore[safe-super,misc] # pylint: disable=no-member + super().emit(readable_log_record) # type: ignore[safe-super,misc] # pylint: disable=no-member - def emit(self, log_data: LogData) -> None: - self.on_emit(log_data) + def emit(self, readable_log_record: ReadableLogRecord) -> None: + self.on_emit(readable_log_record) def shutdown(self): pass diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_types.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_types.py index 810c3f91fe3b..8a2c05310164 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_types.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_types.py @@ -177,7 +177,7 @@ def _from_log_record(log_record: LogRecord): @staticmethod @no_type_check - def _from_span_event(span_event: Event): + def _from_span_event(span_event: LogRecord.event_name): return _ExceptionData( message=str(span_event.attributes.get(SpanAttributes.EXCEPTION_MESSAGE, "")), stack_trace=str(span_event.attributes.get(SpanAttributes.EXCEPTION_STACKTRACE, "")), 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 9e3b12f7de39..420612d5f30f 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 @@ -11,8 +11,8 @@ EXCEPTION_STACKTRACE, EXCEPTION_TYPE, ) -from opentelemetry.sdk._logs import LogData -from opentelemetry.sdk._logs.export import LogExporter, LogExportResult +from opentelemetry.sdk._logs import ReadableLogRecord +from opentelemetry.sdk._logs.export import LogRecordExporter, LogRecordExportResult from azure.monitor.opentelemetry.exporter import _utils from azure.monitor.opentelemetry.exporter._constants import ( @@ -53,16 +53,16 @@ __all__ = ["AzureMonitorLogExporter"] -class AzureMonitorLogExporter(BaseExporter, LogExporter): +class AzureMonitorLogExporter(BaseExporter, LogRecordExporter): """Azure Monitor Log exporter for OpenTelemetry.""" - def export(self, batch: Sequence[LogData], **kwargs: Any) -> LogExportResult: # pylint: disable=unused-argument + def export(self, batch: Sequence[ReadableLogRecord], **kwargs: Any) -> LogRecordExportResult: # pylint: disable=unused-argument """Export log data. - :param batch: OpenTelemetry LogData(s) to export. - :type batch: ~typing.Sequence[~opentelemetry._logs.LogData] + :param batch: OpenTelemetry ReadableLogRecord(s) to export. + :type batch: ~typing.Sequence[~opentelemetry._logs.ReadableLogRecord] :return: The result of the export. - :rtype: ~opentelemetry.sdk._logs.export.LogData + :rtype: ~opentelemetry.sdk._logs.export.ReadableLogRecord """ envelopes = [self._log_to_envelope(log) for log in batch] try: @@ -81,8 +81,8 @@ def shutdown(self) -> None: if self.storage: self.storage.close() - def _log_to_envelope(self, log_data: LogData) -> TelemetryItem: - envelope = _convert_log_to_envelope(log_data) + def _log_to_envelope(self, readable_log_record: ReadableLogRecord) -> TelemetryItem: + envelope = _convert_log_to_envelope(readable_log_record) envelope.instrumentation_key = self._instrumentation_key return envelope @@ -106,8 +106,8 @@ def from_connection_string(cls, conn_str: str, **kwargs: Any) -> "AzureMonitorLo return cls(connection_string=conn_str, **kwargs) -def _log_data_is_event(log_data: LogData) -> bool: - log_record = log_data.log_record +def _log_data_is_event(readable_log_record: ReadableLogRecord) -> bool: + log_record = readable_log_record.log_record is_event = None if log_record.attributes: is_event = log_record.attributes.get(_MICROSOFT_CUSTOM_EVENT_NAME) or \ @@ -116,8 +116,8 @@ def _log_data_is_event(log_data: LogData) -> bool: # pylint: disable=protected-access -def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: - log_record = log_data.log_record +def _convert_log_to_envelope(readable_log_record: ReadableLogRecord) -> TelemetryItem: + log_record = readable_log_record.log_record time_stamp = log_record.timestamp if log_record.timestamp is not None else log_record.observed_timestamp envelope = _utils._create_telemetry_item(time_stamp) envelope.tags.update(_utils._populate_part_a_fields(log_record.resource)) # type: ignore @@ -168,7 +168,7 @@ def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: exceptions=[exc_details], ) envelope.data = MonitorBase(base_data=data, base_type="ExceptionData") - elif _log_data_is_event(log_data): # Event telemetry + elif _log_data_is_event(readable_log_record): # Event telemetry _set_statsbeat_custom_events_feature() envelope.name = "Microsoft.ApplicationInsights.Event" event_name = "" @@ -198,10 +198,10 @@ def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: return envelope -def _get_log_export_result(result: ExportResult) -> LogExportResult: +def _get_log_export_result(result: ExportResult) -> LogRecordExportResult: if result == ExportResult.SUCCESS: - return LogExportResult.SUCCESS - return LogExportResult.FAILURE + return LogRecordExportResult.SUCCESS + return LogRecordExportResult.FAILURE # pylint: disable=line-too-long 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 5c6aa8171ebb..561af1416a22 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 @@ -17,7 +17,7 @@ from opentelemetry.sdk import _logs from opentelemetry.sdk.util.instrumentation import InstrumentationScope from opentelemetry.sdk.resources import Resource -from opentelemetry.sdk._logs.export import LogExportResult +from opentelemetry.sdk._logs.export import LogRecordExportResult from opentelemetry._logs.severity import SeverityNumber from azure.monitor.opentelemetry.exporter.export._base import ExportResult @@ -63,7 +63,7 @@ def setUpClass(cls): os.environ["APPINSIGHTS_INSTRUMENTATIONKEY"] = "1234abcd-5678-4efa-8abc-1234567890ab" os.environ["APPLICATIONINSIGHTS_STATSBEAT_DISABLED_ALL"] = "true" cls._exporter = cls._exporter_class() - cls._log_data = _logs.LogData( + cls._log_data = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -77,7 +77,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_empty = _logs.LogData( + cls._log_data_empty = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -91,7 +91,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_none = _logs.LogData( + cls._log_data_none = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -105,7 +105,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_complex_body = _logs.LogData( + cls._log_data_complex_body = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -119,7 +119,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_complex_body_not_serializeable = _logs.LogData( + cls._log_data_complex_body_not_serializeable = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -133,7 +133,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_empty_with_whitespaces = _logs.LogData( + cls._log_data_empty_with_whitespaces = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -147,7 +147,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_event = _logs.LogData( + cls._log_data_event = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -164,7 +164,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_event_complex_body = _logs.LogData( + cls._log_data_event_complex_body = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -181,7 +181,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_event_complex_body_not_serializeable = _logs.LogData( + cls._log_data_event_complex_body_not_serializeable = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -198,7 +198,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._log_data_custom_event = _logs.LogData( + cls._log_data_custom_event = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -216,7 +216,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._exc_data = _logs.LogData( + cls._exc_data = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -235,7 +235,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._exc_data_with_exc_body = _logs.LogData( + cls._exc_data_with_exc_body = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -254,7 +254,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._exc_data_blank_exception = _logs.LogData( + cls._exc_data_blank_exception = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -268,7 +268,7 @@ def setUpClass(cls): ), InstrumentationScope("test_name"), ) - cls._exc_data_empty = _logs.LogData( + cls._exc_data_empty = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -311,7 +311,7 @@ def test_from_connection_string(self): def test_export_empty(self): exporter = self._exporter result = exporter.export([]) - self.assertEqual(result, LogExportResult.SUCCESS) + self.assertEqual(result, LogRecordExportResult.SUCCESS) def test_export_failure(self): exporter = self._exporter @@ -322,7 +322,7 @@ def test_export_failure(self): storage_mock = mock.Mock() exporter.storage.put = storage_mock result = exporter.export([self._log_data]) - self.assertEqual(result, LogExportResult.FAILURE) + self.assertEqual(result, LogRecordExportResult.FAILURE) self.assertEqual(storage_mock.call_count, 1) def test_export_success(self): @@ -334,7 +334,7 @@ def test_export_success(self): storage_mock = mock.Mock() exporter._transmit_from_storage = storage_mock result = exporter.export([self._log_data]) - self.assertEqual(result, LogExportResult.SUCCESS) + self.assertEqual(result, LogRecordExportResult.SUCCESS) self.assertEqual(storage_mock.call_count, 1) @mock.patch("azure.monitor.opentelemetry.exporter.export.logs._exporter._logger") @@ -345,7 +345,7 @@ def test_export_exception(self, logger_mock): throw(Exception), ): # noqa: E501 result = exporter.export([self._log_data]) - self.assertEqual(result, LogExportResult.FAILURE) + self.assertEqual(result, LogRecordExportResult.FAILURE) self.assertEqual(logger_mock.exception.called, True) def test_export_not_retryable(self): @@ -355,7 +355,7 @@ def test_export_not_retryable(self): ) as transmit: # noqa: E501 transmit.return_value = ExportResult.FAILED_NOT_RETRYABLE result = exporter.export([self._log_data]) - self.assertEqual(result, LogExportResult.FAILURE) + self.assertEqual(result, LogRecordExportResult.FAILURE) def test_log_to_envelope_partA(self): exporter = self._exporter @@ -583,7 +583,7 @@ def test_log_to_envelope_synthetic_source(self): "service.instance.id": "testServiceInstanceId", } ) - log_data = _logs.LogData( + log_data = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -615,7 +615,7 @@ def test_log_to_envelope_synthetic_load_always_on(self): "service.instance.id": "testServiceInstanceId", } ) - log_data = _logs.LogData( + log_data = _logs.ReadWriteLogRecord( _logs.LogRecord( timestamp=1646865018558419456, trace_id=125960616039069540489478540494783893221, @@ -672,7 +672,7 @@ def test_export_failure(self): transmit_from_storage_mock = mock.Mock() exporter._handle_transmit_from_storage = transmit_from_storage_mock result = exporter.export([self._log_data]) - self.assertEqual(result, LogExportResult.FAILURE) + self.assertEqual(result, LogRecordExportResult.FAILURE) self.assertEqual(exporter.storage, None) self.assertEqual(transmit_from_storage_mock.call_count, 1) @@ -685,7 +685,7 @@ def test_export_success(self): storage_mock = mock.Mock() exporter._transmit_from_storage = storage_mock result = exporter.export([self._log_data]) - self.assertEqual(result, LogExportResult.SUCCESS) + self.assertEqual(result, LogRecordExportResult.SUCCESS) self.assertEqual(storage_mock.call_count, 0) @@ -693,17 +693,17 @@ class TestAzureLogExporterUtils(unittest.TestCase): def test_get_log_export_result(self): self.assertEqual( _get_log_export_result(ExportResult.SUCCESS), - LogExportResult.SUCCESS, + LogRecordExportResult.SUCCESS, ) self.assertEqual( _get_log_export_result(ExportResult.FAILED_NOT_RETRYABLE), - LogExportResult.FAILURE, + LogRecordExportResult.FAILURE, ) self.assertEqual( _get_log_export_result(ExportResult.FAILED_RETRYABLE), - LogExportResult.FAILURE, + LogRecordExportResult.FAILURE, ) - self.assertEqual(_get_log_export_result(None), LogExportResult.FAILURE) + self.assertEqual(_get_log_export_result(None), LogRecordExportResult.FAILURE) def test_get_severity_level(self): for sev_num in SeverityNumber: diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_performance_counters.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_performance_counters.py index de32608846d8..45163ec6791d 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_performance_counters.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_performance_counters.py @@ -14,7 +14,7 @@ ) from opentelemetry.trace import SpanKind from opentelemetry.sdk.trace import ReadableSpan -from opentelemetry.sdk._logs import LogData +from opentelemetry.sdk._logs import ReadableLogRecord from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -568,7 +568,7 @@ def test_record_log_record_with_exception(self, mock_get_meter_provider): EXCEPTION_MESSAGE: "Test exception" } - mock_log_data = MagicMock(spec=LogData) + mock_log_data = MagicMock(spec=ReadableLogRecord) mock_log_data.log_record = mock_log_record # Import to access global counter @@ -588,7 +588,7 @@ def test_record_log_record_without_exception(self): mock_log_record = MagicMock() mock_log_record.attributes = {"normal": "attribute"} - mock_log_data = MagicMock(spec=LogData) + mock_log_data = MagicMock(spec=ReadableLogRecord) mock_log_data.log_record = mock_log_record # Import to access global counter diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_processor.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_processor.py index e7602048f7dd..389eb3e2343d 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_processor.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/performance_counters/test_processor.py @@ -5,7 +5,7 @@ from unittest import mock from unittest.mock import MagicMock -from opentelemetry.sdk._logs import LogData +from opentelemetry.sdk._logs import ReadableLogRecord from opentelemetry.sdk.trace import ReadableSpan from azure.monitor.opentelemetry.exporter._performance_counters._processor import ( @@ -42,7 +42,7 @@ def test_on_emit_with_manager(self, mock_manager_class): processor = _PerformanceCountersLogRecordProcessor() # Create mock log data - mock_log_data = MagicMock(spec=LogData) + mock_log_data = MagicMock(spec=ReadableLogRecord) processor.on_emit(mock_log_data) @@ -58,7 +58,7 @@ def test_emit_calls_on_emit(self): processor.on_emit = MagicMock() # Create mock log data - mock_log_data = MagicMock(spec=LogData) + mock_log_data = MagicMock(spec=ReadableLogRecord) processor.emit(mock_log_data) @@ -91,7 +91,7 @@ def test_exception_propagation_in_on_emit(self, mock_manager_class): processor = _PerformanceCountersLogRecordProcessor() # Create mock log data - mock_log_data = MagicMock(spec=LogData) + mock_log_data = MagicMock(spec=ReadableLogRecord) # Exception should be propagated with self.assertRaises(Exception) as context: diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_manager.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_manager.py index 4e31bae3ac68..cb9c63bf90e2 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_manager.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_manager.py @@ -956,11 +956,11 @@ def test_record_log_record_exception_handling(self, post_state_mock, data_mock, @mock.patch("azure.monitor.opentelemetry.exporter._quickpulse._manager._TelemetryData") @mock.patch("azure.monitor.opentelemetry.exporter._quickpulse._manager._is_post_state") def test_record_log_record_no_log_record(self, post_state_mock, data_mock, metric_derive_mock, doc_mock): - """Test _record_log_record when log_data.log_record is None.""" + """Test _record_log_record when readable_log_record.log_record is None.""" post_state_mock.return_value = True log_data_mock = mock.Mock() - log_data_mock.log_record = None - + log_data_mock.readable_log_record = None + qpm = _QuickpulseManager() qpm.initialize(connection_string=self.connection_string, resource=self.resource) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_processor.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_processor.py index 6fb8f0439318..cc6a890c403e 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_processor.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_processor.py @@ -28,11 +28,11 @@ def test_emit(self, mock_get_manager): mock_get_manager.return_value = mock_manager processor = _QuickpulseLogRecordProcessor() - log_data = mock.Mock() - processor.on_emit(log_data) - + readable_log_record = mock.Mock() + processor.on_emit(readable_log_record) + mock_get_manager.assert_called_once() - mock_manager._record_log_record.assert_called_once_with(log_data) + mock_manager._record_log_record.assert_called_once_with(readable_log_record) class TestQuickpulseSpanProcessor(unittest.TestCase): diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_types.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_types.py index 15edcda6cdd5..3f1c6b8f4cf8 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_types.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/tests/quickpulse/test_types.py @@ -7,7 +7,7 @@ from unittest.mock import patch, Mock from opentelemetry.sdk._logs import LogRecord -from opentelemetry.sdk.trace import Event, ReadableSpan +from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.semconv._incubating.attributes import gen_ai_attributes from opentelemetry.semconv.attributes.http_attributes import ( HTTP_REQUEST_METHOD, @@ -248,7 +248,7 @@ def setUp(self): SpanAttributes.EXCEPTION_STACKTRACE: "Test stack trace" } - self.span_event = Mock(spec=Event) + self.span_event = Mock(spec=LogRecord.event_name) self.span_event.attributes = { SpanAttributes.EXCEPTION_MESSAGE: "Test span event message", SpanAttributes.EXCEPTION_STACKTRACE: "Test span event stack trace"