123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // 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 stdouttrace // import "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
- import (
- "context"
- "encoding/json"
- "sync"
- "time"
- "go.opentelemetry.io/otel/sdk/trace"
- "go.opentelemetry.io/otel/sdk/trace/tracetest"
- )
- var zeroTime time.Time
- var _ trace.SpanExporter = &Exporter{}
- // New creates an Exporter with the passed options.
- func New(options ...Option) (*Exporter, error) {
- cfg, err := newConfig(options...)
- if err != nil {
- return nil, err
- }
- enc := json.NewEncoder(cfg.Writer)
- if cfg.PrettyPrint {
- enc.SetIndent("", "\t")
- }
- return &Exporter{
- encoder: enc,
- timestamps: cfg.Timestamps,
- }, nil
- }
- // Exporter is an implementation of trace.SpanSyncer that writes spans to stdout.
- type Exporter struct {
- encoder *json.Encoder
- encoderMu sync.Mutex
- timestamps bool
- stoppedMu sync.RWMutex
- stopped bool
- }
- // ExportSpans writes spans in json format to stdout.
- func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error {
- e.stoppedMu.RLock()
- stopped := e.stopped
- e.stoppedMu.RUnlock()
- if stopped {
- return nil
- }
- if len(spans) == 0 {
- return nil
- }
- stubs := tracetest.SpanStubsFromReadOnlySpans(spans)
- e.encoderMu.Lock()
- defer e.encoderMu.Unlock()
- for i := range stubs {
- stub := &stubs[i]
- // Remove timestamps
- if !e.timestamps {
- stub.StartTime = zeroTime
- stub.EndTime = zeroTime
- for j := range stub.Events {
- ev := &stub.Events[j]
- ev.Time = zeroTime
- }
- }
- // Encode span stubs, one by one
- if err := e.encoder.Encode(stub); err != nil {
- return err
- }
- }
- return nil
- }
- // Shutdown is called to stop the exporter, it performs no action.
- func (e *Exporter) Shutdown(ctx context.Context) error {
- e.stoppedMu.Lock()
- e.stopped = true
- e.stoppedMu.Unlock()
- select {
- case <-ctx.Done():
- return ctx.Err()
- default:
- }
- return nil
- }
- // MarshalLog is the marshaling function used by the logging system to represent this exporter.
- func (e *Exporter) MarshalLog() interface{} {
- return struct {
- Type string
- WithTimestamps bool
- }{
- Type: "stdout",
- WithTimestamps: e.timestamps,
- }
- }
|