Repository: docker/compose-cli
Pull request #906 (2020-11-13 11:46:45)

Collect metrics --help flag
Signed-off-by: Guillaume Tardif <guillaume.tardif@docker.com>

**What I did**
Add --help in specific flags we catch in metrics

**Related issue**
https://docker.slack.com/archives/C0111G2RCE4/p1605266835109100

<!-- optional tests
You can add a / mention to run tests executed by default only on main branch : 
* `test-aci` to run ACI E2E tests
* `test-ecs` to run ECS E2E tests
* `test-windows` to run tests & E2E tests on windows
-->

**(not mandatory) A picture of a cute animal, if possible in relation with what you did**
![](https://www.psd-dude.com/tutorials/resources-images/animal-morph-photoshop-tutorials/morphing-photoshop-tutorial.jpg)


Patch:
diff --git a/metrics/commands.go b/metrics/commands.go
index bcf9ee91..af491a89 100644
--- a/metrics/commands.go
+++ b/metrics/commands.go
@@ -23,6 +23,7 @@ var commandFlags = []string{
 
 // Generated with generatecommands/main.go
 var managementCommands = []string{
+	"help",
 	"ecs",
 	"scan",
 	"app",
diff --git a/metrics/generatecommands/main.go b/metrics/generatecommands/main.go
index 9491c4e8..c24c6305 100644
--- a/metrics/generatecommands/main.go
+++ b/metrics/generatecommands/main.go
@@ -35,6 +35,7 @@ func main() {
 
 	fmt.Printf(`
 var managementCommands = []string{
+	"help",
 	"%s",
 }
 
diff --git a/metrics/metrics.go b/metrics/metrics.go
index 3f6c3931..801c25bb 100644
--- a/metrics/metrics.go
+++ b/metrics/metrics.go
@@ -17,6 +17,8 @@
 package metrics
 
 import (
+	"strings"
+
 	"github.com/docker/compose-cli/utils"
 )
 
@@ -52,18 +54,15 @@ func GetCommand(args []string) string {
 	onlyFlags := false
 	for _, arg := range args {
 		if arg == "--help" {
-			return ""
+			result = strings.TrimSpace(arg + " " + result)
+			continue
 		}
 		if arg == "--" {
 			break
 		}
 		if isCommandFlag(arg) || (!onlyFlags && isCommand(arg)) {
-			if result == "" {
-				result = arg
-			} else {
-				result = result + " " + arg
-			}
-			if !isManagementCommand(arg) {
+			result = strings.TrimSpace(result + " " + arg)
+			if isCommand(arg) && !isManagementCommand(arg) {
 				onlyFlags = true
 			}
 		}


Test patch:
diff --git a/metrics/metrics_test.go b/metrics/metrics_test.go
index cd66e18a..f9c24d87 100644
--- a/metrics/metrics_test.go
+++ b/metrics/metrics_test.go
@@ -153,26 +153,31 @@ func TestGetCommand(t *testing.T) {
 	}
 }
 
-func TestIgnoreHelpCommands(t *testing.T) {
+func TestKeepHelpCommands(t *testing.T) {
 	testCases := []struct {
 		name     string
 		args     []string
 		expected string
 	}{
 		{
-			name:     "help",
-			args:     []string{"--help"},
-			expected: "",
+			name:     "run with help flag",
+			args:     []string{"run", "--help"},
+			expected: "--help run",
 		},
 		{
-			name:     "help on run",
-			args:     []string{"run", "--help"},
-			expected: "",
+			name:     "with help flag before-after commands",
+			args:     []string{"compose", "--help", "up"},
+			expected: "--help compose up",
 		},
 		{
-			name:     "help on compose up",
-			args:     []string{"compose", "up", "--help"},
-			expected: "",
+			name:     "help flag",
+			args:     []string{"--help"},
+			expected: "--help",
+		},
+		{
+			name:     "help commands",
+			args:     []string{"help", "run"},
+			expected: "help run",
 		},
 	}
 
diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go
index f404bded..d0615490 100644
--- a/tests/e2e/e2e_test.go
+++ b/tests/e2e/e2e_test.go
@@ -161,15 +161,19 @@ func TestContextMetrics(t *testing.T) {
 	s.Start()
 	defer s.Stop()
 
-	t.Run("do not send metrics on help commands", func(t *testing.T) {
+	t.Run("send metrics on help commands", func(t *testing.T) {
 		s.ResetUsage()
 
+		c.RunDockerCmd("help", "run")
 		c.RunDockerCmd("--help")
-		c.RunDockerCmd("ps", "--help")
 		c.RunDockerCmd("run", "--help")
 
 		usage := s.GetUsage()
-		assert.Equal(t, 0, len(usage))
+		assert.DeepEqual(t, []string{
+			`{"command":"help run","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"--help","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"--help run","context":"moby","source":"cli","status":"success"}`,
+		}, usage)
 	})
 
 	t.Run("metrics on default context", func(t *testing.T) {
@@ -180,10 +184,11 @@ func TestContextMetrics(t *testing.T) {
 		c.RunDockerOrExitError("version", "--xxx")
 
 		usage := s.GetUsage()
-		assert.Equal(t, 3, len(usage))
-		assert.Equal(t, `{"command":"ps","context":"moby","source":"cli","status":"success"}`, usage[0])
-		assert.Equal(t, `{"command":"version","context":"moby","source":"cli","status":"success"}`, usage[1])
-		assert.Equal(t, `{"command":"version","context":"moby","source":"cli","status":"failure"}`, usage[2])
+		assert.DeepEqual(t, []string{
+			`{"command":"ps","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"version","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"version","context":"moby","source":"cli","status":"failure"}`,
+		}, usage)
 	})
 
 	t.Run("metrics on other context type", func(t *testing.T) {
@@ -198,14 +203,15 @@ func TestContextMetrics(t *testing.T) {
 		c.RunDockerCmd("--context", "test-example", "ps")
 
 		usage := s.GetUsage()
-		assert.Equal(t, 7, len(usage))
-		assert.Equal(t, `{"command":"context create","context":"moby","source":"cli","status":"success"}`, usage[0])
-		assert.Equal(t, `{"command":"ps","context":"moby","source":"cli","status":"success"}`, usage[1])
-		assert.Equal(t, `{"command":"context use","context":"moby","source":"cli","status":"success"}`, usage[2])
-		assert.Equal(t, `{"command":"ps","context":"example","source":"cli","status":"success"}`, usage[3])
-		assert.Equal(t, `{"command":"stop","context":"example","source":"cli","status":"failure"}`, usage[4])
-		assert.Equal(t, `{"command":"context use","context":"example","source":"cli","status":"success"}`, usage[5])
-		assert.Equal(t, `{"command":"ps","context":"example","source":"cli","status":"success"}`, usage[6])
+		assert.DeepEqual(t, []string{
+			`{"command":"context create","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"ps","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"context use","context":"moby","source":"cli","status":"success"}`,
+			`{"command":"ps","context":"example","source":"cli","status":"success"}`,
+			`{"command":"stop","context":"example","source":"cli","status":"failure"}`,
+			`{"command":"context use","context":"example","source":"cli","status":"success"}`,
+			`{"command":"ps","context":"example","source":"cli","status":"success"}`,
+		}, usage)
 	})
 }