package tracing import ( "context" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) func InstallExportPipeline(ctx context.Context, serviceName string, sampleRatio float64) (func(context.Context) error, error) { client := otlptracehttp.NewClient() exporter, err := otlptrace.New(ctx, client) if err != nil { return nil, fmt.Errorf("creating OTLP trace exporter: %w", err) } tracerProvider := newTraceProvider(exporter, serviceName, sampleRatio) otel.SetTracerProvider(tracerProvider) return tracerProvider.Shutdown, nil } func newTraceProvider(exp sdktrace.SpanExporter, serviceName string, sampleRatio float64) *sdktrace.TracerProvider { // Ensure default SDK resources and the required service name are set. r, err := resource.Merge( resource.Default(), resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceName(serviceName), ), ) if err != nil { panic(err) } // initialize the traceIDRatioBasedSampler traceIDRatioBasedSampler := sdktrace.TraceIDRatioBased(sampleRatio) return sdktrace.NewTracerProvider( sdktrace.WithSampler(traceIDRatioBasedSampler), sdktrace.WithBatcher(exp), sdktrace.WithResource(r), ) }