Skip to content

Commit 727f510

Browse files
authored
[ml] Add operation id tracking to client-side logging (#32923)
* Add operation id tracking * import instrumentation key * Remove logging format * Set upper bound for opencensus-ext-logging * Remove azureml-telemetry dependency * Set upperbound for opencensus and use .get for safe envelope tag indexing * Update to use f string instead of format * Reduce duplicate declaration of instrumentation key
1 parent 8f579f0 commit 727f510

File tree

6 files changed

+28
-38
lines changed

6 files changed

+28
-38
lines changed

Diff for: sdk/ai/azure-ai-generative/azure/ai/generative/_telemetry/logging_handler.py

+5-10
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
)
2222
from opencensus.trace import config_integration
2323

24-
from azureml.telemetry import INSTRUMENTATION_KEY
25-
26-
from azure.ai.ml._telemetry.logging_handler import in_jupyter_notebook, CustomDimensionsFilter
24+
from azure.ai.ml._telemetry.logging_handler import in_jupyter_notebook, CustomDimensionsFilter, INSTRUMENTATION_KEY
2725

2826
from azure.ai.generative._user_agent import USER_AGENT
2927

@@ -152,8 +150,8 @@ def log_record_to_envelope(self, record):
152150
"process": record.processName,
153151
"module": record.module,
154152
"level": record.levelname,
155-
"operation_id": envelope.tags["gen.ai.operation.id"],
156-
"operation_parent_id": envelope.tags["gen.ai.operation.parentId"],
153+
"operation_id": envelope.tags.get("ai.generative.operation.id"),
154+
"operation_parent_id": envelope.tags.get("ai.generative.operation.parentId"),
157155
}
158156
if hasattr(record, "custom_dimensions") and isinstance(record.custom_dimensions, dict):
159157
properties.update(record.custom_dimensions)
@@ -217,14 +215,11 @@ def create_envelope(instrumentation_key, record):
217215
tags=dict(utils.azure_monitor_context),
218216
time=utils.timestamp_to_iso_str(record.created),
219217
)
220-
envelope.tags["gen.ai.operation.id"] = getattr(
218+
envelope.tags["ai.generative.operation.id"] = getattr(
221219
record,
222220
"traceId",
223221
"00000000000000000000000000000000",
224222
)
225-
envelope.tags["gen.ai.operation.parentId"] = "|{}.{}.".format(
226-
envelope.tags["gen.ai.operation.id"],
227-
getattr(record, "spanId", "0000000000000000"),
228-
)
223+
envelope.tags["ai.generative.operation.parentId"] = f"|{envelope.tags.get('ai.generative.operation.id')}.{getattr(record, 'spanId', '0000000000000000')}"
229224

230225
return envelope

Diff for: sdk/ai/azure-ai-generative/setup.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,9 @@
7474
install_requires=[
7575
# NOTE: To avoid breaking changes in a major version bump, all dependencies should pin an upper bound if possible.
7676
"azure-ai-resources<2.0.0,>=1.0.0b1",
77-
"azureml-telemetry~=1.0,>=1.51.0",
7877
"mlflow-skinny<3",
7978
"opencensus-ext-azure~=1.0",
80-
"opencensus-ext-logging",
79+
"opencensus-ext-logging<=0.1.1",
8180
],
8281
extras_require={
8382
"evaluate": [

Diff for: sdk/ai/azure-ai-resources/azure/ai/resources/_telemetry/logging_handler.py

+5-10
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
)
2222
from opencensus.trace import config_integration
2323

24-
from azureml.telemetry import INSTRUMENTATION_KEY
25-
26-
from azure.ai.ml._telemetry.logging_handler import in_jupyter_notebook, CustomDimensionsFilter
24+
from azure.ai.ml._telemetry.logging_handler import in_jupyter_notebook, CustomDimensionsFilter, INSTRUMENTATION_KEY
2725
from azure.ai.resources._version import VERSION
2826

2927

@@ -157,8 +155,8 @@ def log_record_to_envelope(self, record):
157155
"process": record.processName,
158156
"module": record.module,
159157
"level": record.levelname,
160-
"operation_id": envelope.tags["gen.ai.operation.id"],
161-
"operation_parent_id": envelope.tags["gen.ai.operation.parentId"],
158+
"operation_id": envelope.tags.get("ai.resources.operation.id"),
159+
"operation_parent_id": envelope.tags.get("ai.resources.operation.parentId"),
162160
}
163161
if hasattr(record, "custom_dimensions") and isinstance(record.custom_dimensions, dict):
164162
properties.update(record.custom_dimensions)
@@ -222,14 +220,11 @@ def create_envelope(instrumentation_key, record):
222220
tags=dict(utils.azure_monitor_context),
223221
time=utils.timestamp_to_iso_str(record.created),
224222
)
225-
envelope.tags["gen.ai.operation.id"] = getattr(
223+
envelope.tags["ai.resources.operation.id"] = getattr(
226224
record,
227225
"traceId",
228226
"00000000000000000000000000000000",
229227
)
230-
envelope.tags["gen.ai.operation.parentId"] = "|{}.{}.".format(
231-
envelope.tags["gen.ai.operation.id"],
232-
getattr(record, "spanId", "0000000000000000"),
233-
)
228+
envelope.tags["ai.resources.operation.parentId"] = f"|{envelope.tags.get('ai.resources.operation.id')}.{getattr(record, 'spanId', '0000000000000000')}"
234229

235230
return envelope

Diff for: sdk/ai/azure-ai-resources/setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
# NOTE: To avoid breaking changes in a major version bump, all dependencies should pin an upper bound if possible.
6969
"azure-ai-ml>=1.12.0",
7070
"mlflow-skinny<3",
71-
"azureml-telemetry~=1.0,>=1.51.0",
71+
"opencensus-ext-logging<=0.1.1",
7272
"azure-mgmt-resource<23.0.0,>=22.0.0",
7373
],
7474
project_urls={

Diff for: sdk/ml/azure-ai-ml/azure/ai/ml/_telemetry/logging_handler.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,14 @@
1010
import platform
1111
import traceback
1212

13-
from opencensus.ext.azure.log_exporter import AzureLogHandler
1413
from opencensus.ext.azure.common import utils
15-
from opencensus.ext.azure.common.protocol import (
16-
Data,
17-
ExceptionData,
18-
Message,
19-
Envelope,
20-
)
21-
from azure.ai.ml._user_agent import USER_AGENT
14+
from opencensus.ext.azure.common.protocol import Data, Envelope, ExceptionData, Message
15+
from opencensus.ext.azure.log_exporter import AzureLogHandler
16+
from opencensus.trace import config_integration
2217

18+
from azure.ai.ml._user_agent import USER_AGENT
2319

2420
AML_INTERNAL_LOGGER_NAMESPACE = "azure.ai.ml._telemetry"
25-
26-
# vienna-sdk-unitedstates
2721
INSTRUMENTATION_KEY = "71b954a8-6b7d-43f5-986c-3d3a6605d803"
2822

2923
test_subscriptions = [
@@ -37,6 +31,10 @@
3731
]
3832

3933

34+
# activate operation id tracking
35+
config_integration.trace_integrations(["logging"])
36+
37+
4038
class CustomDimensionsFilter(logging.Filter):
4139
"""Add application-wide properties to AzureLogHandler records"""
4240

@@ -181,7 +179,10 @@ def log_record_to_envelope(self, record):
181179
"process": record.processName,
182180
"module": record.module,
183181
"level": record.levelname,
182+
"operation_id": envelope.tags.get("ai.ml.operation.id"),
183+
"operation_parent_id": envelope.tags.get("ai.ml.operation.parentId"),
184184
}
185+
185186
if hasattr(record, "custom_dimensions") and isinstance(record.custom_dimensions, dict):
186187
properties.update(record.custom_dimensions)
187188

@@ -244,14 +245,13 @@ def create_envelope(instrumentation_key, record):
244245
tags=dict(utils.azure_monitor_context),
245246
time=utils.timestamp_to_iso_str(record.created),
246247
)
247-
envelope.tags["ai.operation.id"] = getattr(
248+
envelope.tags["ai.ml.operation.id"] = getattr(
248249
record,
249250
"traceId",
250251
"00000000000000000000000000000000",
251252
)
252-
envelope.tags["ai.operation.parentId"] = "|{}.{}.".format(
253-
envelope.tags["ai.operation.id"],
254-
getattr(record, "spanId", "0000000000000000"),
255-
)
253+
envelope.tags[
254+
"ai.ml.operation.parentId"
255+
] = f"|{envelope.tags.get('ai.ml.operation.id')}.{getattr(record, 'spanId', '0000000000000000')}"
256256

257257
return envelope

Diff for: sdk/ml/azure-ai-ml/setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
"azure-common<2.0.0,>=1.1",
8787
"typing-extensions<5.0.0",
8888
"opencensus-ext-azure<2.0.0",
89+
"opencensus-ext-logging<=0.1.1",
8990
],
9091
extras_require={
9192
# user can run `pip install azure-ai-ml[designer]` to install mldesigner alone with this package

0 commit comments

Comments
 (0)