Skip to content

Commit 886d3aa

Browse files
authored
Dummy flag to reduce operations on non sampled traces (#194)
* DummySegment and DummySubSegment creation * Revert "DummySegment and DummySubSegment creation" This reverts commit 4edb4b5. * Revert "Revert "DummySegment and DummySubSegment creation"" This reverts commit 0442d84. * ran gofmt command to remove golint warnings * remove redundent declaration * Added Dummysegment creation logic * Added reviewdog suggestions * modified code based on feedback * New Implementation of Dummy Segment and Subsegments * Remove unnecessary code * Review changes * removed isDummy method * Added return statement end of the block
1 parent 5667f5b commit 886d3aa

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

xray/segment.go

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ func BeginSegmentWithSampling(ctx context.Context, name string, r *http.Request,
114114
}()
115115
}
116116

117+
// check whether segment is dummy or not based on sampling decision
118+
if !seg.ParentSegment.Sampled {
119+
seg.Dummy = true
120+
}
121+
117122
return context.WithValue(ctx, ContextKey, seg), seg
118123
}
119124

@@ -131,6 +136,7 @@ func basicSegment(name string, h *header.Header) *Segment {
131136
seg.Name = name
132137
seg.StartTime = float64(time.Now().UnixNano()) / float64(time.Second)
133138
seg.InProgress = true
139+
seg.Dummy = false
134140

135141
if h == nil {
136142
seg.TraceID = NewTraceID()
@@ -228,6 +234,11 @@ func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segmen
228234

229235
seg.ParentSegment = parent.ParentSegment
230236

237+
// check whether segment is dummy or not based on sampling decision
238+
if !seg.ParentSegment.Sampled {
239+
seg.Dummy = true
240+
}
241+
231242
atomic.AddUint32(&seg.ParentSegment.totalSubSegments, 1)
232243

233244
parent.Lock()
@@ -274,6 +285,12 @@ func (seg *Segment) Close(err error) {
274285
if err != nil {
275286
seg.addError(err)
276287
}
288+
289+
// If segment is dummy we return
290+
if seg.Dummy {
291+
return
292+
}
293+
277294
seg.Unlock()
278295
seg.send()
279296
}
@@ -297,6 +314,11 @@ func (seg *Segment) CloseAndStream(err error) {
297314
seg.addError(err)
298315
}
299316

317+
// If segment is dummy we return
318+
if seg.Dummy {
319+
return
320+
}
321+
300322
seg.beforeEmitSubsegment(seg.parent)
301323
seg.emit()
302324
}
@@ -449,15 +471,20 @@ func (seg *Segment) beforeEmitSubsegment(s *Segment) {
449471

450472
// AddAnnotation allows adding an annotation to the segment.
451473
func (seg *Segment) AddAnnotation(key string, value interface{}) error {
474+
seg.Lock()
475+
defer seg.Unlock()
476+
477+
// If segment is dummy we return
478+
if seg.Dummy {
479+
return nil
480+
}
481+
452482
switch value.(type) {
453483
case bool, int, uint, float32, float64, string:
454484
default:
455485
return fmt.Errorf("failed to add annotation key: %q value: %q to subsegment %q. value must be of type string, number or boolean", key, value, seg.Name)
456486
}
457487

458-
seg.Lock()
459-
defer seg.Unlock()
460-
461488
if seg.Annotations == nil {
462489
seg.Annotations = map[string]interface{}{}
463490
}
@@ -470,6 +497,11 @@ func (seg *Segment) AddMetadata(key string, value interface{}) error {
470497
seg.Lock()
471498
defer seg.Unlock()
472499

500+
// If segment is dummy we return
501+
if seg.Dummy {
502+
return nil
503+
}
504+
473505
if seg.Metadata == nil {
474506
seg.Metadata = map[string]map[string]interface{}{}
475507
}
@@ -485,6 +517,11 @@ func (seg *Segment) AddMetadataToNamespace(namespace string, key string, value i
485517
seg.Lock()
486518
defer seg.Unlock()
487519

520+
// If segment is dummy we return
521+
if seg.Dummy {
522+
return nil
523+
}
524+
488525
if seg.Metadata == nil {
489526
seg.Metadata = map[string]map[string]interface{}{}
490527
}

xray/segment_model.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ type Segment struct {
7373

7474
// Lambda
7575
Facade bool `json:"-"`
76+
77+
// Dummy Segment flag
78+
Dummy bool
7679
}
7780

7881
// CauseData provides the shape for unmarshalling data that records exception.

xray/segment_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,19 @@ func TestParentSegmentTotalCount(t *testing.T) {
144144
assert.Equal(t, 4*uint32(n), seg.ParentSegment.totalSubSegments, "totalSubSegments count should be correctly registered on the parent segment")
145145
}
146146

147+
func TestSegment_isDummy(t *testing.T) {
148+
ctx, root := BeginSegment(context.Background(), "Segment")
149+
ctxSubSeg1, subSeg1 := BeginSubsegment(ctx, "Subegment1")
150+
_, subSeg2 := BeginSubsegment(ctxSubSeg1, "Subsegment2")
151+
subSeg2.Close(nil)
152+
subSeg1.Close(nil)
153+
root.Close(nil)
154+
155+
assert.False(t, root.Dummy)
156+
assert.False(t, subSeg1.Dummy)
157+
assert.False(t, subSeg2.Dummy)
158+
}
159+
147160
// Benchmarks
148161
func BenchmarkBeginSegment(b *testing.B) {
149162
ctx, td := NewTestDaemon()

0 commit comments

Comments
 (0)