You've already forked opentelemetry-go
							
							
				mirror of
				https://github.com/open-telemetry/opentelemetry-go.git
				synced 2025-10-31 00:07:40 +02:00 
			
		
		
		
	Use https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/modernize to update code to new style. --------- Co-authored-by: Flc゛ <four_leaf_clover@foxmail.com> Co-authored-by: Damien Mathieu <42@dmathieu.com>
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright The OpenTelemetry Authors
 | |
| // SPDX-License-Identifier: Apache-2.0
 | |
| 
 | |
| 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 := newConfig(options...)
 | |
| 
 | |
| 	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 {
 | |
| 	if err := ctx.Err(); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	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()
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // MarshalLog is the marshaling function used by the logging system to represent this Exporter.
 | |
| func (e *Exporter) MarshalLog() any {
 | |
| 	return struct {
 | |
| 		Type           string
 | |
| 		WithTimestamps bool
 | |
| 	}{
 | |
| 		Type:           "stdout",
 | |
| 		WithTimestamps: e.timestamps,
 | |
| 	}
 | |
| }
 |