Skip to content

Commit 8294d4c

Browse files
committed
Added metrics for package alias
1 parent bc599ce commit 8294d4c

File tree

8 files changed

+240
-41
lines changed

8 files changed

+240
-41
lines changed

common/commands/command.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,14 @@ func reportUsageToVisibilitySystem(command Command, serverDetails *config.Server
118118
var visibilityMetricsData *visibility.MetricsData
119119
if metricsData != nil {
120120
visibilityMetricsData = &visibility.MetricsData{
121-
Flags: metricsData.Flags,
122-
Platform: metricsData.Platform,
123-
Architecture: metricsData.Architecture,
124-
IsCI: metricsData.IsCI,
125-
CISystem: metricsData.CISystem,
126-
IsContainer: metricsData.IsContainer,
121+
Flags: metricsData.Flags,
122+
Platform: metricsData.Platform,
123+
Architecture: metricsData.Architecture,
124+
IsCI: metricsData.IsCI,
125+
CISystem: metricsData.CISystem,
126+
IsContainer: metricsData.IsContainer,
127+
PackageAlias: metricsData.PackageAlias,
128+
PackageManager: metricsData.PackageManager,
127129
}
128130
}
129131
commandsCountMetric = visibility.NewCommandsCountMetricWithEnhancedData(commandName, visibilityMetricsData)

common/commands/metrics_collector.go

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ type MetricsData = metrics.MetricsData
1414

1515
// metricsCollector provides thread-safe collection and storage of command metrics
1616
type metricsCollector struct {
17-
mu sync.RWMutex
18-
metricsData map[string]*MetricsData
17+
mu sync.RWMutex
18+
metricsData map[string]*MetricsData
19+
packageAliasContext string
1920
}
2021

2122
var contextFlags []string
@@ -32,6 +33,9 @@ func CollectMetrics(commandName string, flags []string) {
3233
ciSystem := detectCISystem()
3334
isCI := ciSystem != ""
3435

36+
pkgAliasTool := globalMetricsCollector.packageAliasContext
37+
globalMetricsCollector.packageAliasContext = ""
38+
3539
metricsData := &MetricsData{
3640
Flags: flags,
3741
Platform: runtime.GOOS,
@@ -43,7 +47,9 @@ func CollectMetrics(commandName string, flags []string) {
4347
}
4448
return ""
4549
}(),
46-
IsContainer: isRunningInContainer(),
50+
IsContainer: isRunningInContainer(),
51+
PackageAlias: pkgAliasTool != "",
52+
PackageManager: pkgAliasTool,
4753
}
4854

4955
globalMetricsCollector.metricsData[commandName] = metricsData
@@ -61,12 +67,14 @@ func GetCollectedMetrics(commandName string) *MetricsData {
6167
}
6268

6369
return &MetricsData{
64-
Flags: append([]string(nil), metrics.Flags...),
65-
Platform: metrics.Platform,
66-
Architecture: metrics.Architecture,
67-
IsCI: metrics.IsCI,
68-
CISystem: metrics.CISystem,
69-
IsContainer: metrics.IsContainer,
70+
Flags: append([]string(nil), metrics.Flags...),
71+
Platform: metrics.Platform,
72+
Architecture: metrics.Architecture,
73+
IsCI: metrics.IsCI,
74+
CISystem: metrics.CISystem,
75+
IsContainer: metrics.IsContainer,
76+
PackageAlias: metrics.PackageAlias,
77+
PackageManager: metrics.PackageManager,
7078
}
7179
}
7280

@@ -164,3 +172,12 @@ func GetContextFlags() []string {
164172
contextFlags = nil
165173
return flags
166174
}
175+
176+
// SetPackageAliasContext records that the current command was invoked via a
177+
// package alias for the given package manager tool (e.g. "npm", "pip").
178+
// CollectMetrics reads and clears this value automatically.
179+
func SetPackageAliasContext(tool string) {
180+
globalMetricsCollector.mu.Lock()
181+
defer globalMetricsCollector.mu.Unlock()
182+
globalMetricsCollector.packageAliasContext = tool
183+
}

common/commands/metrics_collector_test.go

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ func TestDetectCISystem(t *testing.T) {
191191
}
192192

193193
// Restore environment after test
194-
defer func() {
194+
defer func() {
195195
for envVar, value := range originalEnv {
196196
if value != "" {
197197
if err := os.Setenv(envVar, value); err != nil {
@@ -219,7 +219,7 @@ func TestDetectCISystem(t *testing.T) {
219219
{"No CI", "", "", ""},
220220
}
221221

222-
for _, tt := range tests {
222+
for _, tt := range tests {
223223
t.Run(tt.name, func(t *testing.T) {
224224
// Clear all CI environment variables
225225
for _, envVar := range ciEnvVars {
@@ -832,6 +832,56 @@ func TestReportUsageToVisibilitySystemWithoutMetrics(t *testing.T) {
832832
}
833833
}
834834

835+
func TestSetPackageAliasContext(t *testing.T) {
836+
ClearAllMetrics()
837+
// Ensure context is clear before test
838+
globalMetricsCollector.packageAliasContext = ""
839+
840+
commandName := "npm_install"
841+
flags := []string{"save-dev"}
842+
843+
// Set the package alias context (simulates DispatchIfAlias -> runJFMode)
844+
SetPackageAliasContext("npm")
845+
846+
// Collect metrics (simulates commands.Exec)
847+
CollectMetrics(commandName, flags)
848+
849+
metrics := GetCollectedMetrics(commandName)
850+
if metrics == nil {
851+
t.Fatal("Expected metrics to be collected")
852+
}
853+
if !metrics.PackageAlias {
854+
t.Error("Expected PackageAlias to be true")
855+
}
856+
if metrics.PackageManager != "npm" {
857+
t.Errorf("Expected PackageManager 'npm', got '%s'", metrics.PackageManager)
858+
}
859+
860+
// packageAliasContext must be cleared after CollectMetrics
861+
if globalMetricsCollector.packageAliasContext != "" {
862+
t.Errorf("Expected packageAliasContext to be cleared, got '%s'", globalMetricsCollector.packageAliasContext)
863+
}
864+
}
865+
866+
func TestCollectMetrics_WithoutPackageAlias(t *testing.T) {
867+
ClearAllMetrics()
868+
globalMetricsCollector.packageAliasContext = ""
869+
870+
commandName := "rt_upload"
871+
CollectMetrics(commandName, nil)
872+
873+
metrics := GetCollectedMetrics(commandName)
874+
if metrics == nil {
875+
t.Fatal("Expected metrics to be collected")
876+
}
877+
if metrics.PackageAlias {
878+
t.Error("Expected PackageAlias to be false when not set")
879+
}
880+
if metrics.PackageManager != "" {
881+
t.Errorf("Expected PackageManager to be empty, got '%s'", metrics.PackageManager)
882+
}
883+
}
884+
835885
func TestMetricsIntegrationFlow(t *testing.T) {
836886
// Clear any existing metrics
837887
globalMetricsCollector.mu.Lock()

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ require (
3636
github.com/CycloneDX/cyclonedx-go v0.9.3 // indirect
3737
github.com/Microsoft/go-winio v0.6.2 // indirect
3838
github.com/ProtonMail/go-crypto v1.3.0 // indirect
39+
github.com/ProtonMail/go-crypto v1.3.0 // indirect
3940
github.com/VividCortex/ewma v1.2.0 // indirect
4041
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
4142
github.com/andybalholm/brotli v1.2.0 // indirect

0 commit comments

Comments
 (0)