From 8da1ebe5559b3cba4d1a58b6ba18b66b29a99419 Mon Sep 17 00:00:00 2001 From: Qinen Zhu Date: Mon, 20 Jul 2026 16:32:19 +0800 Subject: [PATCH 1/2] feat: add Foundry Agent Canvas telemetry attribution --- cli/azd/internal/tracing/fields/fields.go | 1 + cli/azd/internal/tracing/resource/exec_environment.go | 3 +++ cli/azd/internal/tracing/resource/resource_test.go | 8 +++++++- cli/azd/test/functional/telemetry_test.go | 5 ++++- docs/reference/telemetry-data.md | 3 ++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cli/azd/internal/tracing/fields/fields.go b/cli/azd/internal/tracing/fields/fields.go index de360f23974..0ebeea7720f 100644 --- a/cli/azd/internal/tracing/fields/fields.go +++ b/cli/azd/internal/tracing/fields/fields.go @@ -322,6 +322,7 @@ const ( // that signal specific types of usages. EnvModifierAzureSpace = "Azure App Spaces Portal" + EnvModifierFoundryAgentCanvas = "Foundry Agent Canvas" EnvModifierMicrosoftFoundrySkill = "Microsoft Foundry Skill" ) diff --git a/cli/azd/internal/tracing/resource/exec_environment.go b/cli/azd/internal/tracing/resource/exec_environment.go index eb323344da1..8f69cb129a4 100644 --- a/cli/azd/internal/tracing/resource/exec_environment.go +++ b/cli/azd/internal/tracing/resource/exec_environment.go @@ -107,6 +107,9 @@ func execEnvModifiers() []string { if strings.Contains(userAgent, "azure_app_space_portal") { modifiers = append(modifiers, fields.EnvModifierAzureSpace) } + if strings.Contains(userAgent, "foundry_agent_canvas") { + modifiers = append(modifiers, fields.EnvModifierFoundryAgentCanvas) + } if strings.Contains(userAgent, "microsoft_foundry_skill") { modifiers = append(modifiers, fields.EnvModifierMicrosoftFoundrySkill) } diff --git a/cli/azd/internal/tracing/resource/resource_test.go b/cli/azd/internal/tracing/resource/resource_test.go index 6f8a9ee2c2a..50370756734 100644 --- a/cli/azd/internal/tracing/resource/resource_test.go +++ b/cli/azd/internal/tracing/resource/resource_test.go @@ -278,11 +278,17 @@ func TestExecEnvModifiers(t *testing.T) { userAgent: "microsoft_foundry_skill", want: []string{fields.EnvModifierMicrosoftFoundrySkill}, }, + { + name: "Foundry Agent Canvas", + userAgent: "foundry_agent_canvas", + want: []string{fields.EnvModifierFoundryAgentCanvas}, + }, { name: "multiple modifiers", - userAgent: "azure_app_space_portal microsoft_foundry_skill", + userAgent: "azure_app_space_portal foundry_agent_canvas microsoft_foundry_skill", want: []string{ fields.EnvModifierAzureSpace, + fields.EnvModifierFoundryAgentCanvas, fields.EnvModifierMicrosoftFoundrySkill, }, }, diff --git a/cli/azd/test/functional/telemetry_test.go b/cli/azd/test/functional/telemetry_test.go index 8258d67faf6..a892bbc57b8 100644 --- a/cli/azd/test/functional/telemetry_test.go +++ b/cli/azd/test/functional/telemetry_test.go @@ -240,7 +240,7 @@ func Test_CLI_Telemetry_NestedCommands(t *testing.T) { // set environment modifiers cli.Env = append( cli.Env, - "AZURE_DEV_USER_AGENT=azure_app_space_portal:v1.0.0 microsoft_foundry_skill", + "AZURE_DEV_USER_AGENT=azure_app_space_portal:v1.0.0 foundry_agent_canvas microsoft_foundry_skill", ) // set a fixed traceparent to verify trace ID propagation for commands and nested commands @@ -442,6 +442,9 @@ func verifyResource( if strings.Contains(env, "azure_app_space_portal") { require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierAzureSpace) } + if strings.Contains(env, "foundry_agent_canvas") { + require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierFoundryAgentCanvas) + } if strings.Contains(env, "microsoft_foundry_skill") { require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierMicrosoftFoundrySkill) } diff --git a/docs/reference/telemetry-data.md b/docs/reference/telemetry-data.md index 47f001122e0..f6c0c90cd28 100644 --- a/docs/reference/telemetry-data.md +++ b/docs/reference/telemetry-data.md @@ -587,7 +587,8 @@ The `execution.environment` field identifies where azd is running. Format: ` Date: Fri, 24 Jul 2026 13:10:58 +0800 Subject: [PATCH 2/2] fix: rename attribution to Microsoft Foundry Canvas --- cli/azd/internal/tracing/fields/fields.go | 6 +++--- cli/azd/internal/tracing/resource/exec_environment.go | 4 ++-- cli/azd/internal/tracing/resource/resource_test.go | 10 +++++----- cli/azd/test/functional/telemetry_test.go | 6 +++--- docs/reference/telemetry-data.md | 2 +- docs/specs/metrics-audit/telemetry-schema.md | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cli/azd/internal/tracing/fields/fields.go b/cli/azd/internal/tracing/fields/fields.go index 0ebeea7720f..45f5031ed31 100644 --- a/cli/azd/internal/tracing/fields/fields.go +++ b/cli/azd/internal/tracing/fields/fields.go @@ -321,9 +321,9 @@ const ( // Environment modifiers. These are not environments themselves, but rather modifiers to the environment // that signal specific types of usages. - EnvModifierAzureSpace = "Azure App Spaces Portal" - EnvModifierFoundryAgentCanvas = "Foundry Agent Canvas" - EnvModifierMicrosoftFoundrySkill = "Microsoft Foundry Skill" + EnvModifierAzureSpace = "Azure App Spaces Portal" + EnvModifierMicrosoftFoundryCanvas = "Microsoft Foundry Canvas" + EnvModifierMicrosoftFoundrySkill = "Microsoft Foundry Skill" ) // All possible enumerations of AccountTypeKey diff --git a/cli/azd/internal/tracing/resource/exec_environment.go b/cli/azd/internal/tracing/resource/exec_environment.go index 8f69cb129a4..b41825a7001 100644 --- a/cli/azd/internal/tracing/resource/exec_environment.go +++ b/cli/azd/internal/tracing/resource/exec_environment.go @@ -107,8 +107,8 @@ func execEnvModifiers() []string { if strings.Contains(userAgent, "azure_app_space_portal") { modifiers = append(modifiers, fields.EnvModifierAzureSpace) } - if strings.Contains(userAgent, "foundry_agent_canvas") { - modifiers = append(modifiers, fields.EnvModifierFoundryAgentCanvas) + if strings.Contains(userAgent, "microsoft_foundry_canvas") { + modifiers = append(modifiers, fields.EnvModifierMicrosoftFoundryCanvas) } if strings.Contains(userAgent, "microsoft_foundry_skill") { modifiers = append(modifiers, fields.EnvModifierMicrosoftFoundrySkill) diff --git a/cli/azd/internal/tracing/resource/resource_test.go b/cli/azd/internal/tracing/resource/resource_test.go index 50370756734..a610caa8901 100644 --- a/cli/azd/internal/tracing/resource/resource_test.go +++ b/cli/azd/internal/tracing/resource/resource_test.go @@ -279,16 +279,16 @@ func TestExecEnvModifiers(t *testing.T) { want: []string{fields.EnvModifierMicrosoftFoundrySkill}, }, { - name: "Foundry Agent Canvas", - userAgent: "foundry_agent_canvas", - want: []string{fields.EnvModifierFoundryAgentCanvas}, + name: "Microsoft Foundry Canvas", + userAgent: "microsoft_foundry_canvas", + want: []string{fields.EnvModifierMicrosoftFoundryCanvas}, }, { name: "multiple modifiers", - userAgent: "azure_app_space_portal foundry_agent_canvas microsoft_foundry_skill", + userAgent: "azure_app_space_portal microsoft_foundry_canvas microsoft_foundry_skill", want: []string{ fields.EnvModifierAzureSpace, - fields.EnvModifierFoundryAgentCanvas, + fields.EnvModifierMicrosoftFoundryCanvas, fields.EnvModifierMicrosoftFoundrySkill, }, }, diff --git a/cli/azd/test/functional/telemetry_test.go b/cli/azd/test/functional/telemetry_test.go index a892bbc57b8..a9b1c8eb197 100644 --- a/cli/azd/test/functional/telemetry_test.go +++ b/cli/azd/test/functional/telemetry_test.go @@ -240,7 +240,7 @@ func Test_CLI_Telemetry_NestedCommands(t *testing.T) { // set environment modifiers cli.Env = append( cli.Env, - "AZURE_DEV_USER_AGENT=azure_app_space_portal:v1.0.0 foundry_agent_canvas microsoft_foundry_skill", + "AZURE_DEV_USER_AGENT=azure_app_space_portal:v1.0.0 microsoft_foundry_canvas microsoft_foundry_skill", ) // set a fixed traceparent to verify trace ID propagation for commands and nested commands @@ -442,8 +442,8 @@ func verifyResource( if strings.Contains(env, "azure_app_space_portal") { require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierAzureSpace) } - if strings.Contains(env, "foundry_agent_canvas") { - require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierFoundryAgentCanvas) + if strings.Contains(env, "microsoft_foundry_canvas") { + require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierMicrosoftFoundryCanvas) } if strings.Contains(env, "microsoft_foundry_skill") { require.Contains(t, m[fields.ExecutionEnvironmentKey.Key], ";"+fields.EnvModifierMicrosoftFoundrySkill) diff --git a/docs/reference/telemetry-data.md b/docs/reference/telemetry-data.md index f6c0c90cd28..900585be725 100644 --- a/docs/reference/telemetry-data.md +++ b/docs/reference/telemetry-data.md @@ -587,7 +587,7 @@ The `execution.environment` field identifies where azd is running. Format: `[;...]`. Base values: `Desktop`, `Visual Studio`, `Visual Studio Code`, `VS Code Azure GitHub Copilot`, `Azure CloudShell`, `Claude Code`, `GitHub Copilot CLI`, `Gemini`, `OpenCode`, `UnknownCI`, `Azure Pipelines`, `GitHub Actions`, `AppVeyor`, `Bamboo`, `BitBucket Pipelines`, `Travis CI`, `Circle CI`, `GitLab CI`, `Jenkins`, `AWS CodeBuild`, `Google Cloud Build`, `TeamCity`, `JetBrains Space`, `GitHub Codespaces`. Modifiers: `Azure App Spaces Portal`, `Microsoft Foundry Canvas`, `Microsoft Foundry Skill` | | Installer | `service.installer` | SystemMetadata | FeatureInsight | How azd was installed | ### Experimentation