From 10fe0d6c0fb0ff1be0c3d1132a48dcebc9539d82 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Mon, 3 Mar 2025 10:34:38 -0800 Subject: [PATCH 1/5] event --- .../CHANGELOG.md | 2 ++ .../exporter/export/logs/_exporter.py | 5 ++++ .../samples/logs/sample_custom_event.py | 5 +++- .../samples/logging/custom_event.py | 27 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 sdk/monitor/azure-monitor-opentelemetry/samples/logging/custom_event.py diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index fdd006cfda5c..eb3e712384f0 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -6,6 +6,8 @@ - Support sending `customEvent` telemetry through special `microsoft` marker ([#39886](https://github.com/Azure/azure-sdk-for-python/pull/39886)) +- Populate `client_Ip` on `customEvent` telemetry + ([#39886](https://github.com/Azure/azure-sdk-for-python/pull/39886)) ### 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 095adb18dfe1..773c54fe88a4 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 @@ -32,6 +32,7 @@ BaseExporter, ExportResult, ) +from azure.monitor.opentelemetry.exporter.export.trace import _utils as trace_utils from azure.monitor.opentelemetry.exporter._constants import ( _APPLICATION_INSIGHTS_EVENT_MARKER_ATTRIBUTE, _MICROSOFT_CUSTOM_EVENT_NAME, @@ -125,6 +126,10 @@ def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: envelope.tags[ContextTagKeys.AI_OPERATION_PARENT_ID] = "{:016x}".format( # type: ignore log_record.span_id or _DEFAULT_SPAN_ID ) + # Special use case: Customers want to be able to set location ip on log records + location_ip = trace_utils._get_location_ip(log_record.attributes) + if location_ip: + envelope.tags[ContextTagKeys.AI_LOCATION_IP] = location_ip properties = _utils._filter_custom_properties( log_record.attributes, lambda key, val: not _is_ignored_attribute(key) ) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/logs/sample_custom_event.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/logs/sample_custom_event.py index a2a435dd23b2..0ad297812b44 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/logs/sample_custom_event.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/logs/sample_custom_event.py @@ -23,7 +23,7 @@ logger_provider = LoggerProvider() set_logger_provider(logger_provider) exporter = AzureMonitorLogExporter.from_connection_string(os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"]) -get_logger_provider().add_log_record_processor(BatchLogRecordProcessor(exporter, schedule_delay_millis=60000)) +get_logger_provider().add_log_record_processor(BatchLogRecordProcessor(exporter, schedule_delay_millis=5000)) # Attach LoggingHandler to namespaced logger handler = LoggingHandler() @@ -35,4 +35,7 @@ # The name of the `customEvent` will correspond to the value of the attribute` logger.info("Hello World!", extra={"microsoft.custom_event.name": "test-event-name", "additional_attrs": "val1"}) +# You can also populate fields like client_Ip with attribute `client.address` +logger.info("This entry will have a custom client_Ip", extra={"microsoft.custom_event.name": "test_event", "client.address": "192.168.1.1"}) + input() diff --git a/sdk/monitor/azure-monitor-opentelemetry/samples/logging/custom_event.py b/sdk/monitor/azure-monitor-opentelemetry/samples/logging/custom_event.py new file mode 100644 index 000000000000..b4779267a228 --- /dev/null +++ b/sdk/monitor/azure-monitor-opentelemetry/samples/logging/custom_event.py @@ -0,0 +1,27 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +""" +An example to show an application using Opentelemetry logging sdk. Logging calls to the standard Python +logging library are tracked and telemetry is exported to application insights with the AzureMonitorLogExporter. +""" +# mypy: disable-error-code="attr-defined" + +from logging import getLogger + +from azure.monitor.opentelemetry import configure_azure_monitor +from opentelemetry import trace + +configure_azure_monitor( + logger_name=__name__, +) + +logger = getLogger(__name__) + +# You can send `customEvent`` telemetry using a special `microsoft` attribute key through logging +# The name of the `customEvent` will correspond to the value of the attribute` +logger.info("Hello World!", extra={"microsoft.custom_event.name": "test-event-name", "additional_attrs": "val1"}) + +# You can also populate fields like client_Ip with attribute `client.address` +logger.info("This entry will have a custom client_Ip", extra={"microsoft.custom_event.name": "test_event", "client.address": "192.168.1.1"}) + +input() From 63626e68680fad6ab99699375686b0a0ca5bfb69 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Mon, 3 Mar 2025 11:14:49 -0800 Subject: [PATCH 2/5] ip --- sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md | 2 +- .../tests/logs/test_logs.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index eb3e712384f0..acdf8c8663e5 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -7,7 +7,7 @@ - Support sending `customEvent` telemetry through special `microsoft` marker ([#39886](https://github.com/Azure/azure-sdk-for-python/pull/39886)) - Populate `client_Ip` on `customEvent` telemetry - ([#39886](https://github.com/Azure/azure-sdk-for-python/pull/39886)) + ([#39923](https://github.com/Azure/azure-sdk-for-python/pull/39923)) ### 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 470dcd705ede..ada1556d29a0 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 @@ -195,6 +195,7 @@ def setUpClass(cls): attributes={ "event_key": "event_attribute", _MICROSOFT_CUSTOM_EVENT_NAME: "event_name", + "client.address": "192.168.1.1", }, ), InstrumentationScope("test_name"), @@ -538,6 +539,7 @@ def test_log_to_envelope_custom_event(self): envelope = exporter._log_to_envelope(self._log_data_custom_event) record = self._log_data_custom_event.log_record self.assertEqual(envelope.name, "Microsoft.ApplicationInsights.Event") + self.assertEqual(envelope.tags["ai.location.ip"], "192.168.1.1") self.assertEqual(envelope.time, ns_to_iso_str(record.timestamp)) self.assertEqual(envelope.data.base_type, "EventData") self.assertEqual(envelope.data.base_data.name, "event_name") From f9a7af3d41eaf8b2e64f6a0f010fb8c45b2a4bad Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Mon, 3 Mar 2025 12:20:51 -0800 Subject: [PATCH 3/5] mypy --- .../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 773c54fe88a4..e7ae4e89c34e 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 @@ -129,7 +129,7 @@ def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: # Special use case: Customers want to be able to set location ip on log records location_ip = trace_utils._get_location_ip(log_record.attributes) if location_ip: - envelope.tags[ContextTagKeys.AI_LOCATION_IP] = location_ip + envelope.tags[ContextTagKeys.AI_LOCATION_IP] = location_ip # type: ignore properties = _utils._filter_custom_properties( log_record.attributes, lambda key, val: not _is_ignored_attribute(key) ) From 1adc585bbac1d70076ce972b612aa0bf25ce2c49 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Mon, 3 Mar 2025 13:07:27 -0800 Subject: [PATCH 4/5] Update _exporter.py --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 1 + 1 file changed, 1 insertion(+) 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 e7ae4e89c34e..8011a07ef1cf 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 @@ -114,6 +114,7 @@ def _log_data_is_event(log_data: LogData) -> bool: return is_event is not None + # pylint: disable=protected-access def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: log_record = log_data.log_record From 26823be2b79b5d9ad6860b29eca3ebbcbef87846 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Mon, 3 Mar 2025 13:07:32 -0800 Subject: [PATCH 5/5] Update _exporter.py --- .../monitor/opentelemetry/exporter/export/logs/_exporter.py | 1 - 1 file changed, 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 8011a07ef1cf..e7ae4e89c34e 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 @@ -114,7 +114,6 @@ def _log_data_is_event(log_data: LogData) -> bool: return is_event is not None - # pylint: disable=protected-access def _convert_log_to_envelope(log_data: LogData) -> TelemetryItem: log_record = log_data.log_record