From 8da1ebe5559b3cba4d1a58b6ba18b66b29a99419 Mon Sep 17 00:00:00 2001 From: Qinen Zhu Date: Mon, 20 Jul 2026 16:32:19 +0800 Subject: [PATCH] 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: `