This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go-pixiu.git


The following commit(s) were added to refs/heads/develop by this push:
     new 76cf95cf fix tracing for dubbo (#559)
76cf95cf is described below

commit 76cf95cfea651bf1b5d55248c61a677cb54efc15
Author: ma642 <[email protected]>
AuthorDate: Tue Jun 6 10:19:17 2023 +0800

    fix tracing for dubbo (#559)
    
    Co-authored-by: mazhihui <[email protected]>
---
 go.mod                              |  2 +-
 go.sum                              |  6 +++--
 pixiu/pkg/client/dubbo/dubbo.go     | 13 +++++++---
 pixiu/pkg/filter/tracing/tracing.go |  5 ++--
 pixiu/pkg/server/otel.go            | 47 ----------------------------------
 pixiu/pkg/tracing/api.go            | 13 +---------
 pixiu/pkg/tracing/driver.go         | 51 +++++++++++++++++++++----------------
 pixiu/pkg/tracing/http.go           | 40 +----------------------------
 pixiu/pkg/tracing/trace_manager.go  | 17 +------------
 9 files changed, 49 insertions(+), 145 deletions(-)

diff --git a/go.mod b/go.mod
index 1ae669ac..caa70582 100644
--- a/go.mod
+++ b/go.mod
@@ -93,7 +93,7 @@ require (
        github.com/spf13/cobra v1.5.0
        github.com/spf13/pflag v1.0.5
        github.com/spf13/viper v1.11.0
-       github.com/stretchr/testify v1.8.0
+       github.com/stretchr/testify v1.8.2
        github.com/vishvananda/netlink v1.2.0-beta
        github.com/yl2chen/cidranger v1.0.2
        go.etcd.io/etcd/api/v3 v3.5.5
diff --git a/go.sum b/go.sum
index 13747173..67590f35 100644
--- a/go.sum
+++ b/go.sum
@@ -1593,8 +1593,9 @@ github.com/stretchr/objx 
v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.2.0/go.mod 
h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
 github.com/stretchr/objx v0.4.0/go.mod 
h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
+github.com/stretchr/objx v0.5.0/go.mod 
h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod 
h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.2.2/go.mod 
h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod 
h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -1603,8 +1604,9 @@ github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 
h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod 
h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.2 
h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod 
h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/subosito/gotenv v1.2.0/go.mod 
h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/subosito/gotenv v1.3.0 
h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI=
 github.com/subosito/gotenv v1.3.0/go.mod 
h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
diff --git a/pixiu/pkg/client/dubbo/dubbo.go b/pixiu/pkg/client/dubbo/dubbo.go
index 2446f47f..4ea99416 100644
--- a/pixiu/pkg/client/dubbo/dubbo.go
+++ b/pixiu/pkg/client/dubbo/dubbo.go
@@ -43,6 +43,7 @@ import (
        "github.com/pkg/errors"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/attribute"
+       "go.opentelemetry.io/otel/propagation"
        "go.opentelemetry.io/otel/trace"
 )
 
@@ -201,16 +202,22 @@ func (dc *Client) Call(req *client.Request) (res 
interface{}, err error) {
 
        gs := dc.Get(dm)
        tr := otel.Tracer(traceNameDubbogoClient)
-       _, span := tr.Start(req.Context, spanNameDubbogoClient)
+       ctx, span := tr.Start(req.Context, spanNameDubbogoClient)
        trace.SpanFromContext(req.Context).SpanContext()
        span.SetAttributes(attribute.Key(spanTagMethod).String(method))
        span.SetAttributes(attribute.Key(spanTagType).StringSlice(types))
        
span.SetAttributes(attribute.Key(spanTagValues).String(string(finalValues)))
        defer span.End()
-       ctx := context.WithValue(req.Context, constant.TracingRemoteSpanCtx, 
trace.SpanFromContext(req.Context).SpanContext())
-       rst, err := gs.Invoke(ctx, method, types, vals)
+
+       // tracing inject manually;
+       carrier := propagation.MapCarrier{}
+       otel.GetTextMapPropagator().Inject(ctx, carrier)
+       ctxWithAttachment := context.WithValue(ctx, constant.AttachmentKey, 
map[string]string(carrier))
+
+       rst, err := gs.Invoke(ctxWithAttachment, method, types, vals)
        if err != nil {
                // TODO statusCode I don’t know what dubbo will return when it 
times out, so I will return it directly. I will judge it when I call it.
+               span.RecordError(err)
                return nil, err
        }
 
diff --git a/pixiu/pkg/filter/tracing/tracing.go 
b/pixiu/pkg/filter/tracing/tracing.go
index 98ca5369..8bec53e6 100644
--- a/pixiu/pkg/filter/tracing/tracing.go
+++ b/pixiu/pkg/filter/tracing/tracing.go
@@ -26,7 +26,6 @@ import (
        "github.com/apache/dubbo-go-pixiu/pixiu/pkg/common/extension/filter"
        contexthttp "github.com/apache/dubbo-go-pixiu/pixiu/pkg/context/http"
        "github.com/apache/dubbo-go-pixiu/pixiu/pkg/server"
-       "github.com/apache/dubbo-go-pixiu/pixiu/pkg/tracing"
 )
 
 const TraceIDInHeader = "dubbo-go-pixiu-trace-id"
@@ -77,8 +76,8 @@ func (mf *TraceFilterFactory) PrepareFilterChain(ctx 
*contexthttp.HttpContext, c
 // Docode execute tracerFilter filter logic.
 func (f *TraceFilter) Decode(hc *contexthttp.HttpContext) filter.FilterStatus {
        spanName := "HTTP-" + hc.Request.Method
-       tr, _ := server.NewTracer(tracing.HTTPProtocol)
-       ctxWithId, span := tr.StartSpanFromContext(spanName, hc.Ctx)
+       tr := 
server.GetTraceDriverManager().GetDriver().Tracer("tracing.HTTPProtocol")
+       ctxWithId, span := tr.Start(hc.Ctx, spanName)
 
        hc.Request = hc.Request.WithContext(ctxWithId)
        f.span = span
diff --git a/pixiu/pkg/server/otel.go b/pixiu/pkg/server/otel.go
index 36e43df7..050a021b 100644
--- a/pixiu/pkg/server/otel.go
+++ b/pixiu/pkg/server/otel.go
@@ -18,15 +18,11 @@
 package server
 
 import (
-       "errors"
-       "fmt"
        "net/http"
        "strconv"
-       "strings"
 )
 
 import (
-       "github.com/google/uuid"
        sdkprometheus "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/client_golang/prometheus/promhttp"
        "go.opentelemetry.io/otel/exporters/prometheus"
@@ -37,7 +33,6 @@ import (
 import (
        "github.com/apache/dubbo-go-pixiu/pixiu/pkg/logger"
        "github.com/apache/dubbo-go-pixiu/pixiu/pkg/model"
-       "github.com/apache/dubbo-go-pixiu/pixiu/pkg/tracing"
 )
 
 func registerOtelMetricMeter(conf model.Metric) {
@@ -62,45 +57,3 @@ func registerOtelMetricMeter(conf model.Metric) {
                }()
        }
 }
-
-// NewTracer create tracer and need to be specified protocol.
-func NewTracer(name tracing.ProtocolName) (tracing.Trace, error) {
-       driver := GetTraceDriverManager().GetDriver()
-       if driver == nil {
-               return nil, errors.New("You must specify the exporter in 
conf.yaml first\n")
-       }
-       holder := driver.GetHolder(name)
-
-       newID := uuid.New().String()
-       builder := strings.Builder{}
-       builder.WriteString(string(name))
-       builder.WriteString("-" + newID)
-
-       traceId := builder.String()
-       tmp := driver.Tp.Tracer(traceId)
-       tracer := &tracing.Tracer{
-               ID:     traceId,
-               Trace:  tmp,
-               Holder: holder,
-       }
-
-       holder.Tracers[traceId] = tracing.TraceFactory[name](tracer)
-       return holder.Tracers[traceId], nil
-}
-
-// GetTracer need to specify both the protocol and id.
-func GetTracer(name tracing.ProtocolName, tracerID string) (tracing.Trace, 
error) {
-       driver := GetTraceDriverManager().GetDriver()
-       if driver == nil {
-               return nil, errors.New("You must specify the exporter in 
conf.yaml first\n")
-       }
-       holder, ok := driver.Holders.Load(name)
-       newHolder := holder.(*tracing.Holder)
-       if !ok {
-               return nil, errors.New("can not find any tracer, please call 
NewTracer first\n")
-       } else if _, ok = newHolder.Tracers[tracerID]; !ok {
-               return nil, fmt.Errorf("can not find tracer %s with protocol 
%s\n", tracerID, name)
-       } else {
-               return newHolder.Tracers[tracerID], nil
-       }
-}
diff --git a/pixiu/pkg/tracing/api.go b/pixiu/pkg/tracing/api.go
index 63c38f65..d9ef5d0e 100644
--- a/pixiu/pkg/tracing/api.go
+++ b/pixiu/pkg/tracing/api.go
@@ -17,22 +17,11 @@
 
 package tracing
 
-import (
-       "context"
-)
-
 import (
        "go.opentelemetry.io/otel/trace"
 )
 
 // Trace interface need to be implemented to construct your Tracer.
 type Trace interface {
-       // GetID gets ID string
-       GetID() string
-       // StartSpan creates new root span.
-       StartSpan(name string, request interface{}) (context.Context, 
trace.Span)
-       // StartSpanFromContext creates subSpan.
-       StartSpanFromContext(name string, tx context.Context) (context.Context, 
trace.Span)
-       // Close deletes trace from holder.
-       Close()
+       trace.Tracer
 }
diff --git a/pixiu/pkg/tracing/driver.go b/pixiu/pkg/tracing/driver.go
index 9c96b4db..5705182f 100644
--- a/pixiu/pkg/tracing/driver.go
+++ b/pixiu/pkg/tracing/driver.go
@@ -20,14 +20,16 @@ package tracing
 import (
        "context"
        "errors"
-       "sync"
+       "fmt"
 )
 
 import (
        "go.opentelemetry.io/otel"
+       "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"
+       "go.opentelemetry.io/otel/trace"
 )
 
 import (
@@ -57,20 +59,14 @@ const (
        OTLP   = "otlp"
 )
 
-// Unique Name by making Id self-incrementing。
+// Holder Unique Name by making Id self-incrementing。
 type Holder struct {
        Tracers map[string]Trace
 }
 
 // Tracers corresponding to the listening protocol are maintained by the holder
 type TraceDriver struct {
-       Holders sync.Map
-       Tp      *sdktrace.TracerProvider
-       context context.Context
-}
-
-func NewTraceDriver() *TraceDriver {
-       return &TraceDriver{}
+       trace.TracerProvider
 }
 
 // InitDriver loading BootStrap configuration about trace
@@ -86,21 +82,10 @@ func InitDriver(bs *model.Bootstrap) *TraceDriver {
                logger.Warnf("[dubbo-go-pixiu] create trace exporter failed: 
%v", err)
                return nil
        }
-       driver := NewTraceDriver()
        provider := newTraceProvider(exp, config)
-
        otel.SetTracerProvider(provider)
 
-       driver.Tp = provider
-       return driver
-}
-
-// GetHolder return the holder of the corresponding protocol. If None, create 
new holder.
-func (driver *TraceDriver) GetHolder(name ProtocolName) *Holder {
-       holder, _ := driver.Holders.LoadOrStore(name, &Holder{
-               Tracers: make(map[string]Trace),
-       })
-       return holder.(*Holder)
+       return &TraceDriver{TracerProvider: provider}
 }
 
 func newExporter(ctx context.Context, cfg *model.TracerConfig) 
(sdktrace.SpanExporter, error) {
@@ -124,7 +109,8 @@ func newTraceProvider(exp sdktrace.SpanExporter, cfg 
*model.TracerConfig) *sdktr
                semconv.SchemaURL,
                semconv.ServiceNameKey.String(cfg.ServiceName),
        )
-
+       //otel.SetTextMapPropagator(propagation.TraceContext{})
+       otel.SetTextMapPropagator(customJaegerInject{})
        return sdktrace.NewTracerProvider(
                sdktrace.WithBatcher(exp),
                sdktrace.WithResource(resource),
@@ -132,6 +118,27 @@ func newTraceProvider(exp sdktrace.SpanExporter, cfg 
*model.TracerConfig) *sdktr
        )
 }
 
+type customJaegerInject struct {
+       propagation.TraceContext
+}
+
+func (c customJaegerInject) Inject(ctx context.Context, carrier 
propagation.TextMapCarrier) {
+       sc := trace.SpanContextFromContext(ctx)
+       if !sc.IsValid() {
+               return
+       }
+
+       // Clear all flags other than the trace-context supported sampling bit.
+       flags := sc.TraceFlags() & trace.FlagsSampled
+
+       h := fmt.Sprintf("%s:%s:%s:%s",
+               sc.TraceID(),
+               sc.SpanID(),
+               sc.SpanID(),
+               flags)
+       carrier.Set("uber-trace-id", h)
+}
+
 func newSampler(sample model.Sampler) sdktrace.Sampler {
        // default sampling: always.
        switch sample.Type {
diff --git a/pixiu/pkg/tracing/http.go b/pixiu/pkg/tracing/http.go
index bb2741ab..9790500c 100644
--- a/pixiu/pkg/tracing/http.go
+++ b/pixiu/pkg/tracing/http.go
@@ -17,11 +17,6 @@
 
 package tracing
 
-import (
-       "context"
-       "net/http"
-)
-
 import (
        "go.opentelemetry.io/otel/trace"
 )
@@ -29,38 +24,5 @@ import (
 // Wrap the tracer provided by otel and be asked to implement the Trace 
interface
 // to customize the Span implementation.
 type Tracer struct {
-       ID     string
-       Trace  trace.Tracer
-       Holder *Holder
-}
-
-// By inheritance we can override the default StartSpan and other methods.
-type HTTPTracer struct {
-       *Tracer
-}
-
-func (t *Tracer) GetID() string {
-       return t.ID
-}
-
-func (t *Tracer) Close() {
-       delete(t.Holder.Tracers, t.ID)
-}
-
-func (t *Tracer) StartSpan(name string, request interface{}) (context.Context, 
trace.Span) {
-       return t.Trace.Start(request.(*http.Request).Context(), name)
-}
-
-func (t *Tracer) StartSpanFromContext(name string, ctx context.Context) 
(context.Context, trace.Span) {
-       return t.Trace.Start(ctx, name)
-}
-
-func NewHTTPTracer(tracer Trace) Trace {
-       return &HTTPTracer{
-               tracer.(*Tracer),
-       }
-}
-
-func (t *HTTPTracer) StartSpan(name string, request interface{}) 
(context.Context, trace.Span) {
-       return t.Trace.Start(request.(*http.Request).Context(), name)
+       Trace trace.Tracer
 }
diff --git a/pixiu/pkg/tracing/trace_manager.go 
b/pixiu/pkg/tracing/trace_manager.go
index 3d49bde9..fa37e001 100644
--- a/pixiu/pkg/tracing/trace_manager.go
+++ b/pixiu/pkg/tracing/trace_manager.go
@@ -21,17 +21,7 @@ import (
        "github.com/apache/dubbo-go-pixiu/pixiu/pkg/model"
 )
 
-type traceGenerator func(Trace) Trace
-
-// One protocol for one Trace.
-var TraceFactory map[ProtocolName]traceGenerator
-
-func init() {
-       TraceFactory = make(map[ProtocolName]traceGenerator)
-       TraceFactory[HTTPProtocol] = NewHTTPTracer
-}
-
-// Driver maintains all tracers and the provider.
+// TraceDriverManager Driver maintains all tracers and the provider.
 type TraceDriverManager struct {
        driver    *TraceDriver
        bootstrap *model.Bootstrap
@@ -48,8 +38,3 @@ func CreateDefaultTraceDriverManager(bs *model.Bootstrap) 
*TraceDriverManager {
 func (manager *TraceDriverManager) GetDriver() *TraceDriver {
        return manager.driver
 }
-
-func (manager *TraceDriverManager) Close() {
-       driver := manager.driver
-       _ = driver.Tp.Shutdown(driver.context)
-}

Reply via email to