@@ -152,65 +152,6 @@ type annotationAnalysisResult struct {
152152 gcEvents []* trace.Event // GCStartevents, sorted
153153}
154154
155- type activeSpanTracker struct {
156- stacks map [uint64 ][]* trace.Event // goid to stack of active span start events
157- }
158-
159- func (t * activeSpanTracker ) top (goid uint64 ) * trace.Event {
160- if t .stacks == nil {
161- return nil
162- }
163- stk := t .stacks [goid ]
164- if len (stk ) == 0 {
165- return nil
166- }
167- return stk [len (stk )- 1 ]
168- }
169-
170- func (t * activeSpanTracker ) addSpanEvent (ev * trace.Event , task * taskDesc ) * spanDesc {
171- if ev .Type != trace .EvUserSpan {
172- return nil
173- }
174- if t .stacks == nil {
175- t .stacks = make (map [uint64 ][]* trace.Event )
176- }
177-
178- goid := ev .G
179- stk := t .stacks [goid ]
180-
181- var sd * spanDesc
182- switch mode := ev .Args [1 ]; mode {
183- case 0 : // span start
184- t .stacks [goid ] = append (stk , ev ) // push
185- sd = & spanDesc {
186- name : ev .SArgs [0 ],
187- task : task ,
188- goid : goid ,
189- start : ev ,
190- end : ev .Link ,
191- }
192- case 1 : // span end
193- if n := len (stk ); n > 0 {
194- stk = stk [:n - 1 ] // pop
195- } else {
196- // There is no matching span start event; can happen if the span start was before tracing.
197- sd = & spanDesc {
198- name : ev .SArgs [0 ],
199- task : task ,
200- goid : goid ,
201- start : nil ,
202- end : ev ,
203- }
204- }
205- if len (stk ) == 0 {
206- delete (t .stacks , goid )
207- } else {
208- t .stacks [goid ] = stk
209- }
210- }
211- return sd
212- }
213-
214155// analyzeAnnotations analyzes user annotation events and
215156// returns the task descriptors keyed by internal task id.
216157func analyzeAnnotations () (annotationAnalysisResult , error ) {
@@ -225,14 +166,14 @@ func analyzeAnnotations() (annotationAnalysisResult, error) {
225166 }
226167
227168 tasks := allTasks {}
169+ activeSpans := map [uint64 ][]* trace.Event {} // goid to active span start events
228170 var gcEvents []* trace.Event
229- var activeSpans activeSpanTracker
230171
231172 for _ , ev := range events {
232173 goid := ev .G
233174
234175 switch typ := ev .Type ; typ {
235- case trace .EvUserTaskCreate , trace .EvUserTaskEnd , trace .EvUserLog :
176+ case trace .EvUserTaskCreate , trace .EvUserTaskEnd , trace .EvUserLog , trace . EvUserSpan :
236177 taskid := ev .Args [0 ]
237178 task := tasks .task (taskid )
238179 task .addEvent (ev )
@@ -248,13 +189,18 @@ func analyzeAnnotations() (annotationAnalysisResult, error) {
248189 }
249190 }
250191
251- case trace .EvUserSpan :
252- taskid := ev .Args [0 ]
253- task := tasks .task (taskid )
254- task .addEvent (ev )
255- sd := activeSpans .addSpanEvent (ev , task )
256- if task != nil && sd != nil {
257- task .spans = append (task .spans , sd )
192+ if typ == trace .EvUserSpan {
193+ mode := ev .Args [1 ]
194+ spans := activeSpans [goid ]
195+ if mode == 0 { // start
196+ activeSpans [goid ] = append (spans , ev ) // push
197+ } else { // end
198+ if n := len (spans ); n > 1 {
199+ activeSpans [goid ] = spans [:n - 1 ] // pop
200+ } else if n == 1 {
201+ delete (activeSpans , goid )
202+ }
203+ }
258204 }
259205
260206 case trace .EvGoCreate :
@@ -263,11 +209,11 @@ func analyzeAnnotations() (annotationAnalysisResult, error) {
263209 //
264210 // TODO(hyangah): the task info needs to propagate
265211 // to all decendents, not only to the immediate child.
266- s := activeSpans . top ( goid )
267- if s == nil {
212+ spans := activeSpans [ goid ]
213+ if len ( spans ) == 0 {
268214 continue
269215 }
270- taskid := s .Args [0 ]
216+ taskid := spans [ len ( spans ) - 1 ] .Args [0 ]
271217 task := tasks .task (taskid )
272218 task .addEvent (ev )
273219
@@ -380,6 +326,21 @@ func (task *taskDesc) addEvent(ev *trace.Event) {
380326 task .create = ev
381327 case trace .EvUserTaskEnd :
382328 task .end = ev
329+ case trace .EvUserSpan :
330+ if mode := ev .Args [1 ]; mode == 0 { // start
331+ task .spans = append (task .spans , & spanDesc {
332+ name : ev .SArgs [0 ],
333+ task : task ,
334+ goid : ev .G ,
335+ start : ev ,
336+ end : ev .Link })
337+ } else if ev .Link == nil { // span end without matching start
338+ task .spans = append (task .spans , & spanDesc {
339+ name : ev .SArgs [0 ],
340+ task : task ,
341+ goid : ev .G ,
342+ end : ev })
343+ }
383344 }
384345}
385346
0 commit comments