diff --git a/extra/redisotel/config.go b/extra/redisotel/config.go index 5b558aa2..72f9fc9a 100644 --- a/extra/redisotel/config.go +++ b/extra/redisotel/config.go @@ -12,8 +12,9 @@ import ( type config struct { // Common options. - dbSystem string - attrs []attribute.KeyValue + dbSystem string + attrs []attribute.KeyValue + spanNameFn func(hook TracingHook, defaultName string) string // Tracing options. @@ -82,7 +83,7 @@ func WithAttributes(attrs ...attribute.KeyValue) Option { }) } -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ type TracingOption interface { baseOption @@ -114,7 +115,22 @@ func WithDBStatement(on bool) TracingOption { }) } -//------------------------------------------------------------------------------ +type TracingHook int + +const ( + TracingHookDial TracingHook = iota + TracingHookProcess + TracingHookProcessPipeline +) + +// WithSpanName provides a function to customize the span names. +func WithSpanName(f func(hook TracingHook, defaultName string) string) TracingOption { + return tracingOption(func(conf *config) { + conf.spanNameFn = f + }) +} + +// ------------------------------------------------------------------------------ type MetricsOption interface { baseOption diff --git a/extra/redisotel/tracing.go b/extra/redisotel/tracing.go index 0bbf692a..3cdf0586 100644 --- a/extra/redisotel/tracing.go +++ b/extra/redisotel/tracing.go @@ -91,7 +91,12 @@ func (th *tracingHook) DialHook(hook redis.DialHook) redis.DialHook { return hook(ctx, network, addr) } - ctx, span := th.conf.tracer.Start(ctx, "redis.dial", th.spanOpts...) + spanName := "redis.dial" + if th.conf.spanNameFn != nil { + spanName = th.conf.spanNameFn(TracingHookDial, spanName) + } + + ctx, span := th.conf.tracer.Start(ctx, spanName, th.spanOpts...) defer span.End() conn, err := hook(ctx, network, addr) @@ -126,7 +131,12 @@ func (th *tracingHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook { opts := th.spanOpts opts = append(opts, trace.WithAttributes(attrs...)) - ctx, span := th.conf.tracer.Start(ctx, cmd.FullName(), opts...) + spanName := cmd.FullName() + if th.conf.spanNameFn != nil { + spanName = th.conf.spanNameFn(TracingHookProcess, spanName) + } + + ctx, span := th.conf.tracer.Start(ctx, spanName, opts...) defer span.End() if err := hook(ctx, cmd); err != nil { @@ -163,7 +173,12 @@ func (th *tracingHook) ProcessPipelineHook( opts := th.spanOpts opts = append(opts, trace.WithAttributes(attrs...)) - ctx, span := th.conf.tracer.Start(ctx, "redis.pipeline "+summary, opts...) + spanName := "redis.pipeline " + summary + if th.conf.spanNameFn != nil { + spanName = th.conf.spanNameFn(TracingHookProcessPipeline, spanName) + } + + ctx, span := th.conf.tracer.Start(ctx, spanName, opts...) defer span.End() if err := hook(ctx, cmds); err != nil {