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)
-}