diff --git a/pkg/tracing/client/factory.go b/pkg/tracing/client/factory.go index 55753724f93..28c2e150e0d 100644 --- a/pkg/tracing/client/factory.go +++ b/pkg/tracing/client/factory.go @@ -47,6 +47,7 @@ type TracingConfig struct { Config interface{} `yaml:"config"` } +// NewOTELTracer returns an OTLP exporter based tracer. func NewOTELTracer(ctx context.Context, logger log.Logger) trace.Tracer { client := otlptracehttp.NewClient() exporter, err := otlptrace.New(ctx, client) @@ -65,7 +66,6 @@ func NewOTELTracer(ctx context.Context, logger log.Logger) trace.Tracer { tracer := otel.GetTracerProvider().Tracer( name, - trace.WithInstrumentationVersion("v0.1"), trace.WithSchemaURL(semconv.SchemaURL), ) return tracer @@ -100,8 +100,12 @@ func NewTracer(ctx context.Context, logger log.Logger, metrics *prometheus.Regis tracer, closerFunc := migration.Bridge(tracerProvider, logger) return tracer, closerFunc, nil case string(Jaeger): - // next step - create newTracerProvider like google_cloud - return jaeger.NewTracer(ctx, logger, metrics, config) + tracerProvider, err := jaeger.NewTracerProvider(ctx, logger, config) + if err != nil { + return nil, nil, errors.Wrap(err, "new tracer provider err") + } + tracer, closerFunc := migration.Bridge(tracerProvider, logger) + return tracer, closerFunc, nil case string(ElasticAPM): return elasticapm.NewTracer(config) case string(Lightstep): diff --git a/pkg/tracing/jaeger/jaeger.go b/pkg/tracing/jaeger/jaeger.go index 872976e5f73..07d83e43e18 100644 --- a/pkg/tracing/jaeger/jaeger.go +++ b/pkg/tracing/jaeger/jaeger.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/thanos-io/thanos/pkg/tracing" + "github.com/thanos-io/thanos/pkg/tracing/migration" "github.com/go-kit/log" "github.com/go-kit/log/level" @@ -19,6 +20,10 @@ import ( "github.com/uber/jaeger-client-go/config" jaeger_prometheus "github.com/uber/jaeger-lib/metrics/prometheus" otel_jaeger "go.opentelemetry.io/otel/exporters/jaeger" + "go.opentelemetry.io/otel/sdk/resource" + tracesdk "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "gopkg.in/yaml.v2" ) // Tracer extends opentracing.Tracer. @@ -34,6 +39,60 @@ func (t *Tracer) GetTraceIDFromSpanContext(ctx opentracing.SpanContext) (string, return "", false } +func NewTracerProvider(ctx context.Context, logger log.Logger, conf []byte) (*tracesdk.TracerProvider, error) { + config := Config{} + if err := yaml.Unmarshal(conf, &config); err != nil { + return nil, err + } + + var exporter *otel_jaeger.Exporter + var err error + if config.Endpoint != "" { + exporter, err = otel_jaeger.New(otel_jaeger.WithCollectorEndpoint(otel_jaeger.WithEndpoint(config.Endpoint))) + if err != nil { + return nil, err + } + } else { + exporter, err = otel_jaeger.New(otel_jaeger.WithCollectorEndpoint()) + if err != nil { + return nil, err + } + } + + processor := tracesdk.NewBatchSpanProcessor(exporter) + tp := newTraceProvider(ctx, logger, processor, config.SamplerParam, config.ServiceName) + + return tp, nil +} + +func newTraceProvider(ctx context.Context, logger log.Logger, processor tracesdk.SpanProcessor, + samplingFactor float64, serviceName string) *tracesdk.TracerProvider { + + var fraction float64 + if samplingFactor == 0 { + fraction = 0 + } else { + fraction = 1 / float64(samplingFactor) + } + + // need to add sampler config details here + tp := tracesdk.NewTracerProvider( + tracesdk.WithSpanProcessor(processor), + tracesdk.WithSampler( + migration.SamplerWithOverride( + tracesdk.ParentBased(tracesdk.TraceIDRatioBased(fraction)), + migration.ForceTracingAttributeKey, + ), + ), + tracesdk.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(serviceName), + )), + ) + + return tp +} + // NewTracer create tracer from YAML. func NewTracer(ctx context.Context, logger log.Logger, metrics *prometheus.Registry, conf []byte) (opentracing.Tracer, io.Closer, error) { var (