Skip to content

Commit

Permalink
{Core} Add Context.Dafault.VS.Core.Istty and `Context.Default.Azure…
Browse files Browse the repository at this point in the history
…CLI.UserAgent` in telemetry (#28182)

* Add `Context.Dafault.VS.Core.Istty` and `Context.Default.AzureCLI.UserAgent` in telemetry

* record UA from last request

* use seperate UserAgentPolicy

* fetch env variable when no user agent logged

* linter check

* style check

* remove unused _init_
  • Loading branch information
evelyn-ys authored Feb 19, 2024
1 parent 4439db6 commit 60035ac
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 4 deletions.
6 changes: 3 additions & 3 deletions src/azure-cli-core/azure/cli/core/aaz/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,12 @@ def _configure(
self,
**kwargs
):
from azure.core.pipeline.policies import UserAgentPolicy, HeadersPolicy, ProxyPolicy, \
from azure.core.pipeline.policies import HeadersPolicy, ProxyPolicy, \
RetryPolicy, CustomHookPolicy, RedirectPolicy, SansIOHTTPPolicy
from azure.cli.core.sdk.policies import SafeNetworkTraceLoggingPolicy
from azure.cli.core.sdk.policies import SafeNetworkTraceLoggingPolicy, RecordTelemetryUserAgentPolicy
from ._http_policy import AAZBearerTokenCredentialPolicy

self.user_agent_policy = kwargs.get('user_agent_policy') or UserAgentPolicy(**kwargs)
self.user_agent_policy = kwargs.get('user_agent_policy') or RecordTelemetryUserAgentPolicy(**kwargs)
self.headers_policy = kwargs.get('headers_policy') or HeadersPolicy(**kwargs)
self.proxy_policy = kwargs.get('proxy_policy') or ProxyPolicy(**kwargs)
self.logging_policy = kwargs.get('logging_policy') or SafeNetworkTraceLoggingPolicy(**kwargs)
Expand Down
3 changes: 3 additions & 0 deletions src/azure-cli-core/azure/cli/core/commands/client_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,9 @@ def _prepare_client_kwargs_track2(cli_ctx):
if 'x-ms-client-request-id' in cli_ctx.data['headers']:
client_kwargs['request_id'] = cli_ctx.data['headers']['x-ms-client-request-id']

from azure.cli.core.sdk.policies import RecordTelemetryUserAgentPolicy
client_kwargs['user_agent_policy'] = RecordTelemetryUserAgentPolicy(**client_kwargs)

# Replace NetworkTraceLoggingPolicy to redact 'Authorization' and 'x-ms-authorization-auxiliary' headers.
# NetworkTraceLoggingPolicy: log raw network trace, with all headers.
from azure.cli.core.sdk.policies import SafeNetworkTraceLoggingPolicy
Expand Down
9 changes: 8 additions & 1 deletion src/azure-cli-core/azure/cli/core/sdk/policies.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import re
import types

from azure.core.pipeline.policies import SansIOHTTPPolicy
from azure.core.pipeline.policies import SansIOHTTPPolicy, UserAgentPolicy
from knack.log import get_logger

_LOGGER = get_logger(__name__)
Expand Down Expand Up @@ -96,3 +96,10 @@ def on_response(self, request, response): # pylint: disable=unused-argument, no
_LOGGER.debug(response.http_response.text())
except Exception as err: # pylint: disable=broad-except
_LOGGER.debug("Failed to log response: %s", repr(err))


class RecordTelemetryUserAgentPolicy(UserAgentPolicy):
def on_request(self, request):
super().on_request(request)
from azure.cli.core.telemetry import set_user_agent
set_user_agent(request.http_request.headers[self._USERAGENT])
20 changes: 20 additions & 0 deletions src/azure-cli-core/azure/cli/core/telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ def __init__(self, correlation_id=None, application=None):
self.allow_broker = None
self.msal_telemetry = None
self.secrets_detected = None
self.user_agent = None

def add_event(self, name, properties):
for key in self.instrumentation_key:
Expand Down Expand Up @@ -152,6 +153,7 @@ def _get_base_properties(self):
'Context.Default.VS.Core.Distro.Name': _get_distro_name(), # eg. 'CentOS Linux 8'
'Context.Default.VS.Core.Distro.Id': _get_distro_id(), # eg. 'centos'
'Context.Default.VS.Core.Distro.Version': _get_distro_version(), # eg. '8.4.2105'
'Context.Dafault.VS.Core.Istty': sys.stdin.isatty(),
'Context.Default.VS.Core.User.Id': _get_installation_id(),
'Context.Default.VS.Core.User.IsMicrosoftInternal': 'False',
'Context.Default.VS.Core.User.IsOptedIn': 'True',
Expand Down Expand Up @@ -182,6 +184,7 @@ def _get_azure_cli_properties(self):
set_custom_properties(result,
'ClientRequestId',
lambda: self.application.data['headers'].get('x-ms-client-request-id', ''))
set_custom_properties(result, 'UserAgent', _get_user_agent())
set_custom_properties(result, 'CoreVersion', _get_core_version)
set_custom_properties(result, 'TelemetryVersion', "2.0")
set_custom_properties(result, 'InstallationId', _get_installation_id)
Expand Down Expand Up @@ -470,6 +473,12 @@ def set_msal_telemetry(msal_telemetry):
_session.msal_telemetry = msal_telemetry


@decorators.suppress_all_exceptions()
def set_user_agent(user_agent):
if user_agent:
_session.user_agent = user_agent


@decorators.suppress_all_exceptions()
def set_secrets_detected(secrets_detected):
_session.secrets_detected = secrets_detected
Expand Down Expand Up @@ -679,6 +688,17 @@ def _get_shell_type():
return _remove_cmd_chars(_remove_symbols(os.environ.get('SHELL')))


@decorators.suppress_all_exceptions(fallback_return='')
def _get_user_agent():
if _session.user_agent:
return _session.user_agent
from azure.cli.core.util import get_az_user_agent
agents = [get_az_user_agent()]
if 'AZURE_HTTP_USER_AGENT' in os.environ:
agents.append(os.environ['AZURE_HTTP_USER_AGENT'])
return ' '.join(agents)


@decorators.suppress_all_exceptions(fallback_return='')
@decorators.hash256_result
def _get_error_hash():
Expand Down
3 changes: 3 additions & 0 deletions src/azure-cli-core/azure/cli/core/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -898,6 +898,9 @@ def send_raw_request(cli_ctx, method, url, headers=None, uri_parameters=None, #
agents.append(headers['User-Agent'])
headers['User-Agent'] = ' '.join(agents)

from azure.cli.core.telemetry import set_user_agent
set_user_agent(headers['User-Agent'])

if generated_client_request_id_name:
headers[generated_client_request_id_name] = str(uuid.uuid4())

Expand Down

0 comments on commit 60035ac

Please sign in to comment.