1
0
mirror of https://github.com/open-telemetry/opentelemetry-go.git synced 2025-07-13 01:00:22 +02:00

Add a Shutdown method to sdk TraceProvider (#1227)

* Add a Shutdown method to api TraceProvider

- sdktraceprovider shutdown span processors
- In examples, replace processosr shutdown with
  traceprovider's shutdown

Signed-off-by: Hui Kang <kangh@us.ibm.com>

* remove shutdown in the api provider interface

* Add context in parameter and return error

* handle error in shutdown

* Update CHANGELOG.md

Co-authored-by: Tyler Yahn <MrAlias@users.noreply.github.com>
This commit is contained in:
Hui Kang
2020-10-26 12:20:49 -04:00
committed by GitHub
parent 230bdd10f0
commit d75ccbb378
7 changed files with 72 additions and 7 deletions

View File

@ -52,6 +52,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- OTLP Metric exporter supports Histogram aggregation. (#1209)
- The `Code` struct from the `go.opentelemetry.io/otel/codes` package now supports JSON marshaling and unmarshaling as well as implements the `Stringer` interface. (#1214)
- A Baggage API to implement the OpenTelemetry specification. (#1217)
- Add Shutdown method to sdk/trace/provider, shutdown processors in the order they were registered. (#1227)
### Changed

View File

@ -46,8 +46,8 @@ func main() {
}
bsp := sdktrace.NewBatchSpanProcessor(exporter)
defer bsp.Shutdown()
tp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(bsp))
defer func() { _ = tp.Shutdown(context.Background()) }()
pusher := push.New(
basic.New(
simple.NewWithExactDistribution(),

View File

@ -35,12 +35,12 @@ var (
var tp *sdktrace.TracerProvider
// initTracer creates and registers trace provider instance.
func initTracer() func() {
func initTracer() {
var err error
exp, err := stdout.NewExporter(stdout.WithPrettyPrint())
if err != nil {
log.Panicf("failed to initialize stdout exporter %v\n", err)
return nil
return
}
bsp := sdktrace.NewBatchSpanProcessor(exp)
tp = sdktrace.NewTracerProvider(
@ -52,17 +52,16 @@ func initTracer() func() {
sdktrace.WithSpanProcessor(bsp),
)
global.SetTracerProvider(tp)
return bsp.Shutdown
}
func main() {
// initialize trace provider.
shutdown := initTracer()
defer shutdown()
initTracer()
// Create a named tracer with package path as its name.
tracer := tp.Tracer("example/namedtracer/main")
ctx := context.Background()
defer func() { _ = tp.Shutdown(ctx) }()
ctx = otel.ContextWithBaggageValues(ctx, fooKey.String("foo1"), barKey.String("bar1"))
var span otel.Span

View File

@ -80,7 +80,7 @@ func initProvider() func() {
pusher.Start()
return func() {
bsp.Shutdown() // shutdown the processor
handleErr(tracerProvider.Shutdown(context.Background()), "failed to shutdown provider")
handleErr(exp.Shutdown(context.Background()), "failed to stop exporter")
pusher.Stop() // pushes any last exports to the receiver
}

View File

@ -492,6 +492,7 @@ func TestNewExporter_withMultipleAttributeTypes(t *testing.T) {
sdktrace.WithMaxExportBatchSize(10),
),
)
defer func() { _ = tp.Shutdown(context.Background()) }()
tr := tp.Tracer("test-tracer")
testKvs := []label.KeyValue{

View File

@ -15,6 +15,7 @@
package trace
import (
"context"
"sync"
"sync/atomic"
@ -180,6 +181,21 @@ func (p *TracerProvider) ApplyConfig(cfg Config) {
p.config.Store(&c)
}
// Shutdown shuts down the span processors in the order they were registered
func (p *TracerProvider) Shutdown(ctx context.Context) error {
spss, ok := p.spanProcessors.Load().(spanProcessorStates)
if !ok || len(spss) == 0 {
return nil
}
for _, sps := range spss {
sps.state.Do(func() {
sps.sp.Shutdown()
})
}
return nil
}
// WithSyncer registers the exporter with the TracerProvider using a
// SimpleSpanProcessor.
func WithSyncer(e export.SpanExporter) TracerProviderOption {

View File

@ -0,0 +1,48 @@
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package trace
import (
"context"
"testing"
export "go.opentelemetry.io/otel/sdk/export/trace"
)
type basicSpanProcesor struct {
running bool
}
func (t *basicSpanProcesor) Shutdown() {
t.running = false
}
func (t *basicSpanProcesor) OnStart(s *export.SpanData) {}
func (t *basicSpanProcesor) OnEnd(s *export.SpanData) {}
func (t *basicSpanProcesor) ForceFlush() {}
func TestShutdownTraceProvider(t *testing.T) {
stp := NewTracerProvider()
sp := &basicSpanProcesor{}
stp.RegisterSpanProcessor(sp)
sp.running = true
_ = stp.Shutdown(context.Background())
if sp.running != false {
t.Errorf("Error shutdown basicSpanProcesor\n")
}
}