@@ -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