-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathanalytics.go
More file actions
112 lines (91 loc) · 2.39 KB
/
analytics.go
File metadata and controls
112 lines (91 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package analytics
import (
_ "embed"
"encoding/json"
"os"
"github.com/launchdarkly/ldcli/cmd/cliflags"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"golang.org/x/term"
)
type envChecker interface {
Getenv(key string) string
IsTerminal(fd int) bool
StdinFd() int
StdoutFd() int
}
type osEnvChecker struct{}
func (osEnvChecker) Getenv(key string) string { return os.Getenv(key) }
func (osEnvChecker) IsTerminal(fd int) bool { return term.IsTerminal(fd) }
func (osEnvChecker) StdinFd() int { return int(os.Stdin.Fd()) }
func (osEnvChecker) StdoutFd() int { return int(os.Stdout.Fd()) }
//go:embed known_agents.json
var knownAgentsJSON []byte
type agentEnvVar struct {
EnvVar string `json:"env_var"`
Label string `json:"label"`
}
type knownAgentsConfig struct {
Agents []agentEnvVar `json:"agents"`
CIEnvVars []string `json:"ci_env_vars"`
}
var (
knownAgentEnvVars []agentEnvVar
knownCIEnvVars []string
)
func init() {
var cfg knownAgentsConfig
if err := json.Unmarshal(knownAgentsJSON, &cfg); err != nil {
panic("failed to parse embedded known_agents.json: " + err.Error())
}
knownAgentEnvVars = cfg.Agents
knownCIEnvVars = cfg.CIEnvVars
}
// DetectAgentContext returns a label identifying the agent environment, or ""
// if the CLI appears to be running in an interactive human terminal.
func DetectAgentContext() string {
return detectAgentContext(osEnvChecker{})
}
func detectAgentContext(env envChecker) string {
if v := env.Getenv("LD_CLI_AGENT"); v != "" {
return "explicit:" + v
}
for _, a := range knownAgentEnvVars {
if env.Getenv(a.EnvVar) != "" {
return a.Label
}
}
if env.IsTerminal(env.StdinFd()) || env.IsTerminal(env.StdoutFd()) {
return ""
}
for _, ciVar := range knownCIEnvVars {
if env.Getenv(ciVar) != "" {
return "ci"
}
}
return "unknown-non-interactive"
}
func CmdRunEventProperties(
cmd *cobra.Command,
name string,
overrides map[string]interface{},
) map[string]interface{} {
baseURI := viper.GetString(cliflags.BaseURIFlag)
var flags []string
cmd.Flags().Visit(func(f *pflag.Flag) {
flags = append(flags, f.Name)
})
properties := map[string]interface{}{
"name": name,
"action": cmd.CalledAs(),
"flags": flags,
}
if baseURI != cliflags.BaseURIDefault {
properties["baseURI"] = baseURI
}
for k, v := range overrides {
properties[k] = v
}
return properties
}