@@ -2,26 +2,31 @@ package core
22
33import (
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
711const (
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.
4746func 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}
0 commit comments