diff --git a/telemetry/tracev2/domain.go b/telemetry/traceexporter/domain.go similarity index 95% rename from telemetry/tracev2/domain.go rename to telemetry/traceexporter/domain.go index 23e202b..390208e 100644 --- a/telemetry/tracev2/domain.go +++ b/telemetry/traceexporter/domain.go @@ -1,4 +1,4 @@ -package tracev2 +package traceexporter import ( "time" diff --git a/telemetry/tracev2/memory/exporter.go b/telemetry/traceexporter/memory/exporter.go similarity index 62% rename from telemetry/tracev2/memory/exporter.go rename to telemetry/traceexporter/memory/exporter.go index f7d6d4c..35aa752 100644 --- a/telemetry/tracev2/memory/exporter.go +++ b/telemetry/traceexporter/memory/exporter.go @@ -3,19 +3,23 @@ package memory import ( "context" - "github.com/w-h-a/pkg/telemetry/tracev2" - "github.com/w-h-a/pkg/utils/memoryutils" + "github.com/w-h-a/pkg/telemetry/log" + "github.com/w-h-a/pkg/telemetry/traceexporter" "go.opentelemetry.io/otel/attribute" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" ) type memoryExporter struct { - buffer *memoryutils.Buffer + options traceexporter.ExporterOptions +} + +func (e *memoryExporter) Options() traceexporter.ExporterOptions { + return e.options } func (e *memoryExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error { - spanData := []*tracev2.SpanData{} + spanData := []*traceexporter.SpanData{} for _, s := range spans { var parentSpanId trace.SpanID @@ -33,12 +37,12 @@ func (e *memoryExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadO metadata[string(attr.Key)] = attr.Value.AsString() } - status := tracev2.Status{ + status := traceexporter.Status{ Code: uint32(s.Status().Code), Description: s.Status().Description, } - data := &tracev2.SpanData{ + data := &traceexporter.SpanData{ Name: s.Name(), Id: s.SpanContext().SpanID().String(), Parent: parentSpanId.String(), @@ -53,17 +57,31 @@ func (e *memoryExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadO } for _, d := range spanData { - e.buffer.Put(d) + e.options.Buffer.Put(d) } return nil } -// TODO? +// TODO: ? func (e *memoryExporter) Shutdown(ctx context.Context) error { return nil } -func NewExporter(buffer *memoryutils.Buffer) sdktrace.SpanExporter { - return &memoryExporter{buffer} +func (e *memoryExporter) String() string { + return "memory" +} + +func NewExporter(opts ...traceexporter.ExporterOption) sdktrace.SpanExporter { + options := traceexporter.NewExporterOptions(opts...) + + if options.Buffer == nil { + log.Fatalf("no buffer was given") + } + + e := &memoryExporter{ + options: options, + } + + return e } diff --git a/telemetry/traceexporter/memory/options.go b/telemetry/traceexporter/memory/options.go new file mode 100644 index 0000000..05af74b --- /dev/null +++ b/telemetry/traceexporter/memory/options.go @@ -0,0 +1 @@ +package memory diff --git a/telemetry/traceexporter/options.go b/telemetry/traceexporter/options.go new file mode 100644 index 0000000..eae2d7f --- /dev/null +++ b/telemetry/traceexporter/options.go @@ -0,0 +1,32 @@ +package traceexporter + +import ( + "context" + + "github.com/w-h-a/pkg/utils/memoryutils" +) + +type ExporterOption func(o *ExporterOptions) + +type ExporterOptions struct { + Buffer *memoryutils.Buffer + Context context.Context +} + +func ExporterWithBuffer(b *memoryutils.Buffer) ExporterOption { + return func(o *ExporterOptions) { + o.Buffer = b + } +} + +func NewExporterOptions(opts ...ExporterOption) ExporterOptions { + options := ExporterOptions{ + Context: context.Background(), + } + + for _, fn := range opts { + fn(&options) + } + + return options +} diff --git a/telemetry/traceexporter/otelp/exporter.go b/telemetry/traceexporter/otelp/exporter.go new file mode 100644 index 0000000..42f0d06 --- /dev/null +++ b/telemetry/traceexporter/otelp/exporter.go @@ -0,0 +1 @@ +package otelp diff --git a/telemetry/traceexporter/otelp/options.go b/telemetry/traceexporter/otelp/options.go new file mode 100644 index 0000000..42f0d06 --- /dev/null +++ b/telemetry/traceexporter/otelp/options.go @@ -0,0 +1 @@ +package otelp diff --git a/telemetry/tracev2/memory/options.go b/telemetry/tracev2/memory/options.go deleted file mode 100644 index bef14ca..0000000 --- a/telemetry/tracev2/memory/options.go +++ /dev/null @@ -1,21 +0,0 @@ -package memory - -import ( - "context" - - "github.com/w-h-a/pkg/telemetry/tracev2" - "github.com/w-h-a/pkg/utils/memoryutils" -) - -type bufferKey struct{} - -func TraceWithBuffer(b *memoryutils.Buffer) tracev2.TraceOption { - return func(o *tracev2.TraceOptions) { - o.Context = context.WithValue(o.Context, bufferKey{}, b) - } -} - -func GetBufferFromContext(ctx context.Context) (*memoryutils.Buffer, bool) { - b, ok := ctx.Value(bufferKey{}).(*memoryutils.Buffer) - return b, ok -} diff --git a/telemetry/tracev2/options.go b/telemetry/tracev2/options.go index 871de5f..31c7db3 100644 --- a/telemetry/tracev2/options.go +++ b/telemetry/tracev2/options.go @@ -26,28 +26,3 @@ func NewTraceOptions(opts ...TraceOption) TraceOptions { return options } - -type ReadOption func(o *ReadOptions) - -type ReadOptions struct { - Count int - Context context.Context -} - -func ReadWithCount(c int) ReadOption { - return func(o *ReadOptions) { - o.Count = c - } -} - -func NewReadOptions(opts ...ReadOption) ReadOptions { - options := ReadOptions{ - Context: context.Background(), - } - - for _, fn := range opts { - fn(&options) - } - - return options -} diff --git a/telemetry/tracev2/otel/options.go b/telemetry/tracev2/otel/options.go new file mode 100644 index 0000000..9bee48e --- /dev/null +++ b/telemetry/tracev2/otel/options.go @@ -0,0 +1 @@ +package otel diff --git a/telemetry/tracev2/memory/trace.go b/telemetry/tracev2/otel/trace.go similarity index 59% rename from telemetry/tracev2/memory/trace.go rename to telemetry/tracev2/otel/trace.go index 633c3ff..b12df4e 100644 --- a/telemetry/tracev2/memory/trace.go +++ b/telemetry/tracev2/otel/trace.go @@ -1,31 +1,28 @@ -package memory +package otel import ( "context" "sync" - "github.com/w-h-a/pkg/telemetry/log" "github.com/w-h-a/pkg/telemetry/tracev2" - "github.com/w-h-a/pkg/utils/memoryutils" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" ) -type memoryTrace struct { +type otelTrace struct { options tracev2.TraceOptions tracer trace.Tracer spans map[string]trace.Span - buffer *memoryutils.Buffer mtx sync.RWMutex } -func (t *memoryTrace) Options() tracev2.TraceOptions { +func (t *otelTrace) Options() tracev2.TraceOptions { return t.options } -func (t *memoryTrace) Start(ctx context.Context, name string) (context.Context, string) { +func (t *otelTrace) Start(ctx context.Context, name string) (context.Context, string) { t.mtx.Lock() defer t.mtx.Unlock() @@ -52,7 +49,7 @@ func (t *memoryTrace) Start(ctx context.Context, name string) (context.Context, return newCtx, key } -func (t *memoryTrace) AddMetadata(span string, md map[string]string) { +func (t *otelTrace) AddMetadata(span string, md map[string]string) { t.mtx.Lock() defer t.mtx.Unlock() @@ -77,7 +74,7 @@ func (t *memoryTrace) AddMetadata(span string, md map[string]string) { t.spans[span].SetAttributes(attrs...) } -func (t *memoryTrace) UpdateStatus(span string, code uint32, description string) { +func (t *otelTrace) UpdateStatus(span string, code uint32, description string) { t.mtx.Lock() defer t.mtx.Unlock() @@ -90,7 +87,7 @@ func (t *memoryTrace) UpdateStatus(span string, code uint32, description string) } } -func (t *memoryTrace) Finish(span string) { +func (t *otelTrace) Finish(span string) { t.mtx.Lock() defer t.mtx.Unlock() @@ -99,33 +96,11 @@ func (t *memoryTrace) Finish(span string) { delete(t.spans, span) } -func (t *memoryTrace) Read(opts ...tracev2.ReadOption) ([]*tracev2.SpanData, error) { - options := tracev2.NewReadOptions(opts...) - - var entries []*memoryutils.Entry - - if options.Count > 0 { - entries = t.buffer.Get(options.Count) - } else { - entries = t.buffer.Get(t.buffer.Options().Size) - } - - spans := []*tracev2.SpanData{} - - for _, entry := range entries { - span := entry.Value.(*tracev2.SpanData) - - spans = append(spans, span) - } - - return spans, nil -} - -func (t *memoryTrace) String() string { - return "memory" +func (t *otelTrace) String() string { + return "otel" } -func (t *memoryTrace) start(ctx context.Context, name string, parentCtxCfg trace.SpanContextConfig) (context.Context, trace.Span) { +func (t *otelTrace) start(ctx context.Context, name string, parentCtxCfg trace.SpanContextConfig) (context.Context, trace.Span) { parentSpanCtx := trace.NewSpanContext(parentCtxCfg) ctx = trace.ContextWithRemoteSpanContext(ctx, parentSpanCtx) @@ -136,18 +111,12 @@ func (t *memoryTrace) start(ctx context.Context, name string, parentCtxCfg trace func NewTrace(opts ...tracev2.TraceOption) tracev2.Trace { options := tracev2.NewTraceOptions(opts...) - t := &memoryTrace{ + t := &otelTrace{ options: options, tracer: otel.Tracer(options.Name), spans: map[string]trace.Span{}, mtx: sync.RWMutex{}, } - if b, ok := GetBufferFromContext(options.Context); ok && b != nil { - t.buffer = b - } else { - log.Fatalf("no buffer was given") - } - return t } diff --git a/telemetry/tracev2/trace.go b/telemetry/tracev2/trace.go index 1c9d843..665b703 100644 --- a/telemetry/tracev2/trace.go +++ b/telemetry/tracev2/trace.go @@ -10,6 +10,5 @@ type Trace interface { AddMetadata(span string, md map[string]string) UpdateStatus(span string, code uint32, description string) Finish(span string) - Read(opts ...ReadOption) ([]*SpanData, error) String() string }