Telemetry Schema Reference

August 5, 2026 · View on GitHub

This document is the authoritative reference for all telemetry events, fields, classifications, and data pipeline details in the Azure Developer CLI (azd).

Events

Events are defined in cli/azd/internal/tracing/events/events.go. Each event is emitted as an OpenTelemetry span name or event name.

ConstantValueDescription
CommandEventPrefixcmd.Prefix for all command events (via GetCommandEventName)
VsRpcEventPrefixvsrpc.Prefix for VS Code JSON-RPC events
McpEventPrefixmcp.Prefix for MCP tool invocation events
PackBuildEventtools.pack.buildCloud Native Buildpacks build event
AgentTroubleshootEventagent.troubleshootAgent troubleshooting event
ExtensionRunEventext.runExtension execution event
ExtensionInstallEventext.installExtension install/upgrade event
ExtensionUpgradeEventext.upgradeSingle extension upgrade attempt
ExtensionPromoteEventext.promoteExtension registry promotion (e.g., dev → main)
CopilotInitializeEventcopilot.initializeCopilot initialization event
CopilotSessionEventcopilot.sessionCopilot session lifecycle event
ProvisionValidationEventvalidation.provisionLocal provision validation outcome
HooksExecEventhooks.execLifecycle hook execution
AksPostprovisionSkipEventaks.postprovision.skipAKS postprovision hook skipped (cluster not yet available)
ArmDeploySubscriptionEventarm.deploy.subscriptionARM subscription-scope deploy
ArmDeployResourceGroupEventarm.deploy.resourcegroupARM resource-group-scope deploy
ArmStackDeploySubscriptionEventarm.stack.deploy.subscriptionDeployment stack at subscription scope
ArmStackDeployResourceGroupEventarm.stack.deploy.resourcegroupDeployment stack at resource-group scope
ArmWhatIfSubscriptionEventarm.whatif.subscriptionWhat-if preview at subscription scope
ArmWhatIfResourceGroupEventarm.whatif.resourcegroupWhat-if preview at resource-group scope
ArmValidateSubscriptionEventarm.validate.subscriptionTemplate validation at subscription scope
ArmValidateResourceGroupEventarm.validate.resourcegroupTemplate validation at resource-group scope
DeployAppServiceZipEventdeploy.appservice.zipApp Service zip-deploy attempt
ContainerCredentialsEventcontainer.credentialsContainer registry credential lookup
ContainerPublishEventcontainer.publishContainer image publish (push)
ContainerRemoteBuildEventcontainer.remotebuildAzure-side remote container build
ExeGraphRunEventexegraph.runRoot span for executing an entire graph
ExeGraphStepEventexegraph.stepSingle step execution within the graph
AspireUnsupportedAppHostEventaspire.apphost.unsupportedDetected an unsupported Aspire polyglot (non-C#) AppHost during app detection

Fields

Fields are defined in cli/azd/internal/tracing/fields/fields.go. Each field has a classification and purpose that governs how it may be stored, queried, and retained.

Application-Level (Resource Attributes)

These are set once at process startup via resource.New() and attached to every span.

FieldOTel KeyClassificationPurposeNotes
Service nameservice.nameAlways "azd"
Service versionservice.versionBuild version string
OS typeos.typee.g. linux, windows, darwin
OS versionos.versionSystemMetadataPerformanceAndHealthKernel / build version
Host architecturehost.archSystemMetadataPerformanceAndHealthe.g. amd64, arm64
Runtime versionprocess.runtime.versionSystemMetadataPerformanceAndHealthGo version
Machine IDmachine.idEndUserPseudonymizedInformationBusinessInsightMAC address hash
Dev Device IDmachine.devdeviceidEndUserPseudonymizedInformationBusinessInsightSQM User ID
Execution environmentexecution.environmentSystemMetadataBusinessInsightCI system detection
Installerservice.installerSystemMetadataFeatureInsightHow azd was installed

Experimentation

FieldOTel KeyClassificationPurpose
Assignment contextexp.assignmentContextSystemMetadataFeatureInsight

Identity and Account Context

FieldOTel KeyClassificationPurposeNotes
Object IDuser_AuthenticatedIdFrom Application Insights contracts
Tenant IDad.tenant.idSystemMetadataBusinessInsightEntra ID tenant
Account typead.account.typeSystemMetadataBusinessInsight"User" or "Service Principal"
Subscription IDad.subscription.idOrganizationalIdentifiableInformationPerformanceAndHealthAzure subscription

Project Context (azure.yaml)

FieldOTel KeyClassificationPurposeNotes
Template IDproject.template.idSystemMetadataFeatureInsightHashed
Template versionproject.template.versionSystemMetadataFeatureInsightHashed
Project nameproject.nameSystemMetadataFeatureInsightHashed
Service hostsproject.service.hostsSystemMetadataFeatureInsightList of host types
Service targetsproject.service.targetsSystemMetadataFeatureInsightList of deploy targets
Service languagesproject.service.languagesSystemMetadataFeatureInsightList of languages
Service languageproject.service.languageSystemMetadataPerformanceAndHealthSingle service language
Platform typeplatform.typeSystemMetadataFeatureInsighte.g. aca, aks

Config and Environment

FieldOTel KeyClassificationPurposeNotes
Feature flagsconfig.featuresSystemMetadataFeatureInsightActive feature flags
Environment nameenv.nameSystemMetadataFeatureInsightHashed

Command Entry-Point

FieldOTel KeyClassificationPurposeNotes
Flagscmd.flagsSystemMetadataFeatureInsightWhich flags were passed
Argument countcmd.args.countSystemMetadataFeatureInsightMeasurement
Entry pointcmd.entrySystemMetadataFeatureInsightHow the command was invoked

Error Attributes

FieldOTel KeyClassificationPurposeNotes
Error categoryerror.categorySystemMetadataPerformanceAndHealth
Error codeerror.codeSystemMetadataPerformanceAndHealth
Error typeerror.typeSystemMetadataPerformanceAndHealthResultCode or Go type for the classified error
Error chain typeserror.chain.typesSystemMetadataPerformanceAndHealthWrapped Go error type chain, outermost first

Error classification is handled by MapError in internal/cmd/errors.go, which categorizes errors into: update errors, auth errors, service (Azure) errors, deployment errors, extension errors, tool errors, sentinel errors, and network errors. Each receives an error.code, error.category, and contextual attributes.

Generic-only error chains now use the catch-all ResultCode internal.unclassified instead of the previous internal.errors_errorString. Use error.chain.types to inspect the concrete wrapper types behind that bucket. The removed error.inner and error.frame attributes were not emitted by azd spans.

Service Attributes

FieldOTel KeyClassificationPurposeNotes
Service hostservice.hostSystemMetadataPerformanceAndHealth
Service nameservice.nameSystemMetadataPerformanceAndHealth
Status codeservice.statusCodeSystemMetadataPerformanceAndHealthMeasurement
Methodservice.methodSystemMetadataPerformanceAndHealth
Error codeservice.errorCodeSystemMetadataPerformanceAndHealthMeasurement; ARM deployment errors encode JSON objects with error.code and error.arm.frame_index
Correlation IDservice.correlationIdSystemMetadataPerformanceAndHealth

Tool Attributes

FieldOTel KeyClassificationPurpose
Tool nametool.nameSystemMetadataFeatureInsight
Tool exit codetool.exitCodeSystemMetadataPerformanceAndHealth

Performance

FieldOTel KeyClassificationPurposeNotes
Interaction timeperf.interact_timeSystemMetadataPerformanceAndHealthMeasurement — time to first user prompt
Provision durationperf.provision_duration_msSystemMetadataPerformanceAndHealthMeasurement — wall-clock provisioning phase duration (ms)
Deploy durationperf.deploy_duration_msSystemMetadataPerformanceAndHealthMeasurement — wall-clock deploy phase duration (ms). Excludes package/publish (run concurrently with provision)
Total durationperf.total_duration_msSystemMetadataPerformanceAndHealthMeasurement — total wall-clock for the entire up-graph execution

Pack (Buildpacks)

FieldOTel KeyClassificationPurpose
Builder imagepack.builder.imageSystemMetadataFeatureInsight
Builder tagpack.builder.tagSystemMetadataFeatureInsight

Aspire

FieldOTel KeyClassificationPurposeNotes
AppHost languageaspire.apphost.languageSystemMetadataFeatureInsightFixed enum (typescript/python/go/java/rust); not hashed; not a measurement. Emitted on aspire.apphost.unsupported.

MCP

FieldOTel KeyClassificationPurpose
Client namemcp.client.nameSystemMetadataFeatureInsight
Client versionmcp.client.versionSystemMetadataFeatureInsight

Init

FieldOTel KeyClassificationPurposeNotes
Init methodinit.methodSystemMetadataFeatureInsighttemplate/app/project/environment/copilot
Detected databasesappinit.detected.databasesSystemMetadataFeatureInsight
Detected servicesappinit.detected.servicesSystemMetadataFeatureInsight
Confirmed databasesappinit.confirmed.databasesSystemMetadataFeatureInsight
Confirmed servicesappinit.confirmed.servicesSystemMetadataFeatureInsight
Modify add countappinit.modify_add.countSystemMetadataFeatureInsightMeasurement
Modify remove countappinit.modify_remove.countSystemMetadataFeatureInsightMeasurement
Last stepappinit.lastStepSystemMetadataFeatureInsight

Remote Build

FieldOTel KeyClassificationPurposeNotes
Remote build countcontainer.remoteBuild.countSystemMetadataFeatureInsightMeasurement

JSON-RPC

FieldOTel KeyClassificationPurposeNotes
RPC methodrpc.methodSystemMetadataFeatureInsight
Request IDrpc.jsonrpc.request_idSystemMetadataPerformanceAndHealth
Error coderpc.jsonrpc.error_codeSystemMetadataPerformanceAndHealthMeasurement

Agent

FieldOTel KeyClassificationPurpose
Fix attemptsagent.fix.attemptsSystemMetadataPerformanceAndHealth

Extensions

FieldOTel KeyClassificationPurposeNotes
Extension IDextension.idSystemMetadataFeatureInsight
Extension versionextension.versionSystemMetadataFeatureInsight
Extension installedextension.installedSystemMetadataFeatureInsightList of installed extensions, each formatted id@version
Extension version fromextension.version.fromSystemMetadataFeatureInsightInstalled version before an upgrade
Extension version toextension.version.toSystemMetadataFeatureInsightTarget version after an upgrade
Extension sourceextension.sourceSystemMetadataFeatureInsightRegistry source used for the upgrade
Extension source kindextension.source.kindSystemMetadataFeatureInsightAllowed values: none, registered, location
Extension source fromextension.source.fromSystemMetadataFeatureInsightRegistry source before a promotion
Extension source toextension.source.toSystemMetadataFeatureInsightRegistry source after a promotion
Upgrade durationextension.upgrade.duration_msSystemMetadataPerformanceAndHealthMeasurement — time in ms for one upgrade
Upgrade outcomeextension.upgrade.outcomeSystemMetadataFeatureInsightUpgrade result status
Dependency ofextension.dependency_ofSystemMetadataFeatureInsightParent extension for a dependency upgrade
Dependency upgrade countextension.dependency_upgrade_countSystemMetadataFeatureInsightRecursive dependency upgrade count

Update

FieldOTel KeyClassificationPurpose
Update channelupdate.channelSystemMetadataFeatureInsight
Install methodupdate.installMethodSystemMetadataFeatureInsight
From versionupdate.fromVersionSystemMetadataFeatureInsight
To versionupdate.toVersionSystemMetadataFeatureInsight
Update resultupdate.resultSystemMetadataFeatureInsight

Copilot Session

FieldOTel KeyClassificationPurposeNotes
Session IDcopilot.session.idSystemMetadataFeatureInsight
Is new sessioncopilot.session.isNewSystemMetadataFeatureInsight
Message countcopilot.session.messageCountSystemMetadataFeatureInsightMeasurement

Copilot Init

FieldOTel KeyClassificationPurpose
Is first runcopilot.init.isFirstRunSystemMetadataFeatureInsight
Reasoning effortcopilot.init.reasoningEffortSystemMetadataFeatureInsight
Modelcopilot.init.modelSystemMetadataFeatureInsight
Consent scopecopilot.init.consentScopeSystemMetadataFeatureInsight

Copilot Message

FieldOTel KeyClassificationPurposeNotes
Modecopilot.modeSystemMetadataFeatureInsight
Modelcopilot.message.modelSystemMetadataFeatureInsight
Input tokenscopilot.message.inputTokensSystemMetadataPerformanceAndHealthMeasurement
Output tokenscopilot.message.outputTokensSystemMetadataPerformanceAndHealthMeasurement
Billing ratecopilot.message.billingRateSystemMetadataBusinessInsightMeasurement
Premium requestscopilot.message.premiumRequestsSystemMetadataBusinessInsightMeasurement
Duration (ms)copilot.message.durationMsSystemMetadataPerformanceAndHealthMeasurement
FieldOTel KeyClassificationPurposeNotes
Approved countcopilot.consent.approvedCountSystemMetadataFeatureInsightMeasurement
Denied countcopilot.consent.deniedCountSystemMetadataFeatureInsightMeasurement

Command-Specific Fields

The following fields are defined in fields.go.

FieldOTel KeyClassificationPurposeValues
Auth methodauth.methodSystemMetadataFeatureInsightbrowser, device-code, service-principal-secret, service-principal-certificate, federated-github, federated-azure-pipelines, federated-oidc, managed-identity, external, oneauth, check-status
Env countenv.countSystemMetadataFeatureInsightMeasurement — number of environments
Hooks namehooks.nameSystemMetadataFeatureInsightBuilt-in hook name (raw) or SHA-256 hash for extension/custom hooks. Known values: prebuild, postbuild, predeploy, postdeploy, predown, postdown, prepackage, postpackage, preprovision, postprovision, prepublish, postpublish, prerestore, postrestore, preup, postup
Hooks typehooks.typeSystemMetadataFeatureInsightproject, service, layer
Hooks kindhooks.kindSystemMetadataFeatureInsightExecutor used to run the hook. Values: sh, pwsh, python, js, ts, dotnet
Pipeline providerpipeline.providerSystemMetadataFeatureInsightResolved provider display name after auto-detection: GitHub, Azure DevOps
Pipeline authpipeline.authSystemMetadataFeatureInsightEmitted only when --auth-type is set on pipeline config: federated, client-credentials
Infra providerinfra.providerSystemMetadataFeatureInsightprovision/up/down: sorted, de-duplicated string slice of resolved providers — bicep/terraform/arm/pulumi verbatim, custom for any other (extension) provider (raw name not emitted); multi-layer projects that combine providers record each distinct value (e.g. ["bicep","terraform"]). infra generate/synth: the value read from azure.yaml's infra.provider directly as a single string (bicep/terraform/arm/pulumi, auto when unset, or custom for any other (extension) provider — raw name not emitted)

App Service Deploy

FieldOTel KeyClassificationPurposeNotes
Deploy attemptdeploy.appservice.attemptSystemMetadataPerformanceAndHealthMeasurement — retry attempt number for App Service zip deploy
Deploy linuxdeploy.appservice.linuxSystemMetadataFeatureInsightWhether the deploy targets a Linux web app

Tool Management

Telemetry for active azd tool install / upgrade / check operations and the dormant first-run field contract. Only built-in tool IDs (e.g. az-cli) and version strings are captured — no file paths, no user-identifiable data, no raw error text.

Dormant tool first-run (reserved)

The first-run middleware is not currently registered, so these fields are not emitted. They remain defined to support a possible future redesign without changing the telemetry contract.

FieldOTel KeyClassificationPurposeNotes
Skip reasontool.firstrun.skip_reasonSystemMetadataFeatureInsightWhy the first-run flow was bypassed. Values: env_var, no_prompt, ci_cd, non_interactive, already_completed, config_error
Opt-intool.firstrun.opt_inSystemMetadataFeatureInsightWhether the user accepted the first-run prompt
Tools detectedtool.firstrun.tools_detectedSystemMetadataFeatureInsightMeasurement — built-in tools already installed at first-run
Tools offeredtool.firstrun.tools_offeredSystemMetadataFeatureInsightMeasurement — number of recommended tools offered
Tools selectedtool.firstrun.tools_selectedSystemMetadataFeatureInsightMeasurement — number the user selected to install
Tools selected (names)tool.firstrun.tools_selected_namesSystemMetadataFeatureInsightComma-separated built-in tool IDs the user selected (e.g. az-cli,vscode-bicep,github-copilot-cli). Not user input — drawn from a fixed catalog
Tools deselected (names)tool.firstrun.tools_deselected_namesSystemMetadataFeatureInsightComma-separated built-in tool IDs the user deselected
Outcometool.firstrun.outcomeSystemMetadataFeatureInsightTerminal state. Values: completed, declined, cancelled, detect_failed, install_failed. Mutually exclusive with skip_reason
Install success counttool.firstrun.install_success_countSystemMetadataFeatureInsightMeasurement — first-run-scoped counterpart of tool.install.success_count
Install failure counttool.firstrun.install_failure_countSystemMetadataFeatureInsightMeasurement — first-run-scoped counterpart of tool.install.failure_count
Install failed IDstool.firstrun.install_failed_idsSystemMetadataFeatureInsightComma-separated built-in tool IDs whose first-run install failed
Install durationtool.firstrun.install_duration_msSystemMetadataFeatureInsightMeasurement — first-run-scoped install duration in ms

Tool install / upgrade / check

FieldOTel KeyClassificationPurposeNotes
Tool IDtool.idSystemMetadataFeatureInsightBuilt-in tool ID for single-tool operations. Values drawn from a fixed catalog (e.g. az-cli, vscode-bicep, github-copilot-cli, azure-mcp-server)
Tool IDstool.idsSystemMetadataFeatureInsightComma-separated built-in tool IDs for batch operations
Dry runtool.dry_runSystemMetadataFeatureInsightWhether --dry-run was specified
Install strategytool.install.strategySystemMetadataFeatureInsightInstall backend. Values come from strategy.PackageManager (e.g., winget, brew, apt, npm, code); command for command-based installs with no package manager; manual when the named package manager is unavailable on the platform
Install successtool.install.successSystemMetadataFeatureInsightWhether a single-target install/upgrade succeeded
Install success counttool.install.success_countSystemMetadataFeatureInsightMeasurement — number of tools that succeeded in a batch
Install failure counttool.install.failure_countSystemMetadataFeatureInsightMeasurement — number of tools that failed in a batch
Install failed IDstool.install.failed_idsSystemMetadataFeatureInsightComma-separated built-in tool IDs whose install/upgrade failed. Per-tool error messages are intentionally not captured
Install durationtool.install.duration_msSystemMetadataFeatureInsightMeasurement — total install/upgrade duration in ms
Upgrade from versiontool.upgrade.from_versionSystemMetadataFeatureInsightPrior version (single-target upgrades)
Upgrade to versiontool.upgrade.to_versionSystemMetadataFeatureInsightNew version after a successful upgrade
Updates availabletool.check.updates_availableSystemMetadataFeatureInsightMeasurement — number of installed tools with an available upgrade

Provision Validation

FieldOTel KeyClassificationPurposeNotes
Outcomevalidation.provision.outcomeSystemMetadataFeatureInsightValues: passed, warnings_accepted, canceled_by_errors, canceled_by_user, skipped, error
Diagnostic IDsvalidation.provision.diagnosticsSystemMetadataFeatureInsightList of diagnostic IDs emitted by provision validation checks (fixed code-defined enum, e.g. role_assignment_missing, role_assignment_conditional)
Rule IDsvalidation.provision.rulesSystemMetadataFeatureInsightList of rule IDs that were executed (fixed code-defined enum, e.g. role_assignment_permissions)
Extension rule IDsvalidation.provision.extension_rulesSystemMetadataFeatureInsightList of rule IDs from extension-provided validation checks (fixed code-defined enum)
Check typevalidation.provision.check_typeSystemMetadataFeatureInsightDispatch site: arm-provision (Bicep provider) or provision (provider-agnostic). Both share validation.provision; on Bicep provisions both fire, so consumers must group/filter by this to avoid double-counting
Warning countvalidation.provision.warning.countSystemMetadataFeatureInsightMeasurement
Error countvalidation.provision.error.countSystemMetadataFeatureInsightMeasurement

Provision

FieldOTel KeyClassificationPurposeNotes
Cancellationprovision.cancellationSystemMetadataFeatureInsightHow a Ctrl+C interrupt during azd provision / azd up was handled. Values: none, leave_running, canceled, cancel_timed_out, cancel_timed_out_nested, cancel_raced_succeeded, cancel_raced_failed, cancel_raced_deleted, cancel_too_late, cancel_failed

Execution Graph (Scheduler)

The execution graph powers the parallel up / provision / deploy engine.

FieldOTel KeyClassificationPurposeNotes
Step countexegraph.step.countSystemMetadataPerformanceAndHealthMeasurement — total number of steps in the graph
Max concurrencyexegraph.max_concurrencySystemMetadataPerformanceAndHealthEffective concurrency limit used for the run
Error policyexegraph.error_policySystemMetadataPerformanceAndHealthfail_fast or continue_on_error
Step nameexegraph.step.nameSystemMetadataPerformanceAndHealthHashed via fields.StringHashed — step names embed user-chosen service / layer names from azure.yaml (e.g., deploy-<svc.Name>, <layer.Name>)
Step depsexegraph.step.depsSystemMetadataPerformanceAndHealthHashed slice via fields.StringSliceHashed — each entry is another step name that embeds user-chosen identifiers
Step tagsexegraph.step.tagsSystemMetadataPerformanceAndHealthFixed internal vocabulary set by azd code (e.g., provision, deploy, package, cmdhook, event); emitted raw because it does not contain user input
Step timeoutexegraph.step.timeout_sSystemMetadataPerformanceAndHealthMeasurement — per-step timeout in seconds, when set

Multi-Layer Provision

Telemetry for the infra.layers[] parallel provisioning feature, emitted from internal/cmd/provision_graph.go.

FieldOTel KeyClassificationPurposeNotes
Layer countprovision.layer.countSystemMetadataPerformanceAndHealthMeasurement — total number of infra.layers[] declared in azure.yaml for the current run; 0 or 1 means single-layer (the legacy path)
Max parallelprovision.layer.max_parallelSystemMetadataPerformanceAndHealthMeasurement — largest number of layers scheduled in a single dependency level after static analysis (maximum achievable parallelism, distinct from the configured exegraph.max_concurrency cap)
Safe-fallback countprovision.layer.safe_fallback_countSystemMetadataPerformanceAndHealthMeasurement — layers that triggered the safe-by-default detector fallback (forced to depend on all earlier layers)
Explicit dependsOn countprovision.layer.explicit_dependson_countSystemMetadataPerformanceAndHealthMeasurement — layers that used the explicit infra.layers[].dependsOn schema

Data Classifications

Classifications are defined in internal/telemetry/fields/fields.go and control how data is stored, retained, and who may access it.

ClassificationDescription
PublicPersonalDataData the user has made public (e.g. GitHub username)
SystemMetadataNon-personal system/environment metadata
CallstackOrExceptionStack traces and exception details
CustomerContentUser-created content (files, messages) — highest sensitivity
EndUserPseudonymizedInformationPseudonymized user identifiers (hashed MACs, device IDs)
OrganizationalIdentifiableInformationOrganization-level identifiers (subscription IDs, tenant IDs)

Purposes

Each field is tagged with one or more purposes that govern its permitted use.

PurposeDescription
FeatureInsightUnderstanding feature adoption and usage patterns
BusinessInsightBusiness metrics (active users, organizations, growth)
PerformanceAndHealthPerformance monitoring, error rates, reliability

Hashing

Sensitive values are hashed before emission using functions in cli/azd/internal/tracing/fields/key.go.

FunctionBehavior
CaseInsensitiveHash(value string) stringLowercases, then SHA-256 hashes
StringHashed(k AttributeKey, v string) attribute.KeyValueCreates an OTel attribute with a case-insensitive SHA-256 hash
StringSliceHashed(k AttributeKey, v []string) attribute.KeyValueHashes each element in a string slice independently

Fields that are hashed:

  • project.template.id
  • project.template.version
  • project.name
  • env.name
  • exegraph.step.name (embeds user-chosen service / layer names from azure.yaml)
  • exegraph.step.deps (each entry is another step name and therefore embeds user-chosen identifiers)
  • hooks.name is hashed only when the value comes from an extension or custom hook (the built-in hook names are emitted raw)
  • pack.builder.image, pack.builder.tag are hashed when a user-defined image is used

Data Pipeline

┌──────────────┐    ┌─────────────────────┐    ┌──────────────┐    ┌──────────────────┐
│  OTel Spans  │───▶│ App Insights        │───▶│  Disk Queue  │───▶│ Azure Monitor /  │
│  (in-process)│    │ Exporter (custom)   │    │  (~/.azd/)   │    │ Kusto            │
└──────────────┘    └─────────────────────┘    └──────────────┘    └──────────────────┘


                                               ┌──────────────┐
                                               │  telemetry   │
                                               │  upload cmd  │
                                               └──────────────┘
  1. Instrumentation: Commands create OTel spans with attributes via tracing.Start and SetUsageAttributes.
  2. Export: A custom Application Insights exporter converts spans to App Insights envelopes.
  3. Queue: Envelopes are written to disk under ~/.azd/telemetry/.
  4. Upload: The azd telemetry upload command (run as a background process) reads the queue and sends data to Azure Monitor.
  5. Analysis: Data flows into Kusto tables for dashboarding and analysis via LENS jobs and cooked tables.