package otlptrace
import (
"context"
"errors"
"fmt"
"sync"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
)
var errAlreadyStarted = errors .New ("already started" )
type Exporter struct {
client Client
mu sync .RWMutex
started bool
startOnce sync .Once
stopOnce sync .Once
}
func (e *Exporter ) ExportSpans (ctx context .Context , ss []tracesdk .ReadOnlySpan ) error {
protoSpans := tracetransform .Spans (ss )
if len (protoSpans ) == 0 {
return nil
}
err := e .client .UploadTraces (ctx , protoSpans )
if err != nil {
return fmt .Errorf ("traces export: %w" , err )
}
return nil
}
func (e *Exporter ) Start (ctx context .Context ) error {
err := errAlreadyStarted
e .startOnce .Do (func () {
e .mu .Lock ()
e .started = true
e .mu .Unlock ()
err = e .client .Start (ctx )
})
return err
}
func (e *Exporter ) Shutdown (ctx context .Context ) error {
e .mu .RLock ()
started := e .started
e .mu .RUnlock ()
if !started {
return nil
}
var err error
e .stopOnce .Do (func () {
err = e .client .Stop (ctx )
e .mu .Lock ()
e .started = false
e .mu .Unlock ()
})
return err
}
var _ tracesdk .SpanExporter = (*Exporter )(nil )
func New (ctx context .Context , client Client ) (*Exporter , error ) {
exp := NewUnstarted (client )
if err := exp .Start (ctx ); err != nil {
return nil , err
}
return exp , nil
}
func NewUnstarted (client Client ) *Exporter {
return &Exporter {
client : client ,
}
}
func (e *Exporter ) MarshalLog () any {
return struct {
Type string
Client Client
}{
Type : "otlptrace" ,
Client : e .client ,
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .