Skip to content

Commit 6ae2c2d

Browse files
authored
[internal/useragent] Add user agent string when EBS metrics exist (#381)
1 parent 750c7e7 commit 6ae2c2d

File tree

3 files changed

+48
-11
lines changed

3 files changed

+48
-11
lines changed

exporter/awsemfexporter/emf_exporter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ func (emf *emfExporter) start(_ context.Context, host component.Host) error {
231231
// Below are optimizatons to minimize amoount of
232232
// metrics processing. We have two scearios
233233
// 1. AppSignal - Only run Process function for AppSignal related useragent
234-
// 2. Enhanced Container Insights - Only run ProcessMetrics function for CI EBS related useragent
234+
// 2. Enhanced Container Insights - Only run ProcessMetrics function for CI related useragent
235235
if emf.config.IsAppSignalsEnabled() || emf.config.IsEnhancedContainerInsights() {
236236
userAgent := useragent.NewUserAgent()
237237
emf.svcStructuredLog.Handlers().Build.PushFrontNamed(userAgent.Handler())

exporter/awsemfexporter/internal/useragent/useragent.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,16 @@ const (
2828

2929
// TODO: Available in semconv/v1.21.0+. Replace after collector dependency is v0.91.0+.
3030
attributeTelemetryDistroVersion = "telemetry.distro.version"
31-
32-
attributeEBS = "ci_ebs"
33-
ebsMetricPrefix = "node_diskio_ebs"
31+
attributeEBS = "ci_ebs"
32+
attributeLocalInstanceStore = "ci_lis"
3433
)
3534

35+
// Map of NVMe feature attributes to their corresponding metric prefixes
36+
var featureMetricPrefixes = map[string]string{
37+
attributeEBS: "node_diskio_ebs",
38+
attributeLocalInstanceStore: "node_diskio_instance_store",
39+
}
40+
3641
type UserAgent struct {
3742
mu sync.RWMutex
3843
prebuiltStr string
@@ -95,8 +100,15 @@ func (ua *UserAgent) Process(labels map[string]string) {
95100

96101
// ProcessMetrics checks metric names for specific patterns and updates user agent accordingly
97102
func (ua *UserAgent) ProcessMetrics(metrics pmetric.Metrics) {
98-
// Check if we've already detected NVME
99-
if _, exists := ua.featureList[attributeEBS]; exists {
103+
// Check if all NVME features are already detected
104+
allFeaturesFound := true
105+
for feature := range featureMetricPrefixes {
106+
if _, exists := ua.featureList[feature]; !exists {
107+
allFeaturesFound = false
108+
break
109+
}
110+
}
111+
if allFeaturesFound {
100112
return
101113
}
102114

@@ -107,14 +119,17 @@ func (ua *UserAgent) ProcessMetrics(metrics pmetric.Metrics) {
107119
ms := ilms.At(j).Metrics()
108120
for k := 0; k < ms.Len(); k++ {
109121
metric := ms.At(k)
110-
if strings.HasPrefix(metric.Name(), ebsMetricPrefix) {
111-
ua.featureList[attributeEBS] = struct{}{}
112-
ua.build()
113-
return
122+
for feature, prefix := range featureMetricPrefixes {
123+
if strings.HasPrefix(metric.Name(), prefix) {
124+
if _, exists := ua.featureList[feature]; !exists {
125+
ua.featureList[feature] = struct{}{}
126+
}
127+
}
114128
}
115129
}
116130
}
117131
}
132+
ua.build()
118133
}
119134

120135
// build the user agent string from the items in the cache. Format is telemetry-sdk (<lang1>/<ver1>;<lang2>/<ver2>).

exporter/awsemfexporter/internal/useragent/useragent_test.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ func TestUserAgent(t *testing.T) {
7575
metrics: []string{"node_diskio_ebs_something"},
7676
want: "feature:(ci_ebs)",
7777
},
78+
"WithLocalInstanceStoreMetrics": {
79+
metrics: []string{"node_diskio_instance_store_something"},
80+
want: "feature:(ci_lis)",
81+
},
7882
"WithBothTelemetryAndEBS": {
7983
labelSets: []map[string]string{
8084
{
@@ -85,14 +89,32 @@ func TestUserAgent(t *testing.T) {
8589
metrics: []string{"node_diskio_ebs_something"},
8690
want: "telemetry-sdk (test/1.0) feature:(ci_ebs)",
8791
},
92+
"WithBothTelemetryAndLocalInstanceStore": {
93+
labelSets: []map[string]string{
94+
{
95+
semconv.AttributeTelemetrySDKLanguage: "test",
96+
attributeTelemetryDistroVersion: "1.0",
97+
},
98+
},
99+
metrics: []string{"node_diskio_instance_store_something"},
100+
want: "telemetry-sdk (test/1.0) feature:(ci_lis)",
101+
},
88102
"WithNonEBSMetrics": {
89103
metrics: []string{"some_other_metric"},
90104
want: "",
91105
},
92-
"WithMultipleFeatures": {
106+
"WithMultipleEBSMetrics": {
93107
metrics: []string{"node_diskio_ebs_something", "node_diskio_ebs_something_else"},
94108
want: "feature:(ci_ebs)",
95109
},
110+
"WithMultipleLocalInstanceStoreMetrics": {
111+
metrics: []string{"node_diskio_instance_store_something", "node_diskio_instance_store_something_else"},
112+
want: "feature:(ci_lis)",
113+
},
114+
"WithMixedEBSAndInstanceStoreMetrics": {
115+
metrics: []string{"node_diskio_ebs_something", "node_diskio_ebs_something", "node_diskio_instance_store_something", "node_diskio_instance_store_something"},
116+
want: "feature:(ci_ebs ci_lis)", // Both features should be detected and sorted alphabetically
117+
},
96118
}
97119
for name, testCase := range testCases {
98120
t.Run(name, func(t *testing.T) {

0 commit comments

Comments
 (0)