Skip to content

Commit 41152b1

Browse files
authored
fix: Include tags header in relayUsage metadata (#618)
1 parent 1581de9 commit 41152b1

4 files changed

Lines changed: 67 additions & 10 deletions

File tree

internal/metrics/metrics.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,21 +110,21 @@ func NewManager(
110110
return m, nil
111111
}
112112

113-
func (m *Manager) UsageActivityCountMessage(envName, userAgent, platformCategory, instanceID string) {
113+
func (m *Manager) UsageActivityCountMessage(envName, userAgent, platformCategory, instanceID, tagsHeader string) {
114114
m.usageChan <- &usageActivityMessage{
115-
kind: UsageActivityKindCount, envName: envName, userAgent: userAgent, platformCategory: platformCategory, instanceID: instanceID,
115+
kind: UsageActivityKindCount, envName: envName, userAgent: userAgent, platformCategory: platformCategory, instanceID: instanceID, tagsHeader: tagsHeader,
116116
}
117117
}
118118

119-
func (m *Manager) UsageActivityStreamConnected(envName, userAgent, platformCategory, instanceID string) {
119+
func (m *Manager) UsageActivityStreamConnected(envName, userAgent, platformCategory, instanceID, tagsHeader string) {
120120
m.usageChan <- &usageActivityMessage{
121-
kind: UsageActivityKindStreamConnected, envName: envName, userAgent: userAgent, platformCategory: platformCategory, instanceID: instanceID,
121+
kind: UsageActivityKindStreamConnected, envName: envName, userAgent: userAgent, platformCategory: platformCategory, instanceID: instanceID, tagsHeader: tagsHeader,
122122
}
123123
}
124124

125-
func (m *Manager) UsageActivityStreamDisconnected(envName, userAgent, platformCategory, instanceID string) {
125+
func (m *Manager) UsageActivityStreamDisconnected(envName, userAgent, platformCategory, instanceID, tagsHeader string) {
126126
m.usageChan <- &usageActivityMessage{
127-
kind: UsageActivityKindStreamDisconnected, envName: envName, userAgent: userAgent, platformCategory: platformCategory, instanceID: instanceID,
127+
kind: UsageActivityKindStreamDisconnected, envName: envName, userAgent: userAgent, platformCategory: platformCategory, instanceID: instanceID, tagsHeader: tagsHeader,
128128
}
129129
}
130130

internal/metrics/usage.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type relayUsageEvent struct {
1818
UserAgent string `json:"userAgent"`
1919
PlatformCategory string `json:"platformCategory"`
2020
InstanceID string `json:"instanceId,omitempty"`
21+
TagsHeader string `json:"tagsHeader,omitempty"`
2122

2223
FirstActive ldtime.UnixMillisecondTime `json:"firstActive"`
2324
LastActive ldtime.UnixMillisecondTime `json:"lastActive"`
@@ -28,6 +29,7 @@ type usageKeyType struct {
2829
userAgent string
2930
platformCategory string
3031
instanceID string
32+
tagsHeader string
3133
}
3234

3335
type UsageActivityKind string
@@ -45,6 +47,7 @@ type usageActivityMessage struct {
4547
userAgent string
4648
platformCategory string
4749
instanceID string
50+
tagsHeader string
4851
}
4952

5053
type usageActivityFlush struct{}
@@ -178,7 +181,7 @@ func (e *environmentMetricUsage) run() {
178181
case *usageActivityFlush:
179182
e.flushInternal()
180183
case *usageActivityMessage:
181-
key := usageKeyType{userAgent: u.userAgent, platformCategory: u.platformCategory, instanceID: u.instanceID}
184+
key := usageKeyType{userAgent: u.userAgent, platformCategory: u.platformCategory, instanceID: u.instanceID, tagsHeader: u.tagsHeader}
182185
if e.publisher == nil {
183186
continue
184187
}
@@ -270,6 +273,7 @@ func (e *environmentMetricUsage) flushInternal() {
270273
UserAgent: key.userAgent,
271274
PlatformCategory: key.platformCategory,
272275
InstanceID: key.instanceID,
276+
TagsHeader: key.tagsHeader,
273277
FirstActive: ldtime.UnixMillisFromTime(usage.firstActive),
274278
LastActive: ldtime.UnixMillisFromTime(lastActive),
275279
TotalStreamMs: (elapsedStreaming + usage.streamingDurationAdjustment).Milliseconds(),

internal/metrics/usage_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,53 @@ func TestMultipleUserStreams(t *testing.T) {
390390
assert.Equal(t, "instanceID2", event2.InstanceID)
391391
assert.InDeltaf(t, 300, event2.TotalStreamMs, 50, "stream time should be approximately 300ms")
392392
}
393+
394+
func TestTagsHeaderIsIncludedInUsageEvent(t *testing.T) {
395+
publisher := newTestEventsPublisher()
396+
env := NewEnvironmentMetricUsage("relayID", publisher, 1*time.Hour)
397+
env.usageActivityMessage(&usageActivityMessage{
398+
kind: UsageActivityKindCount,
399+
userAgent: "userAgent",
400+
platformCategory: "platform",
401+
instanceID: "instanceID",
402+
tagsHeader: "application-id/my-app application-version/1.0",
403+
})
404+
env.close()
405+
406+
event := publisher.expectUsageEvent(t, time.Second)
407+
assert.Equal(t, "userAgent", event.UserAgent)
408+
assert.Equal(t, "platform", event.PlatformCategory)
409+
assert.Equal(t, "instanceID", event.InstanceID)
410+
assert.Equal(t, "application-id/my-app application-version/1.0", event.TagsHeader)
411+
}
412+
413+
func TestDifferentTagsHeadersProduceSeparateEvents(t *testing.T) {
414+
publisher := newTestEventsPublisher()
415+
env := NewEnvironmentMetricUsage("relayID", publisher, 1*time.Hour)
416+
417+
env.usageActivityMessage(&usageActivityMessage{
418+
kind: UsageActivityKindCount,
419+
userAgent: "userAgent",
420+
platformCategory: "platform",
421+
instanceID: "instanceID",
422+
tagsHeader: "application-id/app1",
423+
})
424+
env.usageActivityMessage(&usageActivityMessage{
425+
kind: UsageActivityKindCount,
426+
userAgent: "userAgent",
427+
platformCategory: "platform",
428+
instanceID: "instanceID",
429+
tagsHeader: "application-id/app2",
430+
})
431+
432+
env.flush()
433+
434+
firstEvent := publisher.expectUsageEvent(t, time.Second)
435+
secondEvent := publisher.expectUsageEvent(t, time.Second)
436+
if firstEvent.TagsHeader != "application-id/app1" {
437+
firstEvent, secondEvent = secondEvent, firstEvent
438+
}
439+
440+
assert.Equal(t, "application-id/app1", firstEvent.TagsHeader)
441+
assert.Equal(t, "application-id/app2", secondEvent.TagsHeader)
442+
}

internal/middleware/usage_middleware.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"net/http"
55

66
"github.com/gorilla/mux"
7+
"github.com/launchdarkly/ld-relay/v8/internal/events"
78
)
89

910
func UsageActivityCount(platformCategory string) mux.MiddlewareFunc {
@@ -12,9 +13,10 @@ func UsageActivityCount(platformCategory string) mux.MiddlewareFunc {
1213
ctx := GetEnvContextInfo(req.Context())
1314
userAgent := getUserAgent(req)
1415
instanceID := getInstanceID(req)
16+
tagsHeader := req.Header.Get(events.TagsHeader)
1517
mu := ctx.Env.GetMetricsManager()
1618

17-
mu.UsageActivityCountMessage(ctx.Env.GetIdentifiers().GetDisplayName(), userAgent, platformCategory, instanceID)
19+
mu.UsageActivityCountMessage(ctx.Env.GetIdentifiers().GetDisplayName(), userAgent, platformCategory, instanceID, tagsHeader)
1820

1921
next.ServeHTTP(w, req)
2022
})
@@ -26,14 +28,15 @@ func UsageActivityStreamMonitoring(platformCategory string, next http.Handler) h
2628
ctx := GetEnvContextInfo(req.Context())
2729
userAgent := getUserAgent(req)
2830
instanceID := getInstanceID(req)
31+
tagsHeader := req.Header.Get(events.TagsHeader)
2932

3033
if mu := ctx.Env.GetMetricsManager(); mu != nil {
31-
mu.UsageActivityStreamConnected(ctx.Env.GetIdentifiers().GetDisplayName(), userAgent, platformCategory, instanceID)
34+
mu.UsageActivityStreamConnected(ctx.Env.GetIdentifiers().GetDisplayName(), userAgent, platformCategory, instanceID, tagsHeader)
3235
}
3336

3437
defer func() {
3538
if mu := ctx.Env.GetMetricsManager(); mu != nil {
36-
mu.UsageActivityStreamDisconnected(ctx.Env.GetIdentifiers().GetDisplayName(), userAgent, platformCategory, instanceID)
39+
mu.UsageActivityStreamDisconnected(ctx.Env.GetIdentifiers().GetDisplayName(), userAgent, platformCategory, instanceID, tagsHeader)
3740
}
3841
}()
3942

0 commit comments

Comments
 (0)