@@ -14,8 +14,14 @@ import (
1414 "go.opentelemetry.io/otel/propagation"
1515 "go.opentelemetry.io/otel/sdk/resource"
1616 "go.opentelemetry.io/otel/sdk/trace"
17+ oteltrace "go.opentelemetry.io/otel/trace"
1718 semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
18- "go.opentelemetry.io/otel/trace/noop"
19+ )
20+
21+ const (
22+ defaultServiceName = "spegel"
23+ defaultSampler = "parentbased_always_off"
24+ defaultEndpoint = "localhost:4318"
1925)
2026
2127// Shutdown is a function type for shutting down the OTEL SDK.
@@ -33,20 +39,24 @@ type Config struct {
3339func Setup (ctx context.Context , cfg Config ) (Shutdown , error ) {
3440 log := logr .FromContextOrDiscard (ctx )
3541
36- if _ , ok := otel .GetTracerProvider ().(noop.TracerProvider ); ! ok {
42+ explicitConfig := isExplicitConfig (cfg )
43+ if ! explicitConfig && ! isNoopTracerProvider (otel .GetTracerProvider ()) {
3744 log .Info ("skipping OTEL setup; tracer provider already configured" )
3845 return nil , nil
3946 }
47+ if explicitConfig && ! isNoopTracerProvider (otel .GetTracerProvider ()) {
48+ log .Info ("overriding existing OTEL tracer provider due to explicit config" )
49+ }
4050
4151 // Use cfg if provided, otherwise fall back to environment
4252 if cfg .Endpoint == "" {
43- cfg .Endpoint = getEnv ("OTEL_EXPORTER_OTLP_ENDPOINT" , "http://localhost:4318" )
53+ cfg .Endpoint = getEnv ("OTEL_EXPORTER_OTLP_ENDPOINT" , defaultEndpoint )
4454 }
4555 if cfg .ServiceName == "" {
46- cfg .ServiceName = "spegel"
56+ cfg .ServiceName = getEnv ( "OTEL_SERVICE_NAME" , defaultServiceName )
4757 }
4858 if cfg .Sampler == "" {
49- cfg .Sampler = getEnv ("OTEL_TRACES_SAMPLER" , "parentbased_always_off" )
59+ cfg .Sampler = getEnv ("OTEL_TRACES_SAMPLER" , defaultSampler )
5060 }
5161
5262 log .Info ("initializing OTEL" , "service" , cfg .ServiceName , "endpoint" , cfg .Endpoint , "sampler" , cfg .Sampler )
@@ -102,6 +112,27 @@ func Setup(ctx context.Context, cfg Config) (Shutdown, error) {
102112 return shutdownFn , nil
103113}
104114
115+ func isNoopTracerProvider (tp oteltrace.TracerProvider ) bool {
116+ tracer := tp .Tracer ("spegel-otel-probe" )
117+ _ , span := tracer .Start (context .Background (), "otel-probe" )
118+ spanCtx := span .SpanContext ()
119+ span .End ()
120+ return ! spanCtx .IsValid ()
121+ }
122+
123+ func isExplicitConfig (cfg Config ) bool {
124+ if cfg .Endpoint != "" || cfg .Insecure {
125+ return true
126+ }
127+ if cfg .ServiceName != "" && cfg .ServiceName != defaultServiceName {
128+ return true
129+ }
130+ if cfg .Sampler != "" && cfg .Sampler != defaultSampler {
131+ return true
132+ }
133+ return false
134+ }
135+
105136// SetupWithDefaults is a convenience function that accepts a service name.
106137func SetupWithDefaults (ctx context.Context , serviceName string ) (Shutdown , error ) {
107138 return Setup (ctx , Config {ServiceName : serviceName })
0 commit comments