Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: optimize the integration of otel tracing #2387

Merged
merged 12 commits into from
Aug 28, 2023
Prev Previous commit
Next Next commit
refactor: in order to add more exporters
  • Loading branch information
ev1lQuark committed Aug 18, 2023
commit bee178c70ec4d2e3bcb10a672fcd21c0f0b75ee3
59 changes: 56 additions & 3 deletions otel/trace/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,14 @@
package trace

import (
"errors"
"fmt"
"github.com/dubbogo/gost/log/logger"
"go.opentelemetry.io/contrib/propagators/b3"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
)

type ExporterConfig struct {
Expand All @@ -39,14 +45,61 @@ type Exporter interface {
}

type DefaultExporter struct {
TraceProvider *sdktrace.TracerProvider
Propagator propagation.TextMapPropagator
TracerProvider *sdktrace.TracerProvider
Propagator propagation.TextMapPropagator
}

func (e *DefaultExporter) GetTracerProvider() *sdktrace.TracerProvider {
return e.TraceProvider
return e.TracerProvider
}

func (e *DefaultExporter) GetPropagator() propagation.TextMapPropagator {
return e.Propagator
}

func NewExporter(config *ExporterConfig, customFunc func() (sdktrace.SpanExporter, error)) (tracerProvider *sdktrace.TracerProvider, propagator propagation.TextMapPropagator, err error) {
if config == nil {
err = errors.New("otel exporter config is nil")
return
}

exporter, err := customFunc()
if err != nil {
return
}

var samplerOption sdktrace.TracerProviderOption
switch config.SampleMode {
case "ratio":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.SampleRatio)))
case "always":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.AlwaysSample()))
case "never":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.NeverSample()))
default:
msg := fmt.Sprintf("otel sample mode %s not supported", config.SampleMode)
logger.Error(msg)
err = errors.New(msg)
return
}

tracerProvider = sdktrace.NewTracerProvider(
samplerOption,
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewSchemaless(
semconv.ServiceNamespaceKey.String(config.ServiceNamespace),
semconv.ServiceNameKey.String(config.ServiceName),
semconv.ServiceVersionKey.String(config.ServiceVersion),
)),
)

switch config.Propagator {
case "w3c":
propagator = propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
case "b3":
b3Propagator := b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader | b3.B3SingleHeader))
propagator = propagation.NewCompositeTextMapPropagator(b3Propagator, propagation.Baggage{})
}

return tracerProvider, propagator, nil
}
56 changes: 9 additions & 47 deletions otel/trace/jaeger/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,9 @@ package jaeger
import (
"dubbo.apache.org/dubbo-go/v3/common/extension"
"dubbo.apache.org/dubbo-go/v3/otel/trace"
"errors"
"fmt"
"github.com/dubbogo/gost/log/logger"
"go.opentelemetry.io/contrib/propagators/b3"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
"sync"
)

Expand All @@ -49,55 +43,23 @@ func newJaegerExporter(config *trace.ExporterConfig) (trace.Exporter, error) {
var initError error
if instance == nil {
initOnce.Do(func() {
if config == nil {
initError = errors.New("otel jaeger exporter config is nil")
return
customFunc := func() (sdktrace.SpanExporter, error) {
exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(config.Endpoint)))
if err != nil {
logger.Errorf("failed to create jaeger exporter: %v", err)
}
return exporter, err
}

exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(config.Endpoint)))
tracerProvider, propagator, err := trace.NewExporter(config, customFunc)
if err != nil {
logger.Errorf("failed to create jaeger exporter: %v", err)
initError = err
}

var samplerOption sdktrace.TracerProviderOption
switch config.SampleMode {
case "ratio":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.SampleRatio)))
case "always":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.AlwaysSample()))
case "never":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.NeverSample()))
default:
msg := fmt.Sprintf("otel jaeger sample mode %s not supported", config.SampleMode)
logger.Error(msg)
initError = errors.New(msg)
return
}

traceProvider := sdktrace.NewTracerProvider(
samplerOption,
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewSchemaless(
semconv.ServiceNamespaceKey.String(config.ServiceNamespace),
semconv.ServiceNameKey.String(config.ServiceName),
semconv.ServiceVersionKey.String(config.ServiceVersion),
)),
)

var propagator propagation.TextMapPropagator
switch config.Propagator {
case "w3c":
propagator = propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
case "b3":
b3Propagator := b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader | b3.B3SingleHeader))
propagator = propagation.NewCompositeTextMapPropagator(b3Propagator, propagation.Baggage{})
}

instance = &Exporter{
DefaultExporter: &trace.DefaultExporter{
TraceProvider: traceProvider,
Propagator: propagator,
TracerProvider: tracerProvider,
Propagator: propagator,
},
}
})
Expand Down