@@ -6,13 +6,17 @@ import (
66 "time"
77
88 "github.com/prometheus/prometheus/model/labels"
9- "github.com/stretchr/testify/assert "
9+ "github.com/stretchr/testify/require "
1010)
1111
12+ func newTestDrainSanitizer (mode string ) * DrainSanitizer {
13+ return NewDrainSanitizer ("test-tenant" , func (string ) string { return mode }, 15 * time .Minute )
14+ }
15+
1216func TestDrainSanitizer_PatternDetection (t * testing.T ) {
1317 t .Parallel ()
1418
15- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
19+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
1620
1721 // Train with similar span names that should form a pattern
1822 lbls1 := labels .FromStrings ("span_name" , "GET /api/users/123" , "service" , "api" )
@@ -21,25 +25,25 @@ func TestDrainSanitizer_PatternDetection(t *testing.T) {
2125
2226 // First call should return original (no pattern yet)
2327 result1 := sanitizer .Sanitize (lbls1 )
24- assert .Equal (t , "GET /api/users/123" , result1 .Get ("span_name" ))
28+ require .Equal (t , "GET /api/users/123" , result1 .Get ("span_name" ))
2529
2630 // After training, subsequent similar spans should be sanitized
2731 result2 := sanitizer .Sanitize (lbls2 )
2832 result3 := sanitizer .Sanitize (lbls3 )
2933
3034 // All should have the same sanitized span_name pattern
31- assert .Equal (t , result2 .Get ("span_name" ), result3 .Get ("span_name" ))
35+ require .Equal (t , result2 .Get ("span_name" ), result3 .Get ("span_name" ))
3236 // Pattern should contain the parameter marker
33- assert .Contains (t , result2 .Get ("span_name" ), "<_>" )
37+ require .Contains (t , result2 .Get ("span_name" ), "<_>" )
3438 // Original labels should be preserved
35- assert .Equal (t , "api" , result2 .Get ("service" ))
36- assert .Equal (t , "api" , result3 .Get ("service" ))
39+ require .Equal (t , "api" , result2 .Get ("service" ))
40+ require .Equal (t , "api" , result3 .Get ("service" ))
3741}
3842
3943func TestDrainSanitizer_DryRunMode (t * testing.T ) {
4044 t .Parallel ()
4145
42- sanitizer := NewDrainSanitizer ( "test-tenant" , true , 15 * time . Minute ) // dryRun = true
46+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationDryRun )
4347
4448 lbls1 := labels .FromStrings ("span_name" , "GET /api/users/123" , "service" , "api" )
4549 lbls2 := labels .FromStrings ("span_name" , "GET /api/users/456" , "service" , "api" )
@@ -49,29 +53,75 @@ func TestDrainSanitizer_DryRunMode(t *testing.T) {
4953
5054 // In dry-run mode, even if pattern is detected, return original labels
5155 result := sanitizer .Sanitize (lbls2 )
52- assert .Equal (t , "GET /api/users/456" , result .Get ("span_name" ))
53- assert .Equal (t , lbls2 , result )
56+ require .Equal (t , "GET /api/users/456" , result .Get ("span_name" ))
57+ require .Equal (t , lbls2 , result )
58+ }
59+
60+ func TestDrainSanitizer_RuntimeModeToggle (t * testing.T ) {
61+ t .Parallel ()
62+
63+ mode := SpanNameSanitizationEnabled
64+ sanitizer := NewDrainSanitizer ("test-tenant" , func (string ) string { return mode }, 15 * time .Minute )
65+
66+ // Train the drain tree with similar span names to establish a pattern
67+ sanitizer .Sanitize (labels .FromStrings ("span_name" , "GET /api/users/123" ))
68+ sanitizer .Sanitize (labels .FromStrings ("span_name" , "GET /api/users/456" ))
69+
70+ // With enabled mode, should sanitize
71+ result := sanitizer .Sanitize (labels .FromStrings ("span_name" , "GET /api/users/789" ))
72+ require .Contains (t , result .Get ("span_name" ), "<_>" )
73+
74+ // Toggle to disabled at runtime - should pass through
75+ mode = SpanNameSanitizationDisabled
76+ result = sanitizer .Sanitize (labels .FromStrings ("span_name" , "GET /api/users/999" ))
77+ require .Equal (t , "GET /api/users/999" , result .Get ("span_name" ))
78+
79+ // Toggle to dry-run at runtime - should pass through but still train
80+ mode = SpanNameSanitizationDryRun
81+ result = sanitizer .Sanitize (labels .FromStrings ("span_name" , "GET /api/users/111" ))
82+ require .Equal (t , "GET /api/users/111" , result .Get ("span_name" ))
83+
84+ // Toggle back to enabled - should sanitize again
85+ mode = SpanNameSanitizationEnabled
86+ result = sanitizer .Sanitize (labels .FromStrings ("span_name" , "GET /api/users/222" ))
87+ require .Contains (t , result .Get ("span_name" ), "<_>" )
88+ }
89+
90+ func TestDrainSanitizer_DisabledMode (t * testing.T ) {
91+ t .Parallel ()
92+
93+ sanitizer := newTestDrainSanitizer (SpanNameSanitizationDisabled )
94+
95+ lbls1 := labels .FromStrings ("span_name" , "GET /api/users/123" , "service" , "api" )
96+ lbls2 := labels .FromStrings ("span_name" , "GET /api/users/456" , "service" , "api" )
97+
98+ sanitizer .Sanitize (lbls1 )
99+
100+ // When disabled, should always return original labels
101+ result := sanitizer .Sanitize (lbls2 )
102+ require .Equal (t , "GET /api/users/456" , result .Get ("span_name" ))
103+ require .Equal (t , lbls2 , result )
54104}
55105
56106func TestDrainSanitizer_NilClusterHandling (t * testing.T ) {
57107 t .Parallel ()
58108
59- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
109+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
60110
61111 // Span name with too few tokens (less than MinTokens=3)
62112 // Tokenizer will produce tokens like ["a", "<END>"] which is < 3
63113 lbls := labels .FromStrings ("span_name" , "a" , "service" , "api" )
64114 result := sanitizer .Sanitize (lbls )
65115
66116 // Should return original labels when cluster is nil
67- assert .Equal (t , "a" , result .Get ("span_name" ))
68- assert .Equal (t , lbls , result )
117+ require .Equal (t , "a" , result .Get ("span_name" ))
118+ require .Equal (t , lbls , result )
69119}
70120
71121func TestDrainSanitizer_ConcurrentAccess (t * testing.T ) {
72122 t .Parallel ()
73123
74- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
124+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
75125
76126 var wg sync.WaitGroup
77127 numGoroutines := 10
@@ -85,8 +135,8 @@ func TestDrainSanitizer_ConcurrentAccess(t *testing.T) {
85135 lbls := labels .FromStrings ("span_name" , "GET /api/users/123" , "id" , string (rune (id * 1000 + j )))
86136 result := sanitizer .Sanitize (lbls )
87137 // Should always return valid labels
88- assert .NotNil (t , result )
89- assert .NotEmpty (t , result .Get ("span_name" ))
138+ require .NotNil (t , result )
139+ require .NotEmpty (t , result .Get ("span_name" ))
90140 }
91141 }(i )
92142 }
@@ -98,7 +148,7 @@ func TestDrainSanitizer_ConcurrentAccess(t *testing.T) {
98148func TestDrainSanitizer_DemandTracking (t * testing.T ) {
99149 t .Parallel ()
100150
101- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
151+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
102152
103153 // Create labels with different span names
104154 lbls1 := labels .FromStrings ("span_name" , "GET /api/users/123" )
@@ -114,42 +164,42 @@ func TestDrainSanitizer_DemandTracking(t *testing.T) {
114164 // but we can verify the sanitizer doesn't crash and processes all labels)
115165 // The demand gauge will be updated periodically via doPeriodicMaintenance
116166 demandEstimate := sanitizer .demand .Estimate ()
117- assert .GreaterOrEqual (t , demandEstimate , uint64 (1 ))
167+ require .GreaterOrEqual (t , demandEstimate , uint64 (1 ))
118168}
119169
120170func TestDrainSanitizer_NoSpanNameLabel (t * testing.T ) {
121171 t .Parallel ()
122172
123- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
173+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
124174
125175 // Labels without span_name
126176 lbls := labels .FromStrings ("service" , "api" , "method" , "GET" )
127177 result := sanitizer .Sanitize (lbls )
128178
129179 // Should return original labels (span_name is empty string, which drain will reject)
130- assert .Equal (t , lbls , result )
180+ require .Equal (t , lbls , result )
131181}
132182
133183func TestDrainSanitizer_PatternBeforeSanitization (t * testing.T ) {
134184 t .Parallel ()
135185
136- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
186+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
137187
138188 // First span name - no pattern yet, so returns original
139189 lbls1 := labels .FromStrings ("span_name" , "GET /api/users/123" )
140190 result1 := sanitizer .Sanitize (lbls1 )
141- assert .Equal (t , "GET /api/users/123" , result1 .Get ("span_name" ))
191+ require .Equal (t , "GET /api/users/123" , result1 .Get ("span_name" ))
142192
143193 // Same span name again - still no pattern (only one instance)
144194 result2 := sanitizer .Sanitize (lbls1 )
145- assert .Equal (t , "GET /api/users/123" , result2 .Get ("span_name" ))
195+ require .Equal (t , "GET /api/users/123" , result2 .Get ("span_name" ))
146196
147197 // Different but similar span name - now pattern should emerge
148198 lbls2 := labels .FromStrings ("span_name" , "GET /api/users/456" )
149199 result3 := sanitizer .Sanitize (lbls2 )
150200 // After pattern detection, should return sanitized version
151- assert .NotEqual (t , "GET /api/users/456" , result3 .Get ("span_name" ))
152- assert .Contains (t , result3 .Get ("span_name" ), "<_>" )
201+ require .NotEqual (t , "GET /api/users/456" , result3 .Get ("span_name" ))
202+ require .Contains (t , result3 .Get ("span_name" ), "<_>" )
153203}
154204
155205func TestDrainSanitizer_FullSanitizedOutput (t * testing.T ) {
@@ -185,7 +235,7 @@ func TestDrainSanitizer_FullSanitizedOutput(t *testing.T) {
185235 for _ , tc := range testCases {
186236 t .Run (tc .name , func (t * testing.T ) {
187237 t .Parallel ()
188- sanitizer := NewDrainSanitizer ( "test-tenant" , false , 15 * time . Minute )
238+ sanitizer := newTestDrainSanitizer ( SpanNameSanitizationEnabled )
189239
190240 // Train with first inputs
191241 for _ , input := range tc .inputs [:len (tc .inputs )- 1 ] {
@@ -195,7 +245,7 @@ func TestDrainSanitizer_FullSanitizedOutput(t *testing.T) {
195245 // Last input should produce the expected sanitized output
196246 lastInput := tc .inputs [len (tc .inputs )- 1 ]
197247 result := sanitizer .Sanitize (labels .FromStrings ("span_name" , lastInput ))
198- assert .Equal (t , tc .expectedOutput , result .Get ("span_name" ))
248+ require .Equal (t , tc .expectedOutput , result .Get ("span_name" ))
199249 })
200250 }
201251}
0 commit comments