package gelfexporter import ( "context" "maal/tracer/pkg/level" "sync" "time" "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" "gopkg.in/Graylog2/go-gelf.v2/gelf" ) 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 } writer, err := gelf.NewUDPWriter(cfg.GelfUrl) if err != nil { return nil, err } return &Exporter{ gelfWriter: writer, }, nil } type Exporter struct { timestamps bool gelfWriter *gelf.UDPWriter stoppedMu sync.RWMutex stopped bool } 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) 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 } } // fmt.Printf("stub: %v\n", stub) Log(e.gelfWriter, GELFMessage{ Host: "test", ShortMessage: stub.Name, LongMessage: "test", Timestamp: stub.StartTime, Level: level.DEBUG, ExtraFields: make(map[string]interface{}), }) } 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() interface{} { // return struct { // Type string // WithTimestamps bool // }{ // Type: "stdout", // WithTimestamps: e.timestamps, // } // }