43 lines
1.4 KiB
Go
43 lines
1.4 KiB
Go
|
package tracing
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||
|
)
|
||
|
|
||
|
// compositeExporter is a custom exporter that wraps multiple SpanExporters.
|
||
|
// It allows you to export spans to multiple destinations, e.g., different telemetry backends.
|
||
|
type compositeExporter struct {
|
||
|
exporters []sdktrace.SpanExporter
|
||
|
}
|
||
|
|
||
|
func newCompositeExporter(exporters ...sdktrace.SpanExporter) *compositeExporter {
|
||
|
return &compositeExporter{exporters: exporters}
|
||
|
}
|
||
|
|
||
|
// ExportSpans iterates over each SpanExporter in the compositeExporter and
|
||
|
// exports the spans. If any exporter returns an error, the process is stopped
|
||
|
// and the error is returned. This ensures that span exporting behaves correctly
|
||
|
// and reports errors as expected.
|
||
|
func (ce *compositeExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error {
|
||
|
for _, exporter := range ce.exporters {
|
||
|
if err := exporter.ExportSpans(ctx, spans); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Shutdown iterates over each SpanExporter in the compositeExporter and
|
||
|
// shuts them down. If any exporter returns an error during shutdown, the process
|
||
|
// is stopped and the error is returned. This ensures proper shutdown of all exporters.
|
||
|
func (ce *compositeExporter) Shutdown(ctx context.Context) error {
|
||
|
for _, exporter := range ce.exporters {
|
||
|
if err := exporter.Shutdown(ctx); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|