Skip to content

Commit 0e805de

Browse files
committed
otelx: respect explicit config and env defaults
Prefer existing tracer providers when no explicit config is set, but allow explicit OTEL settings to override and ensure defaults honor standard env variables.
1 parent 7d66736 commit 0e805de

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

internal/otelx/otelx_otel.go

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
3339
func 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.
106137
func SetupWithDefaults(ctx context.Context, serviceName string) (Shutdown, error) {
107138
return Setup(ctx, Config{ServiceName: serviceName})

internal/otelx/otelx_otel_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,28 @@ func TestSetup_RespectsExistingPropagator(t *testing.T) {
9494
assert.Equal(t, customProp, otel.GetTextMapPropagator())
9595
}
9696

97+
//nolint:paralleltest // Mutates global OTEL provider/propagator.
98+
func TestSetup_OverridesExistingProviderWhenConfigured(t *testing.T) {
99+
prevProvider := otel.GetTracerProvider()
100+
prevPropagator := otel.GetTextMapPropagator()
101+
existing := trace.NewTracerProvider()
102+
otel.SetTracerProvider(existing)
103+
otel.SetTextMapPropagator(propagation.TraceContext{})
104+
t.Cleanup(func() {
105+
otel.SetTracerProvider(prevProvider)
106+
otel.SetTextMapPropagator(prevPropagator)
107+
})
108+
109+
shutdown, err := Setup(context.Background(), Config{
110+
Endpoint: "http://127.0.0.1:4318",
111+
Sampler: "always_on",
112+
Insecure: true,
113+
})
114+
require.NoError(t, err)
115+
require.NotNil(t, shutdown)
116+
assert.NotSame(t, existing, otel.GetTracerProvider())
117+
}
118+
97119
//nolint:paralleltest // Mutates global OTEL provider/propagator.
98120
func TestSetup_InsecureEndpoint(t *testing.T) {
99121
prevProvider := otel.GetTracerProvider()

0 commit comments

Comments
 (0)