Skip to content

Commit 2611487

Browse files
authored
Revert "[ml] Fix parent ID logging and add activity ID logging for operations…" (#34602)
This reverts commit c409ced.
1 parent c409ced commit 2611487

28 files changed

+237
-254
lines changed

sdk/ml/azure-ai-ml/azure/ai/ml/_ml_client.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from functools import singledispatch
1111
from itertools import product
1212
from pathlib import Path
13-
from typing import Any, Dict, Optional, Tuple, TypeVar, Union
13+
from typing import Any, Optional, Tuple, TypeVar, Union
1414

1515
from azure.ai.ml._azure_environments import (
1616
CloudArgumentKeys,
@@ -269,12 +269,12 @@ def __init__(
269269

270270
user_agent = kwargs.get("user_agent", None)
271271

272-
app_insights_handler: Tuple = get_appinsights_log_handler(
272+
app_insights_handler = get_appinsights_log_handler(
273273
user_agent,
274274
**{"properties": properties},
275275
enable_telemetry=self._operation_config.enable_telemetry,
276276
)
277-
app_insights_handler_kwargs: Dict[str, Tuple] = {"app_insights_handler": app_insights_handler}
277+
app_insights_handler_kwargs = {"app_insights_handler": app_insights_handler}
278278

279279
base_url = _get_base_url_from_metadata(cloud_name=cloud_name, is_local_mfe=True)
280280
self._base_url = base_url
@@ -442,7 +442,7 @@ def __init__(
442442
self._service_client_10_2022_preview,
443443
self._operation_container,
444444
self._credential,
445-
**app_insights_handler_kwargs, # type: ignore[arg-type]
445+
**app_insights_handler_kwargs,
446446
)
447447
self._operation_container.add(AzureMLResourceType.REGISTRY, self._registries) # type: ignore[arg-type]
448448

@@ -463,15 +463,15 @@ def __init__(
463463
self._operation_scope,
464464
self._operation_config,
465465
self._service_client_08_2023_preview,
466-
**app_insights_handler_kwargs, # type: ignore[arg-type]
466+
**app_insights_handler_kwargs,
467467
)
468468
self._operation_container.add(AzureMLResourceType.COMPUTE, self._compute)
469469
self._datastores = DatastoreOperations(
470470
operation_scope=self._operation_scope,
471471
operation_config=self._operation_config,
472472
serviceclient_2023_04_01_preview=self._service_client_04_2023_preview,
473473
serviceclient_2024_01_01_preview=self._service_client_01_2024_preview,
474-
**ops_kwargs, # type: ignore[arg-type]
474+
**ops_kwargs,
475475
)
476476
self._operation_container.add(AzureMLResourceType.DATASTORE, self._datastores)
477477
self._models = ModelOperations(
@@ -487,23 +487,23 @@ def __init__(
487487
workspace_rg=self._ws_rg,
488488
workspace_sub=self._ws_sub,
489489
registry_reference=registry_reference,
490-
**app_insights_handler_kwargs, # type: ignore[arg-type]
490+
**app_insights_handler_kwargs,
491491
)
492492
self._operation_container.add(AzureMLResourceType.MODEL, self._models)
493493
self._code = CodeOperations(
494494
self._ws_operation_scope if registry_reference else self._operation_scope,
495495
self._operation_config,
496496
self._service_client_10_2021_dataplanepreview if registry_name else self._service_client_04_2023,
497497
self._datastores,
498-
**ops_kwargs, # type: ignore[arg-type]
498+
**ops_kwargs,
499499
)
500500
self._operation_container.add(AzureMLResourceType.CODE, self._code)
501501
self._environments = EnvironmentOperations(
502502
self._ws_operation_scope if registry_reference else self._operation_scope,
503503
self._operation_config,
504504
self._service_client_10_2021_dataplanepreview if registry_name else self._service_client_04_2023_preview,
505505
self._operation_container,
506-
**ops_kwargs, # type: ignore[arg-type]
506+
**ops_kwargs,
507507
)
508508
self._operation_container.add(AzureMLResourceType.ENVIRONMENT, self._environments)
509509
self._local_endpoint_helper = _LocalEndpointHelper(requests_pipeline=self._requests_pipeline)
@@ -516,7 +516,7 @@ def __init__(
516516
self._local_endpoint_helper,
517517
self._credential,
518518
requests_pipeline=self._requests_pipeline,
519-
**ops_kwargs, # type: ignore[arg-type]
519+
**ops_kwargs,
520520
)
521521
self._batch_endpoints = BatchEndpointOperations(
522522
self._operation_scope,
@@ -526,7 +526,7 @@ def __init__(
526526
self._credential,
527527
requests_pipeline=self._requests_pipeline,
528528
service_client_09_2020_dataplanepreview=self._service_client_09_2020_dataplanepreview,
529-
**ops_kwargs, # type: ignore[arg-type]
529+
**ops_kwargs,
530530
)
531531
self._operation_container.add(AzureMLResourceType.BATCH_ENDPOINT, self._batch_endpoints)
532532
self._operation_container.add(AzureMLResourceType.ONLINE_ENDPOINT, self._online_endpoints)
@@ -537,7 +537,7 @@ def __init__(
537537
self._operation_container,
538538
self._local_deployment_helper,
539539
self._credential,
540-
**ops_kwargs, # type: ignore[arg-type]
540+
**ops_kwargs,
541541
)
542542
self._batch_deployments = BatchDeploymentOperations(
543543
self._operation_scope,
@@ -569,7 +569,7 @@ def __init__(
569569
self._service_client_10_2021_dataplanepreview if registry_name else self._service_client_10_2022,
570570
self._operation_container,
571571
self._preflight,
572-
**ops_kwargs, # type: ignore[arg-type]
572+
**ops_kwargs,
573573
)
574574
self._operation_container.add(AzureMLResourceType.COMPONENT, self._components)
575575
self._jobs = JobOperations(
@@ -602,7 +602,7 @@ def __init__(
602602
self._operation_scope,
603603
self._credential,
604604
_service_client_kwargs=kwargs,
605-
**ops_kwargs, # type: ignore[arg-type]
605+
**ops_kwargs,
606606
)
607607
self._operation_container.add(
608608
AzureMLResourceType.VIRTUALCLUSTER, self._virtual_clusters # type: ignore[arg-type]
@@ -615,7 +615,7 @@ def __init__(
615615
self._service_client_08_2023_preview,
616616
self._operation_container,
617617
self._credential,
618-
**app_insights_handler_kwargs, # type: ignore[arg-type]
618+
**app_insights_handler_kwargs,
619619
)
620620

621621
self._featuresets = FeatureSetOperations(
@@ -624,22 +624,22 @@ def __init__(
624624
self._service_client_10_2023,
625625
self._service_client_08_2023_preview,
626626
self._datastores,
627-
**ops_kwargs, # type: ignore[arg-type]
627+
**ops_kwargs,
628628
)
629629

630630
self._featurestoreentities = FeatureStoreEntityOperations(
631631
self._operation_scope,
632632
self._operation_config,
633633
self._service_client_10_2023,
634-
**ops_kwargs, # type: ignore[arg-type]
634+
**ops_kwargs,
635635
)
636636

637637
self._workspace_hubs = WorkspaceHubOperations(
638638
self._operation_scope,
639639
self._service_client_08_2023_preview,
640640
self._operation_container,
641641
self._credential,
642-
**app_insights_handler_kwargs, # type: ignore[arg-type]
642+
**app_insights_handler_kwargs,
643643
)
644644
self._operation_container.add(AzureMLResourceType.WORKSPACE_HUB, self._workspace_hubs) # type: ignore[arg-type]
645645

sdk/ml/azure-ai-ml/azure/ai/ml/_telemetry/activity.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
from marshmallow import ValidationError
2525

26-
from azure.ai.ml._utils._logger_utils import OpsLogger
2726
from azure.ai.ml._utils.utils import _is_user_error_from_exception_type, _is_user_error_from_status_code, _str_to_bool
2827
from azure.ai.ml.exceptions import ErrorCategory, MlException
2928
from azure.core.exceptions import HttpResponseError
@@ -261,8 +260,8 @@ def monitor_with_activity(
261260
To monitor, use the ``@monitor_with_activity`` decorator. As an alternative, you can also wrap the
262261
logical block of code with the ``log_activity()`` method.
263262
264-
:param logger: The operations logging class, containing loggers and tracer for the package and module
265-
:type logger: ~azure.ai.ml._utils._logger_utils.OpsLogger
263+
:param logger: The logger adapter.
264+
:type logger: logging.LoggerAdapter
266265
:param activity_name: The name of the activity. The name should be unique per the wrapped logical code block.
267266
:type activity_name: str
268267
:param activity_type: One of PUBLICAPI, INTERNALCALL, or CLIENTPROXY which represent an incoming API call,
@@ -276,16 +275,8 @@ def monitor_with_activity(
276275
def monitor(f):
277276
@functools.wraps(f)
278277
def wrapper(*args, **kwargs):
279-
tracer = logger.package_tracer if isinstance(logger, OpsLogger) else None
280-
if tracer:
281-
with tracer.span():
282-
with log_activity(
283-
logger.package_logger, activity_name or f.__name__, activity_type, custom_dimensions
284-
):
285-
return f(*args, **kwargs)
286-
else:
287-
with log_activity(logger.package_logger, activity_name or f.__name__, activity_type, custom_dimensions):
288-
return f(*args, **kwargs)
278+
with log_activity(logger, activity_name or f.__name__, activity_type, custom_dimensions):
279+
return f(*args, **kwargs)
289280

290281
return wrapper
291282

@@ -309,7 +300,7 @@ def monitor_with_telemetry_mixin(
309300
will collect from return value.
310301
To monitor, use the ``@monitor_with_telemetry_mixin`` decorator.
311302
312-
:param logger: The operations logging class, containing loggers and tracer for the package and module
303+
:param logger: The logger adapter.
313304
:type logger: logging.LoggerAdapter
314305
:param activity_name: The name of the activity. The name should be unique per the wrapped logical code block.
315306
:type activity_name: str
@@ -324,8 +315,6 @@ def monitor_with_telemetry_mixin(
324315
:return:
325316
"""
326317

327-
logger = logger.package_logger if isinstance(logger, OpsLogger) else logger
328-
329318
def monitor(f):
330319
def _collect_from_parameters(f, args, kwargs, extra_keys):
331320
dimensions = {}

sdk/ml/azure-ai-ml/azure/ai/ml/_telemetry/logging_handler.py

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,11 @@
99
import logging
1010
import platform
1111
import traceback
12-
from typing import Optional, Tuple, Union
1312

1413
from opencensus.ext.azure.common import utils
1514
from opencensus.ext.azure.common.protocol import Data, Envelope, ExceptionData, Message
1615
from opencensus.ext.azure.log_exporter import AzureLogHandler
17-
from opencensus.ext.azure.trace_exporter import AzureExporter
1816
from opencensus.trace import config_integration
19-
from opencensus.trace.samplers import ProbabilitySampler
20-
from opencensus.trace.tracer import Tracer
2117

2218
from azure.ai.ml._user_agent import USER_AGENT
2319

@@ -91,7 +87,7 @@ def get_appinsights_log_handler(
9187
component_name=None,
9288
enable_telemetry=True,
9389
**kwargs,
94-
) -> Tuple[Union["AzureMLSDKLogHandler", logging.NullHandler], Optional[Tracer]]:
90+
):
9591
"""Enable the OpenCensus logging handler for specified logger and instrumentation key to send info to AppInsights.
9692
9793
:param user_agent: Information about the user's browser.
@@ -106,23 +102,22 @@ def get_appinsights_log_handler(
106102
:paramtype enable_telemetry: bool
107103
:keyword kwargs: Optional keyword arguments for adding additional information to messages.
108104
:paramtype kwargs: dict
109-
:return: The logging handler and tracer.
110-
:rtype: Tuple[Union[AzureMLSDKLogHandler, logging.NullHandler], Optional[opencensus.trace.tracer.Tracer]]
105+
:return: The logging handler.
106+
:rtype: AzureMLSDKLogHandler
111107
"""
112108
try:
113109
if instrumentation_key is None:
114110
instrumentation_key = INSTRUMENTATION_KEY
115111

116112
if not in_jupyter_notebook() or not enable_telemetry:
117-
return (logging.NullHandler(), None)
113+
return logging.NullHandler()
118114

119115
if not user_agent or not user_agent.lower() == USER_AGENT.lower():
120-
return (logging.NullHandler(), None)
116+
return logging.NullHandler()
121117

122-
if kwargs:
123-
if "properties" in kwargs and "subscription_id" in kwargs.get("properties"): # type: ignore[operator]
124-
if kwargs.get("properties")["subscription_id"] in test_subscriptions: # type: ignore[index]
125-
return (logging.NullHandler(), None)
118+
if "properties" in kwargs and "subscription_id" in kwargs.get("properties"):
119+
if kwargs.get("properties")["subscription_id"] in test_subscriptions:
120+
return logging.NullHandler()
126121

127122
child_namespace = component_name or __name__
128123
current_logger = logging.getLogger(AML_INTERNAL_LOGGER_NAMESPACE).getChild(child_namespace)
@@ -140,15 +135,10 @@ def get_appinsights_log_handler(
140135
)
141136
current_logger.addHandler(handler)
142137

143-
tracer = Tracer(
144-
exporter=AzureExporter(connection_string=f"InstrumentationKey={instrumentation_key}"),
145-
sampler=ProbabilitySampler(1.0),
146-
)
147-
148-
return (handler, tracer)
138+
return handler
149139
except Exception: # pylint: disable=broad-except
150140
# ignore any exceptions, telemetry collection errors shouldn't block an operation
151-
return (logging.NullHandler(), None)
141+
return logging.NullHandler()
152142

153143

154144
# cspell:ignore AzureMLSDKLogHandler
@@ -183,20 +173,14 @@ def log_record_to_envelope(self, record):
183173
if self._is_telemetry_collection_disabled:
184174
return None
185175

186-
envelope = Envelope(
187-
iKey=self.options.instrumentation_key,
188-
tags=dict(utils.azure_monitor_context),
189-
time=utils.timestamp_to_iso_str(record.created),
190-
)
176+
envelope = create_envelope(self.options.instrumentation_key, record)
191177

192178
properties = {
193179
"process": record.processName,
194180
"module": record.module,
195181
"level": record.levelname,
196-
"activity_id": record.properties.get("activity_id", "00000000-0000-0000-0000-000000000000"),
197-
"client-request-id": record.properties.get("client_request_id", "00000000-0000-0000-0000-000000000000"),
198-
"span_id": record.spanId,
199-
"trace_id": record.traceId,
182+
"operation_id": envelope.tags.get("ai.ml.operation.id"),
183+
"operation_parent_id": envelope.tags.get("ai.ml.operation.parentId"),
200184
}
201185

202186
if hasattr(record, "custom_dimensions") and isinstance(record.custom_dimensions, dict):
@@ -253,3 +237,21 @@ def log_record_to_envelope(self, record):
253237
)
254238
envelope.data = Data(baseData=data, baseType="MessageData")
255239
return envelope
240+
241+
242+
def create_envelope(instrumentation_key, record):
243+
envelope = Envelope(
244+
iKey=instrumentation_key,
245+
tags=dict(utils.azure_monitor_context),
246+
time=utils.timestamp_to_iso_str(record.created),
247+
)
248+
envelope.tags["ai.ml.operation.id"] = getattr(
249+
record,
250+
"traceId",
251+
"00000000000000000000000000000000",
252+
)
253+
envelope.tags[
254+
"ai.ml.operation.parentId"
255+
] = f"|{envelope.tags.get('ai.ml.operation.id')}.{getattr(record, 'spanId', '0000000000000000')}"
256+
257+
return envelope

sdk/ml/azure-ai-ml/azure/ai/ml/_utils/_logger_utils.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import logging
66
import sys
7-
from typing import Dict
87

98
from azure.ai.ml._telemetry.logging_handler import AML_INTERNAL_LOGGER_NAMESPACE
109

@@ -23,12 +22,9 @@ class OpsLogger:
2322
def __init__(self, name: str):
2423
self.package_logger: logging.Logger = logging.getLogger(AML_INTERNAL_LOGGER_NAMESPACE + name)
2524
self.package_logger.propagate = False
26-
self.package_tracer = None
2725
self.module_logger = logging.getLogger(name)
2826
self.custom_dimensions = {}
2927

30-
def update_info(self, data: Dict) -> None:
28+
def update_info(self, data: dict) -> None:
3129
if "app_insights_handler" in data:
32-
logger, tracer = data.pop("app_insights_handler")
33-
self.package_logger.addHandler(logger)
34-
self.package_tracer = tracer
30+
self.package_logger.addHandler(data.pop("app_insights_handler"))

0 commit comments

Comments
 (0)