@@ -95,6 +95,138 @@ func TestWithoutCaller(t *testing.T) {
9595	}
9696}
9797
98+ func  TestWithCommandFilter (t  * testing.T ) {
99+ 
100+ 	t .Run ("filter out ping command" , func (t  * testing.T ) {
101+ 		provider  :=  sdktrace .NewTracerProvider ()
102+ 		hook  :=  newTracingHook (
103+ 			"" ,
104+ 			WithTracerProvider (provider ),
105+ 			WithCommandFilter (func (cmd  redis.Cmder ) bool  {
106+ 				return  cmd .Name () ==  "ping" 
107+ 			}),
108+ 		)
109+ 		ctx , span  :=  provider .Tracer ("redis-test" ).Start (context .TODO (), "redis-test" )
110+ 		cmd  :=  redis .NewCmd (ctx , "ping" )
111+ 		defer  span .End ()
112+ 
113+ 		processHook  :=  hook .ProcessHook (func (ctx  context.Context , cmd  redis.Cmder ) error  {
114+ 			innerSpan  :=  trace .SpanFromContext (ctx ).(sdktrace.ReadOnlySpan )
115+ 			if  innerSpan .Name () !=  "redis-test"  ||  innerSpan .Name () ==  "ping"  {
116+ 				t .Fatalf ("ping command should not be traced" )
117+ 			}
118+ 
119+ 			return  nil 
120+ 		})
121+ 		err  :=  processHook (ctx , cmd )
122+ 		if  err  !=  nil  {
123+ 			t .Fatal (err )
124+ 		}
125+ 	})
126+ 
127+ 	t .Run ("do not filter ping command" , func (t  * testing.T ) {
128+ 		provider  :=  sdktrace .NewTracerProvider ()
129+ 		hook  :=  newTracingHook (
130+ 			"" ,
131+ 			WithTracerProvider (provider ),
132+ 			WithCommandFilter (func (cmd  redis.Cmder ) bool  {
133+ 				return  false  // never filter 
134+ 			}),
135+ 		)
136+ 		ctx , span  :=  provider .Tracer ("redis-test" ).Start (context .TODO (), "redis-test" )
137+ 		cmd  :=  redis .NewCmd (ctx , "ping" )
138+ 		defer  span .End ()
139+ 
140+ 		processHook  :=  hook .ProcessHook (func (ctx  context.Context , cmd  redis.Cmder ) error  {
141+ 			innerSpan  :=  trace .SpanFromContext (ctx ).(sdktrace.ReadOnlySpan )
142+ 			if  innerSpan .Name () !=  "ping"  {
143+ 				t .Fatalf ("ping command should be traced" )
144+ 			}
145+ 
146+ 			return  nil 
147+ 		})
148+ 		err  :=  processHook (ctx , cmd )
149+ 		if  err  !=  nil  {
150+ 			t .Fatal (err )
151+ 		}
152+ 	})
153+ 
154+ 	t .Run ("auth command filtered with basic command filter" , func (t  * testing.T ) {
155+ 		provider  :=  sdktrace .NewTracerProvider ()
156+ 		hook  :=  newTracingHook (
157+ 			"" ,
158+ 			WithTracerProvider (provider ),
159+ 			WithCommandFilter (BasicCommandFilter ),
160+ 		)
161+ 		ctx , span  :=  provider .Tracer ("redis-test" ).Start (context .TODO (), "redis-test" )
162+ 		cmd  :=  redis .NewCmd (ctx , "auth" , "test-password" )
163+ 		defer  span .End ()
164+ 
165+ 		processHook  :=  hook .ProcessHook (func (ctx  context.Context , cmd  redis.Cmder ) error  {
166+ 			innerSpan  :=  trace .SpanFromContext (ctx ).(sdktrace.ReadOnlySpan )
167+ 			if  innerSpan .Name () !=  "redis-test"  ||  innerSpan .Name () ==  "auth"  {
168+ 				t .Fatalf ("auth command should not be traced by default" )
169+ 			}
170+ 
171+ 			return  nil 
172+ 		})
173+ 		err  :=  processHook (ctx , cmd )
174+ 		if  err  !=  nil  {
175+ 			t .Fatal (err )
176+ 		}
177+ 	})
178+ 
179+ 	t .Run ("hello command filtered with basic command filter when sensitive" , func (t  * testing.T ) {
180+ 		provider  :=  sdktrace .NewTracerProvider ()
181+ 		hook  :=  newTracingHook (
182+ 			"" ,
183+ 			WithTracerProvider (provider ),
184+ 			WithCommandFilter (BasicCommandFilter ),
185+ 		)
186+ 		ctx , span  :=  provider .Tracer ("redis-test" ).Start (context .TODO (), "redis-test" )
187+ 		cmd  :=  redis .NewCmd (ctx , "hello" , 3 , "AUTH" , "test-user" , "test-password" )
188+ 		defer  span .End ()
189+ 
190+ 		processHook  :=  hook .ProcessHook (func (ctx  context.Context , cmd  redis.Cmder ) error  {
191+ 			innerSpan  :=  trace .SpanFromContext (ctx ).(sdktrace.ReadOnlySpan )
192+ 			if  innerSpan .Name () !=  "redis-test"  ||  innerSpan .Name () ==  "hello"  {
193+ 				t .Fatalf ("auth command should not be traced by default" )
194+ 			}
195+ 
196+ 			return  nil 
197+ 		})
198+ 		err  :=  processHook (ctx , cmd )
199+ 		if  err  !=  nil  {
200+ 			t .Fatal (err )
201+ 		}
202+ 	})
203+ 
204+ 	t .Run ("hello command not filtered with basic command filter when not sensitive" , func (t  * testing.T ) {
205+ 		provider  :=  sdktrace .NewTracerProvider ()
206+ 		hook  :=  newTracingHook (
207+ 			"" ,
208+ 			WithTracerProvider (provider ),
209+ 			WithCommandFilter (BasicCommandFilter ),
210+ 		)
211+ 		ctx , span  :=  provider .Tracer ("redis-test" ).Start (context .TODO (), "redis-test" )
212+ 		cmd  :=  redis .NewCmd (ctx , "hello" , 3 )
213+ 		defer  span .End ()
214+ 
215+ 		processHook  :=  hook .ProcessHook (func (ctx  context.Context , cmd  redis.Cmder ) error  {
216+ 			innerSpan  :=  trace .SpanFromContext (ctx ).(sdktrace.ReadOnlySpan )
217+ 			if  innerSpan .Name () !=  "hello"  {
218+ 				t .Fatalf ("hello command should be traced" )
219+ 			}
220+ 
221+ 			return  nil 
222+ 		})
223+ 		err  :=  processHook (ctx , cmd )
224+ 		if  err  !=  nil  {
225+ 			t .Fatal (err )
226+ 		}
227+ 	})
228+ }
229+ 
98230func  TestTracingHook_DialHook (t  * testing.T ) {
99231	imsb  :=  tracetest .NewInMemoryExporter ()
100232	provider  :=  sdktrace .NewTracerProvider (sdktrace .WithSyncer (imsb ))
0 commit comments