@@ -114,6 +114,11 @@ func BeginSegmentWithSampling(ctx context.Context, name string, r *http.Request,
114
114
}()
115
115
}
116
116
117
+ // check whether segment is dummy or not based on sampling decision
118
+ if ! seg .ParentSegment .Sampled {
119
+ seg .Dummy = true
120
+ }
121
+
117
122
return context .WithValue (ctx , ContextKey , seg ), seg
118
123
}
119
124
@@ -131,6 +136,7 @@ func basicSegment(name string, h *header.Header) *Segment {
131
136
seg .Name = name
132
137
seg .StartTime = float64 (time .Now ().UnixNano ()) / float64 (time .Second )
133
138
seg .InProgress = true
139
+ seg .Dummy = false
134
140
135
141
if h == nil {
136
142
seg .TraceID = NewTraceID ()
@@ -228,6 +234,11 @@ func BeginSubsegment(ctx context.Context, name string) (context.Context, *Segmen
228
234
229
235
seg .ParentSegment = parent .ParentSegment
230
236
237
+ // check whether segment is dummy or not based on sampling decision
238
+ if ! seg .ParentSegment .Sampled {
239
+ seg .Dummy = true
240
+ }
241
+
231
242
atomic .AddUint32 (& seg .ParentSegment .totalSubSegments , 1 )
232
243
233
244
parent .Lock ()
@@ -274,6 +285,12 @@ func (seg *Segment) Close(err error) {
274
285
if err != nil {
275
286
seg .addError (err )
276
287
}
288
+
289
+ // If segment is dummy we return
290
+ if seg .Dummy {
291
+ return
292
+ }
293
+
277
294
seg .Unlock ()
278
295
seg .send ()
279
296
}
@@ -297,6 +314,11 @@ func (seg *Segment) CloseAndStream(err error) {
297
314
seg .addError (err )
298
315
}
299
316
317
+ // If segment is dummy we return
318
+ if seg .Dummy {
319
+ return
320
+ }
321
+
300
322
seg .beforeEmitSubsegment (seg .parent )
301
323
seg .emit ()
302
324
}
@@ -449,15 +471,20 @@ func (seg *Segment) beforeEmitSubsegment(s *Segment) {
449
471
450
472
// AddAnnotation allows adding an annotation to the segment.
451
473
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
+
452
482
switch value .(type ) {
453
483
case bool , int , uint , float32 , float64 , string :
454
484
default :
455
485
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 )
456
486
}
457
487
458
- seg .Lock ()
459
- defer seg .Unlock ()
460
-
461
488
if seg .Annotations == nil {
462
489
seg .Annotations = map [string ]interface {}{}
463
490
}
@@ -470,6 +497,11 @@ func (seg *Segment) AddMetadata(key string, value interface{}) error {
470
497
seg .Lock ()
471
498
defer seg .Unlock ()
472
499
500
+ // If segment is dummy we return
501
+ if seg .Dummy {
502
+ return nil
503
+ }
504
+
473
505
if seg .Metadata == nil {
474
506
seg .Metadata = map [string ]map [string ]interface {}{}
475
507
}
@@ -485,6 +517,11 @@ func (seg *Segment) AddMetadataToNamespace(namespace string, key string, value i
485
517
seg .Lock ()
486
518
defer seg .Unlock ()
487
519
520
+ // If segment is dummy we return
521
+ if seg .Dummy {
522
+ return nil
523
+ }
524
+
488
525
if seg .Metadata == nil {
489
526
seg .Metadata = map [string ]map [string ]interface {}{}
490
527
}
0 commit comments