Skip to content

Commit

Permalink
done
Browse files Browse the repository at this point in the history
  • Loading branch information
golangisfun123 committed Sep 4, 2024
1 parent 7ba8a43 commit 9632578
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 6 deletions.
46 changes: 46 additions & 0 deletions core/metrics/multiexporter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package metrics

import (
"context"
"fmt"

"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
)

type multiExporter struct {
exporters []*otlptrace.Exporter
}

// NewMultiExporter creates a new multi exporter that forwards spans to multiple OTLP trace exporters.
// It takes in one or more otlptrace.Exporter instances and ensures that spans are sent to all of them.
// This is useful when you need to send trace data to multiple backends or endpoints.
func NewMultiExporter(exporters ...*otlptrace.Exporter) tracesdk.SpanExporter {
return &multiExporter{
exporters: exporters,
}
}

// ExportSpans exports a batch of spans.
func (m *multiExporter) ExportSpans(ctx context.Context, ss []tracesdk.ReadOnlySpan) error {
for _, exporter := range m.exporters {
err := exporter.ExportSpans(ctx, ss)
if err != nil {
return fmt.Errorf("could not export spans: %w", err)
}
}
return nil
}

// Shutdown notifies the exporter of a pending halt to operations.
func (m *multiExporter) Shutdown(ctx context.Context) error {
for _, exporter := range m.exporters {
err := exporter.Shutdown(ctx)
if err != nil {
return fmt.Errorf("could not stop exporter: %w", err)
}
}
return nil
}

var _ tracesdk.SpanExporter = &multiExporter{}
10 changes: 4 additions & 6 deletions core/metrics/otlp.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ func NewOTLPMetricsHandler(buildInfo config.BuildInfo) Handler {
}

func (n *otlpHandler) Start(ctx context.Context) (err error) {
// TODO: generalize this to allow for more than two exporters.
client, err := buildClientFromTransport(transportFromString(core.GetEnv(otlpTransportEnv, otlpTransportGRPC.String())))
if err != nil {
return fmt.Errorf("could not create client: %w", err)
Expand All @@ -48,18 +49,15 @@ func (n *otlpHandler) Start(ctx context.Context) (err error) {
return fmt.Errorf("failed to create secondary otlp exporter: %w", err)
}

multiExporter := NewMultiExporter(exporter, secondaryExporter)

n.baseHandler = newBaseHandler(
n.buildInfo,
tracesdk.WithBatcher(
exporter,
multiExporter,
tracesdk.WithMaxQueueSize(defaultMaxQueueSize),
tracesdk.WithMaxExportBatchSize(defaultMaxExportBatch),
),
tracesdk.WithBatcher(
secondaryExporter,
tracesdk.WithMaxQueueSize(defaultMaxQueueSize),
tracesdk.WithMaxExportBatchSize(metricsPortDefault),
),
tracesdk.WithSampler(tracesdk.AlwaysSample()),
)

Expand Down

0 comments on commit 9632578

Please sign in to comment.