From 7a439632da983e37d182026f10dab4a881c6a1e6 Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Tue, 2 Jun 2026 19:08:13 +0200 Subject: [PATCH] test(otel): guard OTEL_TRACES_SAMPLER is honored --- pkg/gotenberg/internal/otel/otel_test.go | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 pkg/gotenberg/internal/otel/otel_test.go diff --git a/pkg/gotenberg/internal/otel/otel_test.go b/pkg/gotenberg/internal/otel/otel_test.go new file mode 100644 index 0000000..1a3ad64 --- /dev/null +++ b/pkg/gotenberg/internal/otel/otel_test.go @@ -0,0 +1,42 @@ +package otel + +import ( + "context" + "log/slog" + "testing" + + "go.opentelemetry.io/otel" +) + +// TestInitTracerProvider_HonorsSamplerEnv guards the contract that the tracer +// provider keeps honoring OTEL_TRACES_SAMPLER. The SDK reads it only when no +// explicit sampler is configured, so any future WithSampler() would silently +// break operator-side sampling control. +func TestInitTracerProvider_HonorsSamplerEnv(t *testing.T) { + for _, tc := range []struct { + name string + sampler string + wantSampled bool + }{ + {"always off", "always_off", false}, + {"always on", "always_on", true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Setenv("OTEL_TRACES_EXPORTER", "none") + t.Setenv("OTEL_TRACES_SAMPLER", tc.sampler) + + shutdown, err := InitTracerProvider(slog.New(slog.DiscardHandler), "test", "v0.0.0") + if err != nil { + t.Fatalf("init tracer provider: %v", err) + } + t.Cleanup(func() { _ = shutdown(context.Background()) }) + + _, span := otel.Tracer("test").Start(context.Background(), "span") + span.End() + + if got := span.SpanContext().IsSampled(); got != tc.wantSampled { + t.Errorf("OTEL_TRACES_SAMPLER=%q: IsSampled() = %v, want %v", tc.sampler, got, tc.wantSampled) + } + }) + } +}