You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-08-10 22:31:50 +02:00
sdk/trace: Fix goroutine leak in simpleSpanProcessor.Shutdown (#6368)
Side-effect when working towards https://github.com/open-telemetry/opentelemetry-go/issues/6360 - Fix goroutine leaks from tests in places where batch processor was not shut down - Fix goroutine leak in simpleSpanProcessor.Shutdown
This commit is contained in:
@@ -11,6 +11,7 @@ require (
|
||||
github.com/stretchr/testify v1.10.0
|
||||
go.opentelemetry.io/otel v1.34.0
|
||||
go.opentelemetry.io/otel/trace v1.34.0
|
||||
go.uber.org/goleak v1.3.0
|
||||
golang.org/x/sys v0.30.0
|
||||
)
|
||||
|
||||
|
@@ -21,6 +21,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
@@ -12,8 +12,6 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
ottest "go.opentelemetry.io/otel/sdk/internal/internaltest"
|
||||
|
||||
"github.com/go-logr/logr"
|
||||
"github.com/go-logr/logr/funcr"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -21,6 +19,7 @@ import (
|
||||
|
||||
"go.opentelemetry.io/otel/internal/global"
|
||||
"go.opentelemetry.io/otel/sdk/internal/env"
|
||||
ottest "go.opentelemetry.io/otel/sdk/internal/internaltest"
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
"go.opentelemetry.io/otel/sdk/trace/tracetest"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
@@ -544,6 +543,9 @@ func TestBatchSpanProcessorForceFlushCancellation(t *testing.T) {
|
||||
cancel()
|
||||
|
||||
bsp := sdktrace.NewBatchSpanProcessor(indefiniteExporter{})
|
||||
t.Cleanup(func() {
|
||||
assert.NoError(t, bsp.Shutdown(context.Background()))
|
||||
})
|
||||
if got, want := bsp.ForceFlush(ctx), context.Canceled; !errors.Is(got, want) {
|
||||
t.Errorf("expected %q error, got %v", want, got)
|
||||
}
|
||||
@@ -556,6 +558,9 @@ func TestBatchSpanProcessorForceFlushTimeout(t *testing.T) {
|
||||
<-ctx.Done()
|
||||
|
||||
bsp := sdktrace.NewBatchSpanProcessor(indefiniteExporter{})
|
||||
t.Cleanup(func() {
|
||||
assert.NoError(t, bsp.Shutdown(context.Background()))
|
||||
})
|
||||
if got, want := bsp.ForceFlush(ctx), context.DeadlineExceeded; !errors.Is(got, want) {
|
||||
t.Errorf("expected %q error, got %v", want, got)
|
||||
}
|
||||
@@ -569,6 +574,9 @@ func TestBatchSpanProcessorForceFlushQueuedSpans(t *testing.T) {
|
||||
tp := sdktrace.NewTracerProvider(
|
||||
sdktrace.WithBatcher(exp),
|
||||
)
|
||||
t.Cleanup(func() {
|
||||
assert.NoError(t, tp.Shutdown(context.Background()))
|
||||
})
|
||||
|
||||
tracer := tp.Tracer("tracer")
|
||||
|
||||
@@ -641,6 +649,9 @@ func BenchmarkSpanProcessorOnEnd(b *testing.B) {
|
||||
tracetest.NewNoopExporter(),
|
||||
sdktrace.WithMaxExportBatchSize(bb.batchSize),
|
||||
)
|
||||
b.Cleanup(func() {
|
||||
_ = bsp.Shutdown(context.Background())
|
||||
})
|
||||
snap := tracetest.SpanStub{}.Snapshot()
|
||||
|
||||
b.ResetTimer()
|
||||
@@ -665,6 +676,9 @@ func BenchmarkSpanProcessorVerboseLogging(b *testing.B) {
|
||||
tracetest.NewNoopExporter(),
|
||||
sdktrace.WithMaxExportBatchSize(10),
|
||||
))
|
||||
b.Cleanup(func() {
|
||||
_ = tp.Shutdown(context.Background())
|
||||
})
|
||||
tracer := tp.Tracer("bench")
|
||||
ctx := context.Background()
|
||||
|
||||
|
14
sdk/trace/main_test.go
Normal file
14
sdk/trace/main_test.go
Normal file
@@ -0,0 +1,14 @@
|
||||
// Copyright The OpenTelemetry Authors
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package trace
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"go.uber.org/goleak"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
goleak.VerifyTestMain(m)
|
||||
}
|
@@ -58,7 +58,7 @@ func (ssp *simpleSpanProcessor) Shutdown(ctx context.Context) error {
|
||||
var err error
|
||||
ssp.stopOnce.Do(func() {
|
||||
stopFunc := func(exp SpanExporter) (<-chan error, func()) {
|
||||
done := make(chan error)
|
||||
done := make(chan error, 1)
|
||||
return done, func() { done <- exp.Shutdown(ctx) }
|
||||
}
|
||||
|
||||
|
@@ -4,12 +4,18 @@
|
||||
package trace_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
)
|
||||
|
||||
func basicTracerProvider(_ *testing.T) *sdktrace.TracerProvider {
|
||||
func basicTracerProvider(t *testing.T) *sdktrace.TracerProvider {
|
||||
tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()))
|
||||
t.Cleanup(func() {
|
||||
assert.NoError(t, tp.Shutdown(context.Background()))
|
||||
})
|
||||
return tp
|
||||
}
|
||||
|
Reference in New Issue
Block a user