diff --git a/cmd/cmdtrace/cmd_span.go b/cmd/cmdtrace/cmd_span.go index bb85c15d352..50726410cc5 100644 --- a/cmd/cmdtrace/cmd_span.go +++ b/cmd/cmdtrace/cmd_span.go @@ -114,13 +114,14 @@ func wrapRunE(c *cobra.Command, cmdSpan trace.Span, tracingShutdown tracing.Shut } } -// commandName returns the path components for a given command. +// commandName returns the path components for a given command, +// in reverse alphabetical order for consistent usage metrics. // // The root Compose command and anything before (i.e. "docker") // are not included. // // For example: -// - docker compose alpha watch -> [alpha, watch] +// - docker compose alpha watch -> [watch, alpha] // - docker-compose up -> [up] func commandName(cmd *cobra.Command) []string { var name []string diff --git a/cmd/cmdtrace/cmd_span_test.go b/cmd/cmdtrace/cmd_span_test.go index 3d661eda85a..75073307c5a 100644 --- a/cmd/cmdtrace/cmd_span_test.go +++ b/cmd/cmdtrace/cmd_span_test.go @@ -20,6 +20,8 @@ import ( "reflect" "testing" + commands "github.com/docker/compose/v2/cmd/compose" + "github.com/spf13/cobra" flag "github.com/spf13/pflag" ) @@ -61,3 +63,50 @@ func TestGetFlags(t *testing.T) { }) } } + +func TestCommandName(t *testing.T) { + tests := []struct { + name string + setupCmd func() *cobra.Command + want []string + }{ + { + name: "docker compose alpha watch -> [watch, alpha]", + setupCmd: func() *cobra.Command { + dockerCmd := &cobra.Command{Use: "docker"} + composeCmd := &cobra.Command{Use: commands.PluginName} + alphaCmd := &cobra.Command{Use: "alpha"} + watchCmd := &cobra.Command{Use: "watch"} + + dockerCmd.AddCommand(composeCmd) + composeCmd.AddCommand(alphaCmd) + alphaCmd.AddCommand(watchCmd) + + return watchCmd + }, + want: []string{"watch", "alpha"}, + }, + { + name: "docker-compose up -> [up]", + setupCmd: func() *cobra.Command { + dockerComposeCmd := &cobra.Command{Use: commands.PluginName} + upCmd := &cobra.Command{Use: "up"} + + dockerComposeCmd.AddCommand(upCmd) + + return upCmd + }, + want: []string{"up"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := tt.setupCmd() + got := commandName(cmd) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("commandName() = %v, want %v", got, tt.want) + } + }) + } +}