package tracing import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/trace" ) // tracerName is the instrumentation scope for every span this module emits. const tracerName = "gitea.home.hrajfrisbee.cz/kacerr/egress-proxies-operator" type options struct { tp trace.TracerProvider } // Option configures the tracing decorators. The zero configuration uses the // global TracerProvider installed by Setup; tests inject their own recorder // via WithTracerProvider so they can run in parallel without touching // process-global state. type Option func(*options) // WithTracerProvider overrides the global TracerProvider. func WithTracerProvider(tp trace.TracerProvider) Option { return func(o *options) { o.tp = tp } } func newOptions(opts []Option) options { var o options for _, opt := range opts { opt(&o) } return o } // Tracer resolves a tracer from the given options, for decorators outside // this package (provider.WithTracing). func Tracer(opts ...Option) trace.Tracer { return newOptions(opts).tracer() } // tracer resolves the configured tracer. The global path goes through // otel.Tracer, which delegates to whatever provider Setup installs later — // construction order between decorators and Setup does not matter. func (o options) tracer() trace.Tracer { if o.tp != nil { return o.tp.Tracer(tracerName) } return otel.Tracer(tracerName) }