107 lines
2.0 KiB
Go
107 lines
2.0 KiB
Go
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,
|
|
// }
|
|
// }
|