TelemetryDetails.md

September 11, 2023 ยท View on GitHub

Telemetry Details

This document provides detailed information about telemetry events. It reflects the current state of the code and will be updated as telemetry is modified. Telemetry Events come in 2 types:

  • Application Events identify typical application usage (start the app, run tests, save a file, etc.) in ways that allow evaluation of how the app is being used, but without including any user-identifiable data.
  • Exception Events identify application errors and provide visibility into problems that users are experiencing, again without including any user-identifiable data.

Application Events

Application events are queried from the customEvents table. All application events follow the same pattern and contain 3 types of data:

  • The Common Data Properties.
  • A name property that matches one of the events defined below.
  • An optional set of event-specific properties, as defined with each event.

ColorContrast_AutoDetect

Trigger: Automatic contrast detection is run. Additional properties:

NameValue
ConfidenceThe confidence of the analysis. One of High, Mid, Low, or None.
BitmapSizeThe size in pixels (width times height) of the bitmap being processed.

ColorContrast_Click_Autodetect_Toggle

Trigger: The user clicks the "Auto detect contrast ratio" button in the color contrast view. Additional properties:

NameValue
IsNowEnabledone of true or false indicating whether automatic detection is enabled.

ColorContrast_Click_Dropdown

Trigger: The user opens a color picker popup in the Color Contrast view.
Additional properties: None.

ColorContrast_Click_Eyedropper

Trigger: The user clicks on an eyedropper in the Color Contrast view.
Additional properties: None.

ColorContrast_Click_HexChange

Trigger: The user enters a value in a hex dialog in the Color Contrast view.
Additional properties: None.

Custom_UIA

Trigger: The application was configured with a CustomUIA.json file as described in the online documentation. This event is sent only if a valid Custom_UIA.json exists. Additional properties:

NameValue
CustomUIAPropertyCountThe count of custom UIA properties that were defined in the CustomUIA.json file.

Event_Load

Trigger: The user successfully opens a previously-saved A11yEvents file.
Additional properties: None.

Event_Save

Trigger: The user successfully saves an A11yEvents file.
Additional properties: None.

Event_Start_Record

Trigger: The user begins event recording.
Additional properties: None.

Hierarchy_Load_NewFormat

Trigger: The user successfully opens an A11yTest file.
Additional properties:

NameValue
customDimensions.FileModeIndicates the app mode when the file was opened. Current values: Contrast, Inspect, or Test.

Hierarchy_Save

Trigger: The user successfully saves an A11yTest file.
Additional properties: None.

Hilighter_Expand_AllDescendants

Trigger: The user clicks on the "Expand all descendants" context menu in the test mode hierarchy.
Additional properties: None.

Issue_File_Attempt

Trigger: The user attempts the "File Issue" experience, but with no confirmed success (could be fire-and-forget or it could be a network failure).
Additional properties:

NameValue
customDimensions.IssueReporterThe ServiceName property of the associated issue reporter. Current values are Azure Boards for ADO or GitHub for GitHub.

Issue_Save

Trigger: The user completes the "File Issue" experience, with confirmed success.
Additional properties:

NameValue
customDimensions.IssueReporterThe ServiceName property of the associated issue reporter. Current values are Azure Boards for ADO or GitHub for GitHub.
customDimension.RuleIdPresent only if Axe.Windows flagged an issue. Reports the rule flagged by Axe.Windows.
customDimension.UIFrameworkPresent only if Axe.Windows flagged an issue. Reports the UI Framework of the UI Automation element flagged by Axe.Windows.

Mainwindow_Startup

Trigger: The user starts the application.
Additional properties:

NameValue
customDimensions.UIAccessEnabledTrue if the user has explicitly enabled UIAccess, otherwise False.
customDimensions.InstalledDotNetFrameworkVersionThe numeric version of the installed .NET Framework version. If this value is 528040 or greater, then .NET Framework 4.8 is installed.
customDimensions.OsArchitectureThe architecture of the current Windows platform. Supported values: x86 or x64

Mainwindow_Timer_Started

Trigger: The user uses the "Scan with Timer" feature with a non-default value. Note that this does not send data if the default value is used.
Additional properties:

NameValue
customDimensions.SecondsThe number of seconds specified by the user.

Pattern_Invoke_Action

Trigger: The user invokes a pattern through the patterns UI.
Additional properties:

NameValue
customDimensions.PatternMethodThe pattern method that was invoked.

ReleaseChannel_ChangeConsidered

Trigger: The user selects a new channel and is being shown the dialog to confirm the change.
Additional properties:

NameValue
customDimensions.ReleaseChannelThe user's existing ReleaseChannel.
customDimensions.ReleaseChannelConsideredThe user's considered selection for ReleaseChannel.

Scan_File_Bug

Trigger: The user begins the process of filing a bug.
Additional properties:

NameValue
customDimensions.ByThe source of the bug filing. Current values are HowtoFix, Hierarchy, or AutomatedChecks.
customDimensions.IsAlreadyLoggedInTrue if the IssueReporter has all needed config information, otherwise False.
customDimensions.IssueReporterThe ServiceName property of the associated issue reporter. Current values are Azure Boards for ADO or GitHub for GitHub.

TabStop_Record_On

Trigger: The user begins to record tab stops.
Additional properties:

NameValue
customDimensions.ScopeThe scope of the selection. Current values are App or Element.

TabStop_Select_Records

Trigger: The user selects one or more tab stops that have been recorded.
Additional properties:

NameValue
customDimensions.ByThe count of selected items.

TestSelection_Set_Scope

Trigger: The user sets the selection scope via the command bar.
Additional properties:

NameValue
customDimensions.ScopeThe scope of the selection. Current values are App or Element.

Test_Requested

Trigger: The user triggers an automated scan.
Additional properties:

NameValue
customDimensions.ByThe trigger mechanism. Current values are HotKey, Beaker, HierarchyMode, or Timer.
customDimensions.ScopeThe scope of the selection. Current values are App or Element.
customDimensions.ShouldTestAllChromiumContentIf the user has enabled the advanced option to test all Chromium content (intended for debugging by browser development teams).

Upgrade_DoInstallation

Trigger: The user completes an install from the Upgrade dialog.
Additional properties:

NameValue
customDimensions.UpdateInstallerUpdateTimeThe time it took to download the new MSI, validate it, and launch the VersionSwitcher. Does not include the execution time of the VersionSwitcher. Format is Hours:Minutes:Seconds.FractionalSeconds.
customDimensions.UpdateResultThe result of the operation. Current values are Unknown, Success, or RequiredUpgrade.

Upgrade_GetUpgradeOption

Trigger: The application checks for upgrade at application startup.
Additional properties:

NameValue
customDimensions.UpdateInitializationTimeThe updater's measurement of how long it took to determine the UpdateOption. Format is Hours:Minutes:Seconds.FractionalSeconds.
customDimensions.UpdateManifestRequestUriThe URI used to request the update manifest
customDimensions.UpdateManifestResponseUriThe URI the ultimately provided the update manifest
customDimensions.UpdateManifestSizeInBytesThe byte count of the retrieved update manifest
customDimensions.UpdateOptionWaitTimeThe app's measurement of how long it took to determine the UpdateOption. It is different from UpdateInitializationTime, since they start at different times on different threads. Format is Hours:Minutes:Seconds.FractionalSeconds.
customDimensions.UpdateOptionThe UpdateOption that was returned to the app (will be ignored if we timed out).
customDimensions.UpdateTimedOutTrue if the AutoUpdate process exceeded the 2 second timeout, otherwise False.

Upgrade_InstallationError

Trigger: The user triggers an install from the Upgrade dialog, and an error occurred.
Additional properties:

NameValue
customDimensions.ErrorThe UpdateResult, which is always Unknown. Note: Should this provide more useful information?

Upgrade_Update_Dismiss

Trigger: The user presses the "Later" button in the Upgrade dialog.
Additional properties:

NameValue
customDimensions.MSIVersionThe version of the previously installed client. note: We already have the old version, should this log the new version instead?

Upgrade_Update_ReleaseNote

Trigger: The user presses the "Release Notes" button from the Upgrade dialog.
Additional properties:

NameValue
customDimensions.ErrorThe error from clicking the release notes button note: Should this include the Exception type and/or the Uri to the release notes?

Upgrade_VersionSwitcherResults

Trigger: The application starts up after running AccessibilityInsights.VersionSwitcher.exe to either upgrade or change release channels Additional properties:

NameValue
customDimensions.ActualMsiSha512The actual SHA512 of the MSI file
customDimensions.ActualMsiSizeThe actual size (in bytes) of the downladed MSI file
customDimensions.ExecutionTimeInMillisecondsThe number of milliseconds spent running the VersionSwitcher
customDimensions.ExpectedMsiSha512The expected SHA512 of the MSI file. Will be set to null if the SHA512 was unknown
customDimensions.ExpectedMsiSizeThe expected size (in bytes) of the MSI file. Will be set to 0 if the size was unknown
customDimensions.NewChannelThe new channel if VersionSwitcher was used to change channels. Supported values are Production, Insider, or Canary if the channel was changed, or null if this was an upgrade within the same channel
customDimensions.RequestedMsiThe Uri used to request the MSI file
customDimensions.ResolvedMsiThe final Uri (after all redirects) that identifies where the source of the MSI file
customDimensions.ResultThe result of the operation. Supported values: Unknown, ErrorBadCommandLine, ErrorMsiDownloadFailed, ErrorMsiBadSignature, ErrorMsiSizeMismatch, ErrorMsiSha512Mismatch, ErrorInstallingMsi, or Success.
customDimensions.StartingVersionThe installed version of Accessibility Insights for Windows before the version switch

Events from Axe.Windows

Accessibility Insights for Windows provides a mechanism by which Axe.Windows is able to provide telemetry that then gets merged into the telemetry stream that already exists for the application. These events inherit all of the Common Data Properties, and appear just like events that originate from Accessibility Insights for Windows. These will be documented in the Axe.Windows repo, but are duplicated here for convenience:

Scan_Statistics

Trigger: An automated scan completes.
Additional properties:

NameValue
customDimensions.ElementsInScanThe number of elements included in the scan.
customDimensions.UpperBoundExceededTrue if ElementsInScan exceeds our upper bound of 20,000, otherwise False.
customDimensions.ScanDurationInMillisecondsThe time (measured in milliseconds) spent running the scan.

SingleRule_Tested_Results

Trigger: A single rule runs on all elements within a scan.
Additional properties:

NameValue
customDimensions.TestResultsThe JSON-serialized data summarizing the results of this rule (where it was run and the results it produced). Contains a RuleId and an array of Result objects. Each result object contains a ControlType, a UIFramework, an optional Fail result, and an optional Pass Result. Pass and Fail results can appear in any order within the object.

Here's an expanded example of the JSON-serialized object, containing a mixture of Pass and Fail results, to better visualize this data (note that the data in the telemetry stream is not expanded):

{
    "RuleId":"NameNotNull",
    "Results":[
        {
            "ControlType":"Text",
            "UIFramework":"Win32",
            "Fail":"2",
            "Pass":"7"
        },
        {
            "ControlType":"Button",
            "UIFramework":"Win32",
            "Pass":"2",
            "Fail":"1"
        },
        {
            "ControlType":"TabItem",
            "UIFramework":"Win32",
            "Pass":"4"
        },
        {
            "ControlType":"Hyperlink",
            "UIFramework":"Win32",
            "Pass":"1"
        }
    ]
}

Exception Events

Exception events are queried from the exceptions table. All exception events follow the same pattern and contains 2 types of data:

Exception-Specific Properties

These properties exist only for exceptions:

NameDescriptionSample
typeThe .NET type of the innermost Exception that was thrown.System.InvalidOperationException
assemblyIdentifies the assembly where the outermost Exception was caught.AccessibilityInsights.SharedUx, Version=1.1.899.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
methodIdentifies the method where the outermost Exception was caught.AccessibilityInsights.SharedUx.Controls.HierarchyControl+<>c__DisplayClass55_0.<OnSelected>b__0
innermostTypeThe .NET type of the innermost Exception that was thrown. note: This property exists only if the innermost Exception was wrapped by another Exception.
innermostMessageThe Message property of the innermost Exception that was thrown. note: This property exists only in the innermost Exception was wrapped by another Exception.
outerTypeThe .NET type of the outermost Exception that was thrown. This may be different from the type that was thrown by the innermost Exception.System.InvalidOperationException
outerMessageThe Message property of the outermost Exception that was thrown.The specified Visual is not an ancestor of this Visual.
outerAssemblyThe assembly from which the outermost Exception was thrown.PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
outerMethodThe method from which the outermost Exception was thrown.System.Windows.Media.Visual.TrySimpleTransformToAncestor
problemIdA concatenation of the innermost Exception type and the method from which the innermost Exception was thrown.System.InvalidOperationException at AccessibilityInsights.SharedUx.Controls.HierarchyControl+<>c__DisplayClass55_0.<OnSelected>b__0
detailsA JSON-serialized array of ExceptionDetail objects that correspond to this Exception. The first item in the array is always the outermost Exception.[{"parsedStack":[{"method":"System.Windows.Media.Visual.TrySimpleTransformToAncestor","level":0,"line":0,"assembly":"PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"},{"method":"System.Windows.Media.Visual.TransformToAncestor","level":1,"line":0,"assembly":"PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"},{"method":"AccessibilityInsights.SharedUx.Controls.HierarchyControl+<>c__DisplayClass55_0.<OnSelected>b__0","level":2,"line":0,"assembly":"AccessibilityInsights.SharedUx, Version=1.1.899.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}],"outerId":"0","message":"The specified Visual is not an ancestor of this Visual.","type":"System.InvalidOperationException","id":"25819492"}]
ExceptionDetail Objects

Each ExceptionDetail object represents a single Exception that was thrown, along with its stack trace. Exceptions can be nested, with each inner Exception pointing to its immediate wrapper Exception. The following properties are defined:

NameDescriptionSample
typeThe type of Exception that was thrown.System.InvalidOperationException
messageThe Message property specified when this Exception was thrown.The specified Visual is not an ancestor of this Visual.
idA system-assigned ID for this specific exception event. This is used to link the Exception chain.some id
outerIdA system-assigned value that maps to the id or the immediate parent of this Exception. Will be 0 for the outermost Exception.some id
parsedStackA JSON-serialized array of [StackFrame Objects[(#stackframe-objects)] that identify where this Exception was thrown. Index 0 is the innermost frame, index 1 is the next innermost, etc.[{"method":"System.Windows.Media.Visual.TrySimpleTransformToAncestor","level":0,"line":0,"assembly":"PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"},{"method":"System.Windows.Media.Visual.TransformToAncestor","level":1,"line":0,"assembly":"PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"},{"method":"AccessibilityInsights.SharedUx.Controls.HierarchyControl+<>c__DisplayClass55_0.<OnSelected>b__0","level":2,"line":0,"assembly":"AccessibilityInsights.SharedUx, Version=1.1.899.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}]
StackFrame Objects

Each StackFrame object represents a frame on the exception stack with the 4 following properties:

NameDescriptionSample
levelThe count of stack frames from the innermost Exception.1
assemblyThe assembly of the indicated stack frame.PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
methodThe method of the indicated stack frame.System.Windows.Media.Visual.TransformToAncestor
lineIf available, the line of the indicated stack frame (0 if unavailable).0

Common Data Properties

Common data properties are included with every telemetry event. Some of these properties are pipeline-controlled, and some are application-controlled. The following tables outline these properties.

Pipeline-controlled properties

The following properties are controlled by the telemetry pipeline and are useful for queries--note that this list is intentionally limited to those properties that are most likely to be useful for writing queries:

NameDescriptionEvent SampleException Sample
timestampThe UTC time that the event occurred.2019-06-21T06:23:05.435691Z2019-06-20T15:16:56.334167Z
client_CityClient city based on reverse IP lookup in pipeline.HyderabadRedmond
client_StateOrProvinceClient State/Province based on reverse IP lookup in pipeline.TelanganaWashington
client_CountryOrRegionClient County/Region based on reverse IP lookup in pipeline.IndiaUnited States

Application-controlled properties

The following properties are controlled by the application--note that this list is intentionally limited to those properties that are most likely to be useful for writing queries. Most of these properties are included in the customProperties field of the telemetry events. Some of these values are dynamic and may change during a session, as outlined below:

NameDescriptionDynamic Value?Sample
client_OSApp-specified value to represent the client OS version. See client_OS Values for details.No
customDimensions.VersionThe app version with no leading zeros.No1.1.1467.1
customDimensions.ReleaseChannelThe client's Release Channel. Current values are Production, Insider, or Canary.NoProduction
customDimensions.AppSessionIDA Guid that allows correlation within the process session.Nosome guid
customDimensions.InstallationIDA Guid that allows correlation of activity on a client within a calendar month.Nosome guid
customDimensions.ViewThe app's view. Current values areLive, CapturingData, Recording, TabStop, or ElementHowToFix.YesLive
customDimensions.UIFrameworkSee customDimension.UIFramework identifiers for details.Yes
customDimensions.ModeNameThe app's page. Current values are Start, Test, Inspect, CCA, Events, or Exit.YesStart
customDimensions.ModeSessionIdA Guid that allows correlation within a specific mode change within a session.Yessome guid
client_OS Values

The Windows version is fetched directly from the registry. The CurrentVersion and CurrentBuildVersion registry values from the "HKLM\SOFTWARE\Microsoft\Windows NT" key are combined into a single string format. The current mappings (based on a blend of https://en.wikipedia.org/wiki/Windows_10_version_history, https://en.wikipedia.org/wiki/Windows_11_version_history, and http://www.jrsoftware.org/ishelp/index.php?topic=winvernotes) include:

ValueOS Version
6.1.7601Windows 7 SP1 / Server 2008 R2 with Service Pack 1
6.2.9200Windows 8 / Server 2012
6.3.9600Windows 8.1 / Server 2012 R2
6.3.10240Windows 10 (1507)
6.3.10586Windows 10 (1511)
6.3.14393Windows 10 (1607) / Server 2016
6.3.15063Windows 10 (1703)
6.3.16299Windows 10 (1709)
6.3.17134Windows 10 (1803)
6.3.17763Windows 10 (1809) / Server 2019
6.3.18362Windows 10 (1903)
6.3.18363Windows 10 (1909)
6.3.19041Windows 10 (2004)
6.3.19042Windows 10 (20H2)
6.3.19043Windows 10 (21H1)
6.3.19044Windows 10 (21H2)
6.3.20348Windows Server 2022 (21H2)
6.3.22000Windows 11 (21H2)

This table includes only officially published builds. The data in table may also include builds that were not officially published, such as insider or preview builds.

UIFramework identifiers

These identifiers are provided by UI frameworks and allow assistive technologies to provide framework-specific behaviors. This table reports the values (sorted alphabetically) that have appeared in telemetry, and their corresponding UI frameworks:

ValueFramework
AvaloniaAvalonia framework (.NET)
ChromeChromium (C++, includes Google Chrome and newer versions of Microsoft Edge)
DirectUIDirectUI framework (C++)
GeckoGecko browser engine (C++, used in FireFox and Thunderbird)
InternetExplorerMicrosoft Internet Explorer
JUCEJuce framework (C++)
MicrosoftEdgeMicrosoft Edge (non-Chromium version)
nexacroNexacro platform (HTML5/JavaScript)
QtQt framework (multiple languages)
SilverightSilverlight (.NET)
SWTStandard Widgets Toolkit (Java)
Win32Generic Win32 apps (multiple languages)
WinFormWindows Forms (.NET)
WPFWindows Presentation Framework (.NET)
XAMLUniversal Windows Platform (.NET)

Sample Queries

Queries are written using the Kusto Query Language. Here are some sample queries:

How many sessions started in the last day?

customEvents 
| where timestamp >= ago(1d)
| where name == 'Mainwindow_Startup'
| summarize count()

How many unique install ID's have started sessions in the last day?

customEvents 
| where timestamp >= ago(1d)
| where name == 'Mainwindow_Startup'
| extend installId = tostring(customDimensions.InstallationID)
| extend version = tostring(customDimensions.Version)
| summarize dcount(installId)

How many unique install ID's have started sessions in the last day, broken down by app version, as a barchart?

customEvents 
| where timestamp >= ago(1d)
| where name == 'Mainwindow_Startup'
| extend installId = tostring(customDimensions.InstallationID)
| extend version = tostring(customDimensions.Version)
| summarize dcount(installId) by version
| sort by version desc
| render barchart

How many unique install ID's have started sessions in the last 60 days, per day, broken down by app version, as a barchart?

customEvents
| where timestamp > ago(60d)
| where name == 'Mainwindow_Startup'
| project installId=tostring(customDimensions.InstallationID), days=bin(timestamp, 1d), version=tostring(customDimensions.Version)
| distinct installId, version, days
| summarize count() by days, version
| render barchart

What are the top 10 Exceptions that have been reported in version 1.1.1467.1 in the last 7 days?

exceptions
| where timestamp >= ago(7d)
| extend version = tostring(customDimensions.Version)
| where version == '1.1.1467.1'
| summarize count(problemId) by problemId
| sort by count_problemId desc
| take 10

What are the top 10 Exceptions that have been reported in version 1.1.1467.1 in the last 7 days, but that occur outside of UIAutomationClient.dll?

exceptions
| where timestamp  >= ago(7d)
| extend version = tostring(customDimensions.Version)
| where version == '1.1.1467.1'
| where not(problemId contains 'UIAutomationClient')
| summarize count(problemId) by problemId
| sort by count_problemId desc
| take 10

What UI frameworks have been scanned in the last 30 days, in descending order of count?

customEvents 
| where timestamp >= ago(30d)
| where name == 'Scan_Statistics'
| extend framework = tostring(customDimensions.UIFramework)
| where framework != ''
| summarize count() by framework
| sort by count_ desc