diff --git a/extra/bunotel/option.go b/extra/bunotel/option.go index 4c9c90a30..4824f3863 100644 --- a/extra/bunotel/option.go +++ b/extra/bunotel/option.go @@ -1,6 +1,7 @@ package bunotel import ( + "github.com/uptrace/bun" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" semconv "go.opentelemetry.io/otel/semconv/v1.12.0" @@ -33,6 +34,14 @@ func WithFormattedQueries(format bool) Option { } } +// WithSpanNameFormatter takes a function that determines the span name +// for a given query event. +func WithSpanNameFormatter(f func(*bun.QueryEvent) string) Option { + return func(h *QueryHook) { + h.spanNameFormatter = f + } +} + // WithTracerProvider returns an Option to use the TracerProvider when // creating a Tracer. func WithTracerProvider(tp trace.TracerProvider) Option { diff --git a/extra/bunotel/otel.go b/extra/bunotel/otel.go index 66b88e989..4fc35bd09 100644 --- a/extra/bunotel/otel.go +++ b/extra/bunotel/otel.go @@ -22,11 +22,12 @@ import ( ) type QueryHook struct { - attrs []attribute.KeyValue - formatQueries bool - tracer trace.Tracer - meter metric.Meter - queryHistogram metric.Int64Histogram + attrs []attribute.KeyValue + formatQueries bool + tracer trace.Tracer + meter metric.Meter + queryHistogram metric.Int64Histogram + spanNameFormatter func(*bun.QueryEvent) string } var _ bun.QueryHook = (*QueryHook)(nil) @@ -86,7 +87,11 @@ func (h *QueryHook) AfterQuery(ctx context.Context, event *bun.QueryEvent) { return } - span.SetName(operation) + name := operation + if h.spanNameFormatter != nil { + name = h.spanNameFormatter(event) + } + span.SetName(name) defer span.End() query := h.eventQuery(event)