49 lines
1.4 KiB
Go
49 lines
1.4 KiB
Go
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)
|
|
}
|