diff --git a/example/http/client/client.go b/example/http/client/client.go index 0499a3de4..acae5a895 100644 --- a/example/http/client/client.go +++ b/example/http/client/client.go @@ -43,10 +43,7 @@ func initTracer() { if err != nil { log.Fatal(err) } - - // Wrap stdout exporter with SimpleSpanProcessor and register the processor. - ssp := sdktrace.NewSimpleSpanProcessor(exporter) - sdktrace.RegisterSpanProcessor(ssp) + exporter.RegisterSimpleSpanProcessor() // For the demonstration, use sdktrace.AlwaysSample sampler to sample all traces. // In a production application, use sdktrace.ProbabilitySampler with a desired probability. diff --git a/example/http/server/server.go b/example/http/server/server.go index 701337523..7d1cce97a 100644 --- a/example/http/server/server.go +++ b/example/http/server/server.go @@ -35,10 +35,7 @@ func initTracer() { if err != nil { log.Fatal(err) } - - // Wrap stdout exporter with SimpleSpanProcessor and register the processor. - ssp := sdktrace.NewSimpleSpanProcessor(exporter) - sdktrace.RegisterSpanProcessor(ssp) + exporter.RegisterSimpleSpanProcessor() // For the demonstration, use sdktrace.AlwaysSample sampler to sample all traces. // In a production application, use sdktrace.ProbabilitySampler with a desired probability. diff --git a/exporter/trace/jaeger/example/main.go b/exporter/trace/jaeger/example/main.go index 43d5acd8e..793522b1f 100644 --- a/exporter/trace/jaeger/example/main.go +++ b/exporter/trace/jaeger/example/main.go @@ -39,10 +39,7 @@ func main() { if err != nil { log.Fatal(err) } - - // Wrap exporter with SimpleSpanProcessor and register the processor. - ssp := trace.NewSimpleSpanProcessor(exporter) - trace.RegisterSpanProcessor(ssp) + exporter.RegisterSimpleSpanProcessor() // For demoing purposes, always sample. In a production application, you should // configure this to a trace.ProbabilitySampler set at the desired diff --git a/exporter/trace/jaeger/jaeger.go b/exporter/trace/jaeger/jaeger.go index 56d1bc767..04e820408 100644 --- a/exporter/trace/jaeger/jaeger.go +++ b/exporter/trace/jaeger/jaeger.go @@ -17,6 +17,7 @@ package jaeger import ( "context" "log" + "sync" "google.golang.org/api/support/bundler" "google.golang.org/grpc/codes" @@ -24,6 +25,7 @@ import ( "go.opentelemetry.io/api/core" gen "go.opentelemetry.io/exporter/trace/jaeger/internal/gen-go/jaeger" "go.opentelemetry.io/sdk/export" + "go.opentelemetry.io/sdk/trace" ) const defaultServiceName = "OpenTelemetry" @@ -138,11 +140,20 @@ type Tag struct { // Exporter is an implementation of trace.Exporter that uploads spans to Jaeger. type Exporter struct { + once sync.Once process *gen.Process bundler *bundler.Bundler uploader batchUploader } +// RegisterSimpleSpanProcessor registers e as SimpleSpanProcessor. +func (e *Exporter) RegisterSimpleSpanProcessor() { + e.once.Do(func() { + ssp := trace.NewSimpleSpanProcessor(e) + trace.RegisterSpanProcessor(ssp) + }) +} + var _ export.SpanSyncer = (*Exporter)(nil) // ExportSpan exports a SpanData to Jaeger. diff --git a/exporter/trace/stdout/stdout.go b/exporter/trace/stdout/stdout.go index c8427732c..831b54387 100644 --- a/exporter/trace/stdout/stdout.go +++ b/exporter/trace/stdout/stdout.go @@ -19,8 +19,10 @@ import ( "encoding/json" "io" "os" + "sync" "go.opentelemetry.io/sdk/export" + "go.opentelemetry.io/sdk/trace" ) // Options are the options to be used when initializing a stdout export. @@ -32,6 +34,7 @@ type Options struct { // Exporter is an implementation of trace.Exporter that writes spans to stdout. type Exporter struct { + once sync.Once pretty bool outputWriter io.Writer } @@ -43,6 +46,14 @@ func NewExporter(o Options) (*Exporter, error) { }, nil } +// RegisterSimpleSpanProcessor registers e as SimpleSpanProcessor. +func (e *Exporter) RegisterSimpleSpanProcessor() { + e.once.Do(func() { + ssp := trace.NewSimpleSpanProcessor(e) + trace.RegisterSpanProcessor(ssp) + }) +} + // ExportSpan writes a SpanData in json format to stdout. func (e *Exporter) ExportSpan(ctx context.Context, data *export.SpanData) { var jsonSpan []byte