Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions common/commands/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,14 @@ func reportUsageToVisibilitySystem(command Command, serverDetails *config.Server
var visibilityMetricsData *visibility.MetricsData
if metricsData != nil {
visibilityMetricsData = &visibility.MetricsData{
Flags: metricsData.Flags,
Platform: metricsData.Platform,
Architecture: metricsData.Architecture,
IsCI: metricsData.IsCI,
CISystem: metricsData.CISystem,
IsContainer: metricsData.IsContainer,
Flags: metricsData.Flags,
Platform: metricsData.Platform,
Architecture: metricsData.Architecture,
IsCI: metricsData.IsCI,
CISystem: metricsData.CISystem,
IsContainer: metricsData.IsContainer,
PackageAlias: metricsData.PackageAlias,
PackageManager: metricsData.PackageManager,
}
}
commandsCountMetric = visibility.NewCommandsCountMetricWithEnhancedData(commandName, visibilityMetricsData)
Expand Down
35 changes: 26 additions & 9 deletions common/commands/metrics_collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ type MetricsData = metrics.MetricsData

// metricsCollector provides thread-safe collection and storage of command metrics
type metricsCollector struct {
mu sync.RWMutex
metricsData map[string]*MetricsData
mu sync.RWMutex
metricsData map[string]*MetricsData
packageAliasContext string
}

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

pkgAliasTool := globalMetricsCollector.packageAliasContext
globalMetricsCollector.packageAliasContext = ""

metricsData := &MetricsData{
Flags: flags,
Platform: runtime.GOOS,
Expand All @@ -43,7 +47,9 @@ func CollectMetrics(commandName string, flags []string) {
}
return ""
}(),
IsContainer: isRunningInContainer(),
IsContainer: isRunningInContainer(),
PackageAlias: pkgAliasTool != "",
PackageManager: pkgAliasTool,
}

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

return &MetricsData{
Flags: append([]string(nil), metrics.Flags...),
Platform: metrics.Platform,
Architecture: metrics.Architecture,
IsCI: metrics.IsCI,
CISystem: metrics.CISystem,
IsContainer: metrics.IsContainer,
Flags: append([]string(nil), metrics.Flags...),
Platform: metrics.Platform,
Architecture: metrics.Architecture,
IsCI: metrics.IsCI,
CISystem: metrics.CISystem,
IsContainer: metrics.IsContainer,
PackageAlias: metrics.PackageAlias,
PackageManager: metrics.PackageManager,
}
}

Expand Down Expand Up @@ -164,3 +172,12 @@ func GetContextFlags() []string {
contextFlags = nil
return flags
}

// SetPackageAliasContext records that the current command was invoked via a
// package alias for the given package manager tool (e.g. "npm", "pip").
// CollectMetrics reads and clears this value automatically.
func SetPackageAliasContext(tool string) {
globalMetricsCollector.mu.Lock()
defer globalMetricsCollector.mu.Unlock()
globalMetricsCollector.packageAliasContext = tool
}
50 changes: 50 additions & 0 deletions common/commands/metrics_collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,56 @@ func TestReportUsageToVisibilitySystemWithoutMetrics(t *testing.T) {
}
}

func TestSetPackageAliasContext(t *testing.T) {
ClearAllMetrics()
// Ensure context is clear before test
globalMetricsCollector.packageAliasContext = ""

commandName := "npm_install"
flags := []string{"save-dev"}

// Set the package alias context (simulates DispatchIfAlias -> runJFMode)
SetPackageAliasContext("npm")

// Collect metrics (simulates commands.Exec)
CollectMetrics(commandName, flags)

metrics := GetCollectedMetrics(commandName)
if metrics == nil {
t.Fatal("Expected metrics to be collected")
}
if !metrics.PackageAlias {
t.Error("Expected PackageAlias to be true")
}
if metrics.PackageManager != "npm" {
t.Errorf("Expected PackageManager 'npm', got '%s'", metrics.PackageManager)
}

// packageAliasContext must be cleared after CollectMetrics
if globalMetricsCollector.packageAliasContext != "" {
t.Errorf("Expected packageAliasContext to be cleared, got '%s'", globalMetricsCollector.packageAliasContext)
}
}

func TestCollectMetrics_WithoutPackageAlias(t *testing.T) {
ClearAllMetrics()
globalMetricsCollector.packageAliasContext = ""

commandName := "rt_upload"
CollectMetrics(commandName, nil)

metrics := GetCollectedMetrics(commandName)
if metrics == nil {
t.Fatal("Expected metrics to be collected")
}
if metrics.PackageAlias {
t.Error("Expected PackageAlias to be false when not set")
}
if metrics.PackageManager != "" {
t.Errorf("Expected PackageManager to be empty, got '%s'", metrics.PackageManager)
}
}

func TestMetricsIntegrationFlow(t *testing.T) {
// Clear any existing metrics
globalMetricsCollector.mu.Lock()
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ require (
github.com/CycloneDX/cyclonedx-go v0.9.3 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v1.3.0 // indirect
github.com/ProtonMail/go-crypto v1.3.0 // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/andybalholm/brotli v1.2.0 // indirect
Expand Down
Loading
Loading