Compare commits

...

5 Commits

Author SHA1 Message Date
89f75e0431 improve tracing
Some checks failed
build / test (push) Failing after 26s
build / lint (push) Successful in 25s
codeql / analyze (go) (push) Failing after 49s
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-07-22 23:39:22 +03:00
9f6620676a get trace info from context
Some checks failed
build / test (push) Failing after 23s
build / lint (push) Successful in 22s
codeql / analyze (go) (push) Failing after 1m0s
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-07-17 17:51:51 +03:00
e1f85545d9 get trace info from context
Some checks failed
build / test (push) Waiting to run
build / lint (push) Successful in 41s
codeql / analyze (go) (push) Failing after 2m5s
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-07-17 17:38:14 +03:00
e887edb475 get trace info from context
Some checks failed
build / test (push) Has been cancelled
build / lint (push) Has been cancelled
codeql / analyze (go) (push) Has been cancelled
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-07-17 17:37:06 +03:00
2149a713d5 support never micro context attrs funcs
Some checks failed
build / lint (push) Successful in 24s
build / test (push) Failing after 1m30s
codeql / analyze (go) (push) Failing after 1m55s
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-07-06 00:19:38 +03:00
4 changed files with 122 additions and 20 deletions

4
go.mod
View File

@@ -6,6 +6,6 @@ toolchain go1.22.2
require (
github.com/opentracing/opentracing-go v1.2.0
go.opentelemetry.io/otel v1.26.0
go.unistack.org/micro/v3 v3.10.77
go.opentelemetry.io/otel v1.28.0
go.unistack.org/micro/v3 v3.10.81
)

8
go.sum
View File

@@ -11,9 +11,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs=
go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4=
go.unistack.org/micro/v3 v3.10.77 h1:nn731y84q3S8a4UgpVdC/wN9cs30ruZeH81rKw6XcUc=
go.unistack.org/micro/v3 v3.10.77/go.mod h1:erMgt3Bl7vQQ0e9UpQyR5NlLiZ9pKeEJ9+1tfYFaqUg=
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
go.unistack.org/micro/v3 v3.10.81 h1:zHttMUEwL/f9GtrNAQOk8bK0NrEwAuKeUW8DEoywgJI=
go.unistack.org/micro/v3 v3.10.81/go.mod h1:erMgt3Bl7vQQ0e9UpQyR5NlLiZ9pKeEJ9+1tfYFaqUg=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -3,14 +3,13 @@ package opentracing
import (
"context"
"errors"
"fmt"
"strings"
ot "github.com/opentracing/opentracing-go"
otlog "github.com/opentracing/opentracing-go/log"
"go.opentelemetry.io/otel/attribute"
"go.unistack.org/micro/v3/metadata"
"go.unistack.org/micro/v3/tracer"
rutil "go.unistack.org/micro/v3/util/reflect"
)
var _ tracer.Tracer = &otTracer{}
@@ -42,16 +41,27 @@ func (t *otTracer) Init(opts ...tracer.Option) error {
return nil
}
type spanContext interface {
type otSpanContext interface {
TraceID() idStringer
SpanID() idStringer
}
type jSpanContext interface {
TraceID() idStringer
SpanID() idStringer
}
func (t *otTracer) Start(ctx context.Context, name string, opts ...tracer.SpanOption) (context.Context, tracer.Span) {
options := tracer.NewSpanOptions(opts...)
if len(options.Labels)%2 != 0 {
options.Labels = options.Labels[:len(options.Labels)-1]
}
for _, fn := range t.opts.ContextAttrFuncs {
options.Labels = append(options.Labels, fn(ctx)...)
}
var span ot.Span
switch options.Kind {
case tracer.SpanKindUnspecified:
@@ -67,18 +77,41 @@ func (t *otTracer) Start(ctx context.Context, name string, opts ...tracer.SpanOp
sp := &otSpan{span: span, opts: options}
spctx := span.Context()
if v, ok := spctx.(spanContext); ok {
sp.traceID = v.TraceID().String()
sp.spanID = v.SpanID().String()
var traceID, spanID, parentID string
if v, ok := spctx.(otSpanContext); ok {
traceID = v.TraceID().String()
spanID = v.SpanID().String()
} else {
if val, err := rutil.StructFieldByName(spctx, "TraceID"); err == nil {
sp.traceID = fmt.Sprintf("%v", val)
}
if val, err := rutil.StructFieldByName(spctx, "SpanID"); err == nil {
sp.spanID = fmt.Sprintf("%v", val)
carrier := make(map[string]string, 1)
_ = span.Tracer().Inject(spctx, ot.TextMap, ot.TextMapCarrier(carrier))
for k, v := range carrier {
switch k {
case "mockpfx-ids-sampled":
continue
case "mockpfx-ids-spanid":
spanID = v
case "mockpfx-ids-traceid":
traceID = v
default: // reasonable default
p := strings.Split(v, ":")
traceID = p[0]
spanID = p[1]
parentID = p[2]
case "uber-trace-id": // jaeger trace span
p := strings.Split(v, ":")
traceID = p[0]
spanID = p[1]
parentID = p[2]
}
}
}
sp.traceID = traceID
sp.spanID = spanID
sp.parentID = parentID
return tracer.NewSpanContext(ctx, sp), sp
}
@@ -94,6 +127,7 @@ type otSpan struct {
span ot.Span
spanID string
traceID string
parentID string
opts tracer.SpanOptions
status tracer.SpanStatus
statusMsg string
@@ -109,6 +143,10 @@ func (os *otSpan) SpanID() string {
return os.spanID
}
func (os *otSpan) ParentID() string {
return os.parentID
}
func (os *otSpan) SetStatus(st tracer.SpanStatus, msg string) {
os.status = st
os.statusMsg = msg
@@ -283,11 +321,15 @@ func (t *otTracer) startSpanFromOutgoingContext(ctx context.Context, name string
}
nmd := metadata.Copy(md)
smd := metadata.New(1)
sp := t.tracer.StartSpan(name, opts...)
if err := sp.Tracer().Inject(sp.Context(), ot.TextMap, ot.TextMapCarrier(nmd)); err != nil {
if err := sp.Tracer().Inject(sp.Context(), ot.TextMap, ot.TextMapCarrier(smd)); err != nil {
return nil, nil
}
for k, v := range smd {
nmd.Set(k, v)
}
ctx = metadata.NewOutgoingContext(ot.ContextWithSpan(ctx, sp), nmd)
@@ -326,11 +368,15 @@ func (t *otTracer) startSpanFromIncomingContext(ctx context.Context, name string
}
nmd := metadata.Copy(md)
smd := metadata.New(1)
sp := t.tracer.StartSpan(name, opts...)
if err := sp.Tracer().Inject(sp.Context(), ot.TextMap, ot.TextMapCarrier(nmd)); err != nil {
if err := sp.Tracer().Inject(sp.Context(), ot.TextMap, ot.TextMapCarrier(smd)); err != nil {
return nil, nil
}
for k, v := range smd {
nmd.Set(k, v)
}
ctx = metadata.NewIncomingContext(ot.ContextWithSpan(ctx, sp), nmd)

View File

@@ -6,11 +6,13 @@ import (
"testing"
"github.com/opentracing/opentracing-go/mocktracer"
// jconfig "github.com/uber/jaeger-client-go/config"
"go.unistack.org/micro/v3/logger/slog"
"go.unistack.org/micro/v3/metadata"
"go.unistack.org/micro/v3/tracer"
)
func TestTraceID(t *testing.T) {
func TestNoopTraceID(t *testing.T) {
md := metadata.New(1)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
@@ -30,8 +32,62 @@ func TestTraceID(t *testing.T) {
if v := sp.SpanID(); v != "44" {
t.Fatalf("invalid span span id %#+v", v)
}
l := slog.NewLogger()
if err := l.Init(); err != nil {
t.Fatal(err)
}
l.Info(ctx, "msg")
}
/*
func TestRealTraceID(t *testing.T) {
md := metadata.New(1)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ctx = metadata.NewIncomingContext(ctx, md)
jcfg := &jconfig.Configuration{
ServiceName: "test",
Sampler: &jconfig.SamplerConfig{
Type: "const",
Param: 1,
},
Reporter: &jconfig.ReporterConfig{
LogSpans: true,
QueueSize: 100,
},
}
jtr, closer, err := jcfg.NewTracer()
if err != nil {
t.Fatal(err)
}
defer closer.Close()
tr := NewTracer(Tracer(jtr))
if err := tr.Init(); err != nil {
t.Fatal(err)
}
var sp tracer.Span
ctx, sp = tr.Start(ctx, "test")
if v := sp.TraceID(); v != "43" {
t.Fatalf("invalid span trace id %#+v", v)
}
if v := sp.SpanID(); v != "44" {
t.Fatalf("invalid span span id %#+v", v)
}
l := slog.NewLogger()
if err := l.Init(); err != nil {
t.Fatal(err)
}
l.Info(ctx, "msg")
}
*/
func TestTraceTags(t *testing.T) {
md := metadata.New(1)
ctx, cancel := context.WithCancel(context.Background())