Compare commits

...

6 Commits

Author SHA1 Message Date
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
9b553cfa62 add ability to pass span options on finish
Some checks failed
build / test (push) Failing after 1m38s
codeql / analyze (go) (push) Failing after 1m54s
build / lint (push) Successful in 9m17s
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-05-09 19:30:32 +03:00
65ac3aff56 fixup add labels
Some checks failed
build / test (push) Failing after 1m43s
codeql / analyze (go) (push) Failing after 1m43s
build / lint (push) Successful in 9m13s
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2024-05-06 01:09:41 +03:00
4 changed files with 145 additions and 23 deletions

4
go.mod
View File

@@ -6,6 +6,6 @@ toolchain go1.22.2
require ( require (
github.com/opentracing/opentracing-go v1.2.0 github.com/opentracing/opentracing-go v1.2.0
go.opentelemetry.io/otel v1.26.0 go.opentelemetry.io/otel v1.28.0
go.unistack.org/micro/v3 v3.10.73 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.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 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
go.unistack.org/micro/v3 v3.10.73 h1:C8z8SBGDWWB0lemExr/P6WAbMFD4L1w6rpf61OU/RmY= go.unistack.org/micro/v3 v3.10.81 h1:zHttMUEwL/f9GtrNAQOk8bK0NrEwAuKeUW8DEoywgJI=
go.unistack.org/micro/v3 v3.10.73/go.mod h1:erMgt3Bl7vQQ0e9UpQyR5NlLiZ9pKeEJ9+1tfYFaqUg= 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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -3,14 +3,13 @@ package opentracing
import ( import (
"context" "context"
"errors" "errors"
"fmt" "strings"
ot "github.com/opentracing/opentracing-go" ot "github.com/opentracing/opentracing-go"
otlog "github.com/opentracing/opentracing-go/log" otlog "github.com/opentracing/opentracing-go/log"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
"go.unistack.org/micro/v3/metadata" "go.unistack.org/micro/v3/metadata"
"go.unistack.org/micro/v3/tracer" "go.unistack.org/micro/v3/tracer"
rutil "go.unistack.org/micro/v3/util/reflect"
) )
var _ tracer.Tracer = &otTracer{} var _ tracer.Tracer = &otTracer{}
@@ -42,13 +41,27 @@ func (t *otTracer) Init(opts ...tracer.Option) error {
return nil return nil
} }
type spanContext interface { type otSpanContext interface {
TraceID() idStringer
SpanID() idStringer
}
type jSpanContext interface {
TraceID() idStringer TraceID() idStringer
SpanID() idStringer SpanID() idStringer
} }
func (t *otTracer) Start(ctx context.Context, name string, opts ...tracer.SpanOption) (context.Context, tracer.Span) { func (t *otTracer) Start(ctx context.Context, name string, opts ...tracer.SpanOption) (context.Context, tracer.Span) {
options := tracer.NewSpanOptions(opts...) 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 var span ot.Span
switch options.Kind { switch options.Kind {
case tracer.SpanKindUnspecified: case tracer.SpanKindUnspecified:
@@ -64,18 +77,41 @@ func (t *otTracer) Start(ctx context.Context, name string, opts ...tracer.SpanOp
sp := &otSpan{span: span, opts: options} sp := &otSpan{span: span, opts: options}
spctx := span.Context() spctx := span.Context()
if v, ok := spctx.(spanContext); ok {
sp.traceID = v.TraceID().String() var traceID, spanID, parentID string
sp.spanID = v.SpanID().String()
if v, ok := spctx.(otSpanContext); ok {
traceID = v.TraceID().String()
spanID = v.SpanID().String()
} else { } else {
if val, err := rutil.StructFieldByName(spctx, "TraceID"); err == nil { carrier := make(map[string]string, 1)
sp.traceID = fmt.Sprintf("%v", val) _ = span.Tracer().Inject(spctx, ot.TextMap, ot.TextMapCarrier(carrier))
} for k, v := range carrier {
if val, err := rutil.StructFieldByName(spctx, "SpanID"); err == nil { switch k {
sp.spanID = fmt.Sprintf("%v", val) 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 return tracer.NewSpanContext(ctx, sp), sp
} }
@@ -91,10 +127,12 @@ type otSpan struct {
span ot.Span span ot.Span
spanID string spanID string
traceID string traceID string
parentID string
opts tracer.SpanOptions opts tracer.SpanOptions
status tracer.SpanStatus status tracer.SpanStatus
statusMsg string statusMsg string
labels []interface{} labels []interface{}
finished bool
} }
func (os *otSpan) TraceID() string { func (os *otSpan) TraceID() string {
@@ -105,6 +143,10 @@ func (os *otSpan) SpanID() string {
return os.spanID return os.spanID
} }
func (os *otSpan) ParentID() string {
return os.parentID
}
func (os *otSpan) SetStatus(st tracer.SpanStatus, msg string) { func (os *otSpan) SetStatus(st tracer.SpanStatus, msg string) {
os.status = st os.status = st
os.statusMsg = msg os.statusMsg = msg
@@ -119,7 +161,16 @@ func (os *otSpan) Tracer() tracer.Tracer {
} }
func (os *otSpan) Finish(opts ...tracer.SpanOption) { func (os *otSpan) Finish(opts ...tracer.SpanOption) {
if os.finished {
return
}
options := os.opts options := os.opts
options.Status = os.status
options.StatusMsg = os.statusMsg
options.Labels = append(options.Labels, os.labels...)
for _, o := range opts { for _, o := range opts {
o(&options) o(&options)
} }
@@ -128,6 +179,10 @@ func (os *otSpan) Finish(opts ...tracer.SpanOption) {
return return
} }
if len(options.Labels)%2 != 0 {
options.Labels = options.Labels[:len(options.Labels)-1]
}
l := len(options.Labels) l := len(options.Labels)
for idx := 0; idx < l; idx++ { for idx := 0; idx < l; idx++ {
switch lt := options.Labels[idx].(type) { switch lt := options.Labels[idx].(type) {
@@ -141,12 +196,15 @@ func (os *otSpan) Finish(opts ...tracer.SpanOption) {
} }
} }
if os.status == tracer.SpanStatusError { if options.Status == tracer.SpanStatusError {
os.span.SetTag("error", true) os.span.SetTag("error", true)
os.span.LogKV("error", os.statusMsg) os.span.LogKV("error", options.StatusMsg)
} }
os.span.SetTag("span.kind", options.Kind) os.span.SetTag("span.kind", options.Kind)
os.span.Finish() os.span.Finish()
os.finished = true
} }
func (os *otSpan) AddEvent(name string, opts ...tracer.EventOption) { func (os *otSpan) AddEvent(name string, opts ...tracer.EventOption) {

View File

@@ -2,14 +2,17 @@ package opentracing
import ( import (
"context" "context"
"fmt"
"testing" "testing"
"github.com/opentracing/opentracing-go/mocktracer" "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/metadata"
"go.unistack.org/micro/v3/tracer" "go.unistack.org/micro/v3/tracer"
) )
func TestTraceID(t *testing.T) { func TestNoopTraceID(t *testing.T) {
md := metadata.New(1) md := metadata.New(1)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
@@ -29,8 +32,62 @@ func TestTraceID(t *testing.T) {
if v := sp.SpanID(); v != "44" { if v := sp.SpanID(); v != "44" {
t.Fatalf("invalid span span id %#+v", v) 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) { func TestTraceTags(t *testing.T) {
md := metadata.New(1) md := metadata.New(1)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
@@ -46,8 +103,15 @@ func TestTraceTags(t *testing.T) {
var sp tracer.Span var sp tracer.Span
ctx, sp = tr.Start(ctx, "test", tracer.WithSpanLabels("key", "val", "odd")) ctx, sp = tr.Start(ctx, "test", tracer.WithSpanLabels("key", "val", "odd"))
sp.Finish() sp.Finish(tracer.WithSpanLabels("xkey", "xval"))
_ = ctx
msp := mtr.FinishedSpans()[0] msp := mtr.FinishedSpans()[0]
t.Logf("mock span %#+v", msp.Tags())
if "val" != fmt.Sprintf("%v", msp.Tags()["key"]) {
t.Fatal("mock span invalid")
}
if "xval" != fmt.Sprintf("%v", msp.Tags()["xkey"]) {
t.Fatalf("mock span invalid %#+v", msp)
}
} }