observer/pkg/exporters/exporters.go
Natalia Goc 3c51f5575b plenty of changes to make the package more ergonomic
Including: bug fixes, api changes, new packages, and more!
2024-05-17 15:31:35 +02:00

77 lines
2.3 KiB
Go

package exporters
import (
"context"
"git.ma-al.com/gora_filip/pkg/exporters/console_exporter"
gelf_exporter "git.ma-al.com/gora_filip/pkg/exporters/gelf_exporter"
otlphttp_exporter "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
// Private type preventing implementation of TraceProcessor by external packages.
type traceProviderOpt sdktrace.TracerProviderOption
type TraceExporter interface {
IntoTraceProviderOption() traceProviderOpt
}
func NewFromSpanExporter(exporter sdktrace.SpanExporter) ExporterWithConfig {
return ExporterWithConfig{
exporter: exporter,
}
}
// Sneaky wrapper that makes it so that the TraceExporter can be created from SpanProcessor.
type proc struct {
sdktrace.SpanProcessor
}
func (p proc) IntoTraceProviderOption() traceProviderOpt {
return sdktrace.WithSpanProcessor(p)
}
func NewFromSpanProcessor(processor sdktrace.SpanProcessor) TraceExporter {
return TraceExporter(proc{
SpanProcessor: processor,
})
}
// Combined exporter with batch processor config
type ExporterWithConfig struct {
exporter sdktrace.SpanExporter
config []sdktrace.BatchSpanProcessorOption
}
func (ecfg ExporterWithConfig) Add(opt sdktrace.BatchSpanProcessorOption) ExporterWithConfig {
ecfg.config = append(ecfg.config, opt)
return ecfg
}
func (ecfg ExporterWithConfig) IntoTraceProviderOption() traceProviderOpt {
return sdktrace.WithBatcher(ecfg.exporter, ecfg.config...)
}
// An exporter printing to console with very small delay
func DevConsoleExporter(opts ...console_exporter.ProcessorOptions) TraceExporter {
var exporter TraceExporter
if len(opts) > 0 {
exporter = NewFromSpanProcessor(console_exporter.NewProcessor(opts[0]))
} else {
exporter = NewFromSpanProcessor(console_exporter.DefaultConsoleExportProcessor())
}
return TraceExporter(exporter)
}
// Default exporter to Graylog.
func GelfExporter(opts ...gelf_exporter.Option) (ExporterWithConfig, error) {
gelfExp, err := gelf_exporter.New(opts...)
return NewFromSpanExporter(gelfExp), err
}
// Exporter for traces over HTTP. Can be used with Jaeger.
// See documentation of [otlhttp_exporter] for details.
func OtlpHTTPExporter(opts ...otlphttp_exporter.Option) (ExporterWithConfig, error) {
otlpExp, err := otlphttp_exporter.New(context.Background(), opts...)
return NewFromSpanExporter(otlpExp), err
}