Skip to content

Commit 6071f7d

Browse files
authored
refactor: logger with tid & improve open tracing in metadata (#651)
1 parent d4c8685 commit 6071f7d

9 files changed

Lines changed: 168 additions & 196 deletions

File tree

core/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func TestFrameRoundTrip(t *testing.T) {
129129
exited = checkClientExited(sfn, time.Second)
130130
assert.False(t, exited, "sfn stream should not exited")
131131

132-
sfnMd := NewDefaultMetadata(source.clientID, "sfn-tid", "sfn-sid", false)
132+
sfnMd := NewMetadata(source.clientID, "tid", "trace-id", "span-id", false)
133133

134134
sfnMetaBytes, _ := sfnMd.Encode()
135135

@@ -152,7 +152,7 @@ func TestFrameRoundTrip(t *testing.T) {
152152
assert.ElementsMatch(t, nameList, []string{"source", "sfn-1"})
153153

154154
md := metadata.New(
155-
NewDefaultMetadata(source.clientID, "tid", "sid", false),
155+
NewMetadata(source.clientID, "tid", "trace-id", "span-id", false),
156156
metadata.M{
157157
"foo": "bar",
158158
},

core/context.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ func (c *Context) WithFrame(f frame.Frame) error {
132132
c.Frame = df
133133
c.FrameMetadata = fmd
134134

135+
// log with tid
136+
c.Logger = c.BaseLogger.With("tid", GetTIDFromMetadata(fmd))
137+
135138
return nil
136139
}
137140

core/metadata.go

Lines changed: 125 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,31 @@ package core
22

33
import (
44
"github.com/yomorun/yomo/core/metadata"
5+
"github.com/yomorun/yomo/pkg/id"
6+
"github.com/yomorun/yomo/pkg/trace"
7+
oteltrace "go.opentelemetry.io/otel/trace"
8+
"golang.org/x/exp/slog"
59
)
610

711
const (
12+
// the keys for yomo working.
813
MetadataSourceIDKey = "yomo-source-id"
914
MetadataTIDKey = "yomo-tid"
10-
MetadataSIDKey = "yomo-sid"
11-
MetaTraced = "yomo-traced"
15+
16+
// the keys for tracing.
17+
MetadataTraceIDKey = "yomo-trace-id"
18+
MetadataSpanIDKey = "yomo-span-id"
19+
MetaTracedKey = "yomo-traced"
1220
)
1321

14-
// NewDefaultMetadata returns a default metadata.
15-
func NewDefaultMetadata(sourceID string, tid string, sid string, traced bool) metadata.M {
16-
tracedString := "false"
17-
if traced {
18-
tracedString = "true"
19-
}
22+
// NewMetadata returns metadata for yomo working.
23+
func NewMetadata(sourceID, tid string, traceID string, spanID string, traced bool) metadata.M {
2024
return metadata.M{
2125
MetadataSourceIDKey: sourceID,
2226
MetadataTIDKey: tid,
23-
MetadataSIDKey: sid,
24-
MetaTraced: tracedString,
27+
MetadataTraceIDKey: traceID,
28+
MetadataSpanIDKey: spanID,
29+
MetaTracedKey: tracedString(traced),
2530
}
2631
}
2732

@@ -37,33 +42,124 @@ func GetTIDFromMetadata(m metadata.M) string {
3742
return tid
3843
}
3944

40-
// GetSIDFromMetadata gets SID from metadata.
41-
func GetSIDFromMetadata(m metadata.M) string {
42-
sid, _ := m.Get(MetadataSIDKey)
43-
return sid
44-
}
45-
4645
// GetTracedFromMetadata gets traced from metadata.
4746
func GetTracedFromMetadata(m metadata.M) bool {
48-
traced, _ := m.Get(MetaTraced)
49-
return traced == "true"
47+
tracedString, _ := m.Get(MetaTracedKey)
48+
return tracedString == "true"
49+
}
50+
51+
// SourceMetadata generates source metadata with trace information.
52+
func SourceMetadata(
53+
sourceID, tid string,
54+
spanName string, // the span name usually is the source name.
55+
tp oteltrace.TracerProvider, logger *slog.Logger,
56+
) (metadata.M, func()) {
57+
var (
58+
traceID string
59+
spanID string
60+
traced bool
61+
endFn = func() {}
62+
)
63+
if tp != nil {
64+
span, err := trace.NewSpan(tp, "Source", spanName, "", "")
65+
if err != nil {
66+
logger.Debug("trace error", "tracer_name", "Source", "span_name", spanName, "err", err)
67+
} else {
68+
endFn = func() { span.End() }
69+
traceID = span.SpanContext().TraceID().String()
70+
spanID = span.SpanContext().SpanID().String()
71+
traced = true
72+
}
73+
}
74+
if traceID == "" {
75+
logger.Debug("create new traceID", "tracer_name", "Source", "span_name", spanName, "trace_id", traceID)
76+
traceID = id.NewTraceID()
77+
}
78+
if spanID == "" {
79+
logger.Debug("create new spanID", "tracer_name", "Source", "span_name", spanName, "span_id", spanID)
80+
spanID = id.NewSpanID()
81+
}
82+
logger.Debug(
83+
"trace metadata",
84+
"tracer_name", "Source", "span_name", spanName,
85+
"trace_id", traceID, "span_id", spanID, "traced", traced,
86+
)
87+
md := NewMetadata(sourceID, id.New(), traceID, spanID, traced)
88+
89+
return md, endFn
90+
}
91+
92+
// ExtendTraceMetadata extends source metadata with trace information.
93+
func ExtendTraceMetadata(
94+
md metadata.M,
95+
tracerName string, // the tracer name is `StreamFunction` or `Zipper`.
96+
spanName string, // the span name usually is the sfn name.
97+
tp oteltrace.TracerProvider, logger *slog.Logger,
98+
) (metadata.M, func()) {
99+
var (
100+
traceID, _ = md.Get(MetadataTraceIDKey)
101+
spanID, _ = md.Get(MetadataSpanIDKey)
102+
parentTraced = GetTracedFromMetadata(md)
103+
endFn = func() {}
104+
)
105+
traced := false
106+
if tp != nil {
107+
var span oteltrace.Span
108+
var err error
109+
// set parent span, if not traced, use empty string
110+
if parentTraced {
111+
span, err = trace.NewSpan(tp, string(tracerName), spanName, traceID, spanID)
112+
} else {
113+
span, err = trace.NewSpan(tp, string(tracerName), spanName, "", "")
114+
}
115+
if err != nil {
116+
logger.Debug("trace error", "tracer_name", tracerName, "span_name", spanName, "err", err)
117+
} else {
118+
endFn = func() { span.End() }
119+
traceID = span.SpanContext().TraceID().String()
120+
spanID = span.SpanContext().SpanID().String()
121+
traced = true
122+
}
123+
}
124+
if traceID == "" {
125+
logger.Debug("create new traceID", "tracer_name", tracerName, "span_name", spanName, "trace_id", traceID)
126+
traceID = id.NewTraceID()
127+
}
128+
if spanID == "" {
129+
logger.Debug("create new spanID", "tracer_name", tracerName, "span_name", spanName, "span_id", spanID)
130+
spanID = id.NewSpanID()
131+
}
132+
logger.Debug(
133+
"trace metadata",
134+
"tracer_name", tracerName, "span_name", spanName,
135+
"trace_id", traceID, "span_id", spanID, "traced", traced, "parent_traced", parentTraced,
136+
)
137+
138+
if tracerName == "Zipper" {
139+
traced = traced || parentTraced
140+
}
141+
142+
// reallocate metadata with new TraceID and SpanID
143+
md.Set(MetadataTraceIDKey, traceID)
144+
md.Set(MetadataSpanIDKey, spanID)
145+
md.Set(MetaTracedKey, tracedString(traced))
146+
147+
return md, endFn
50148
}
51149

52-
// SetTIDToMetadata sets tid to metadata.
53-
func SetTIDToMetadata(m metadata.M, tid string) {
54-
m.Set(MetadataTIDKey, tid)
150+
// SfnTraceMetadata extends metadata for StreamFunction.
151+
func SfnTraceMetadata(md metadata.M, sfnName string, tp oteltrace.TracerProvider, logger *slog.Logger) (metadata.M, func()) {
152+
return ExtendTraceMetadata(md, "StreamFunction", sfnName, tp, logger)
55153
}
56154

57-
// SetSIDToMetadata sets sid to metadata.
58-
func SetSIDToMetadata(m metadata.M, sid string) {
59-
m.Set(MetadataSIDKey, sid)
155+
// ZipperTraceMetadata extends metadata for Zipper.
156+
func ZipperTraceMetadata(md metadata.M, tp oteltrace.TracerProvider, logger *slog.Logger) (metadata.M, func()) {
157+
return ExtendTraceMetadata(md, "Zipper", "zipper endpoint", tp, logger)
60158
}
61159

62-
// SetTracedToMetadata sets traced to metadata.
63-
func SetTracedToMetadata(m metadata.M, traced bool) {
64-
tracedString := "false"
160+
func tracedString(traced bool) string {
65161
if traced {
66-
tracedString = "true"
162+
return "true"
67163
}
68-
m.Set(MetaTraced, tracedString)
164+
return "false"
69165
}

core/metadata_test.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,9 @@ import (
77
)
88

99
func TestMetadata(t *testing.T) {
10-
md := NewDefaultMetadata("source", "xxxxxxx", "sssssss", true)
10+
md := NewMetadata("source", "tid", "traceID", "spanID", true)
1111

1212
assert.Equal(t, "source", GetSourceIDFromMetadata(md))
13-
assert.Equal(t, "xxxxxxx", GetTIDFromMetadata(md))
14-
assert.Equal(t, "sssssss", GetSIDFromMetadata(md))
13+
assert.Equal(t, "tid", GetTIDFromMetadata(md))
1514
assert.Equal(t, true, GetTracedFromMetadata(md))
16-
17-
SetTIDToMetadata(md, "ccccccc")
18-
assert.Equal(t, "ccccccc", GetTIDFromMetadata(md))
19-
20-
SetSIDToMetadata(md, "aaaaaaa")
21-
assert.Equal(t, "aaaaaaa", GetSIDFromMetadata(md))
22-
23-
SetTracedToMetadata(md, false)
24-
assert.Equal(t, false, GetTracedFromMetadata(md))
2515
}

core/server.go

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ import (
2020
// authentication implements, Currently, only token authentication is implemented
2121
_ "github.com/yomorun/yomo/pkg/auth"
2222
"github.com/yomorun/yomo/pkg/frame-codec/y3codec"
23-
"github.com/yomorun/yomo/pkg/id"
2423
pkgtls "github.com/yomorun/yomo/pkg/tls"
25-
"github.com/yomorun/yomo/pkg/trace"
2624
oteltrace "go.opentelemetry.io/otel/trace"
2725
)
2826

@@ -345,51 +343,18 @@ func (s *Server) handleDataFrame(c *Context) error {
345343
// counter +1
346344
atomic.AddInt64(&s.counterOfDataFrame, 1)
347345

348-
from := c.Connection
349-
tid := GetTIDFromMetadata(c.FrameMetadata)
350-
sid := GetSIDFromMetadata(c.FrameMetadata)
351-
parentTraced := GetTracedFromMetadata(c.FrameMetadata)
352-
traced := false
353-
// trace
354-
tp := s.TracerProvider()
355-
if tp != nil {
356-
// create span
357-
var span oteltrace.Span
358-
var err error
359-
// set parent span, if not traced, use empty string
360-
if parentTraced {
361-
span, err = trace.NewSpan(tp, "zipper", "handle DataFrame", tid, sid)
362-
} else {
363-
span, err = trace.NewSpan(tp, "zipper", "handle DataFrame", "", "")
364-
}
365-
if err != nil {
366-
s.logger.Error("zipper trace error", "err", err)
367-
} else {
368-
defer span.End()
369-
tid = span.SpanContext().TraceID().String()
370-
sid = span.SpanContext().SpanID().String()
371-
traced = true
372-
}
373-
}
374-
if tid == "" {
375-
s.logger.Debug("zipper create new tid")
376-
tid = id.TID()
377-
}
378-
if sid == "" {
379-
s.logger.Debug("zipper create new sid")
380-
sid = id.SID()
381-
}
382-
// reallocate metadata with new TID and SID
383-
SetTIDToMetadata(c.FrameMetadata, tid)
384-
SetSIDToMetadata(c.FrameMetadata, sid)
385-
SetTracedToMetadata(c.FrameMetadata, traced || parentTraced)
386-
md, err := c.FrameMetadata.Encode()
346+
md, endFn := ZipperTraceMetadata(c.FrameMetadata, s.TracerProvider(), c.Logger)
347+
defer endFn()
348+
349+
c.FrameMetadata = md
350+
351+
mdBytes, err := c.FrameMetadata.Encode()
387352
if err != nil {
388-
s.logger.Error("encode metadata error", "err", err)
353+
c.Logger.Error("encode metadata error", "err", err)
389354
return err
390355
}
391-
dataFrame.Metadata = md
392-
s.logger.Debug("zipper metadata", "tid", tid, "sid", sid, "parentTraced", parentTraced, "traced", traced, "frome_stream_name", from.Name())
356+
dataFrame.Metadata = mdBytes
357+
393358
// route
394359
route := s.router.Route(c.FrameMetadata)
395360
if route == nil {
@@ -415,7 +380,7 @@ func (s *Server) handleDataFrame(c *Context) error {
415380
continue
416381
}
417382

418-
c.Logger.Info("data routing", "tid", tid, "sid", sid, "tag", dataFrame.Tag, "data_length", data_length, "to_id", toID, "to_name", stream.Name())
383+
c.Logger.Info("data routing", "tag", dataFrame.Tag, "data_length", data_length, "to_id", toID, "to_name", stream.Name())
419384

420385
// write data frame to stream
421386
if err := stream.WriteFrame(dataFrame); err != nil {
@@ -512,10 +477,6 @@ func (s *Server) dispatchToDownstreams(c *Context) {
512477
return
513478
}
514479

515-
var (
516-
tid = GetTIDFromMetadata(c.FrameMetadata)
517-
sid = GetSIDFromMetadata(c.FrameMetadata)
518-
)
519480
mdBytes, err := c.FrameMetadata.Encode()
520481
if err != nil {
521482
c.Logger.Error("failed to dispatch to downstream", "err", err)
@@ -526,9 +487,9 @@ func (s *Server) dispatchToDownstreams(c *Context) {
526487
for _, ds := range s.downstreams {
527488
c.Logger.Info(
528489
"dispatching to downstream",
529-
"tid", tid, "sid", sid, "tag", dataFrame.Tag, "data_length", len(dataFrame.Payload),
530-
"downstream_id", ds.ID(), "downstream_name", ds.LocalName(),
531-
)
490+
"tag", dataFrame.Tag, "data_length", len(dataFrame.Payload),
491+
"downstream_id", ds.ID(), "downstream_name", ds.LocalName())
492+
532493
_ = ds.WriteFrame(dataFrame)
533494
}
534495
}

pkg/id/id.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ func New(l ...int) string {
1919
return tid
2020
}
2121

22-
// TID generate trace id.
23-
func TID() string {
22+
// NewTraceID returns a trace id.
23+
func NewTraceID() string {
2424
bytes := make([]byte, 16)
2525
if _, err := rand.Read(bytes); err != nil {
2626
return ""
2727
}
2828
return hex.EncodeToString(bytes)
2929
}
3030

31-
// SID generate span id.
32-
func SID() string {
31+
// NewSpanID returns a span id.
32+
func NewSpanID() string {
3333
bytes := make([]byte, 8)
3434
if _, err := rand.Read(bytes); err != nil {
3535
return ""

pkg/id/id_test.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,20 @@ import (
77
)
88

99
func TestNew(t *testing.T) {
10-
str := New()
11-
assert.IsType(t, "", str)
10+
t.Run("new a random id", func(t *testing.T) {
11+
str := New()
12+
assert.IsType(t, "", str)
13+
})
1214

13-
tid := TID()
14-
assert.IsType(t, "", tid)
15-
assert.Equal(t, 32, len(tid))
15+
t.Run("new trace id", func(t *testing.T) {
16+
traceID := NewTraceID()
17+
assert.IsType(t, "", traceID)
18+
assert.Equal(t, 32, len(traceID))
19+
})
1620

17-
sid := SID()
18-
assert.IsType(t, "", sid)
19-
assert.Equal(t, 16, len(sid))
21+
t.Run("new span id", func(t *testing.T) {
22+
spanID := NewSpanID()
23+
assert.IsType(t, "", spanID)
24+
assert.Equal(t, 16, len(spanID))
25+
})
2026
}

0 commit comments

Comments
 (0)