@@ -18,14 +18,14 @@ package kamon
18
18
package trace
19
19
20
20
import java .time .{Duration , Instant }
21
-
22
21
import kamon .context .Context
23
22
import kamon .tag .TagSet
24
23
import kamon .trace .Span .Link
25
24
import kamon .trace .Trace .SamplingDecision
26
25
import kamon .util .Clock
27
26
import org .slf4j .LoggerFactory
28
27
28
+ import java .util .concurrent .{ScheduledExecutorService , TimeUnit }
29
29
import scala .compat .Platform .EOL
30
30
31
31
/**
@@ -410,7 +410,7 @@ object Span {
410
410
val kind : Kind , localParent : Option [Span ], initialOperationName : String , spanTags : TagSet .Builder , metricTags : TagSet .Builder ,
411
411
createdAt : Instant , initialMarks : List [Mark ], initialLinks : List [Link ], initialTrackMetrics : Boolean , tagWithParentOperation : Boolean ,
412
412
includeErrorStacktrace : Boolean , isDelayed : Boolean , clock : Clock , preFinishHooks : Array [Tracer .PreFinishHook ],
413
- onFinish : Span .Finished => Unit , sampler : Sampler ) extends Span .Delayed {
413
+ onFinish : Span .Finished => Unit , sampler : Sampler , scheduler : ScheduledExecutorService , reportingDelay : Duration ) extends Span .Delayed {
414
414
415
415
private val _metricTags = metricTags
416
416
private val _spanTags = spanTags
@@ -440,25 +440,25 @@ object Span {
440
440
}
441
441
442
442
override def tag (key : String , value : String ): Span = synchronized {
443
- if (isSampled && _isOpen)
443
+ if (( isSampled || ! reportingDelay.isZero) && _isOpen)
444
444
_spanTags.add(key, value)
445
445
this
446
446
}
447
447
448
448
override def tag (key : String , value : Long ): Span = synchronized {
449
- if (isSampled && _isOpen)
449
+ if (( isSampled || ! reportingDelay.isZero) && _isOpen)
450
450
_spanTags.add(key, value)
451
451
this
452
452
}
453
453
454
454
override def tag (key : String , value : Boolean ): Span = synchronized {
455
- if (isSampled && _isOpen)
455
+ if (( isSampled || ! reportingDelay.isZero) && _isOpen)
456
456
_spanTags.add(key, value)
457
457
this
458
458
}
459
459
460
460
override def tag (tags : TagSet ): Span = synchronized {
461
- if (isSampled && _isOpen)
461
+ if (( isSampled || ! reportingDelay.isZero) && _isOpen)
462
462
_spanTags.add(tags)
463
463
this
464
464
}
@@ -507,7 +507,7 @@ object Span {
507
507
if (_isOpen) {
508
508
_hasError = true
509
509
510
- if (isSampled)
510
+ if (( isSampled || ! reportingDelay.isZero) )
511
511
_spanTags.add(TagKeys .ErrorMessage , message)
512
512
}
513
513
this
@@ -517,7 +517,7 @@ object Span {
517
517
if (_isOpen) {
518
518
_hasError = true
519
519
520
- if (isSampled) {
520
+ if (( isSampled || ! reportingDelay.isZero) ) {
521
521
_spanTags.add(TagKeys .ErrorMessage , throwable.getMessage)
522
522
523
523
if (includeErrorStacktrace)
@@ -531,7 +531,7 @@ object Span {
531
531
if (_isOpen) {
532
532
_hasError = true
533
533
534
- if (isSampled) {
534
+ if (( isSampled || ! reportingDelay.isZero) ) {
535
535
_spanTags.add(TagKeys .ErrorMessage , message)
536
536
537
537
if (includeErrorStacktrace)
@@ -617,7 +617,7 @@ object Span {
617
617
private def toStackTraceString (throwable : Throwable ): String =
618
618
throwable.getStackTrace().mkString(" " , EOL , EOL )
619
619
620
- private def toFinishedSpan (to : Instant , metricTags : TagSet ): Span .Finished =
620
+ protected def toFinishedSpan (to : Instant , metricTags : TagSet ): Span .Finished =
621
621
Span .Finished (id, trace, parentId, _operationName, _hasError, isDelayed, createdAt, to, kind, position, _spanTags.build(),
622
622
metricTags, _marks, _links)
623
623
@@ -643,10 +643,20 @@ object Span {
643
643
}
644
644
645
645
private def reportSpan (finishedAt : Instant , metricTags : TagSet ): Unit = {
646
- if (isSampled)
647
- onFinish(toFinishedSpan(finishedAt, metricTags))
646
+ if (reportingDelay.isZero) {
647
+ if (isSampled)
648
+ onFinish(toFinishedSpan(finishedAt, metricTags))
649
+ }
650
+ else {
651
+ scheduler.schedule(
652
+ new DelayedReportingRunnable (finishedAt, metricTags),
653
+ reportingDelay.toMillis,
654
+ TimeUnit .MILLISECONDS
655
+ )
656
+ }
648
657
}
649
658
659
+
650
660
private def createMetricTags (): TagSet = {
651
661
_metricTags.add(TagKeys .OperationName , _operationName)
652
662
_metricTags.add(TagKeys .Error , _hasError)
@@ -662,6 +672,13 @@ object Span {
662
672
663
673
_metricTags.build()
664
674
}
675
+
676
+ private class DelayedReportingRunnable (finishedAt : Instant , metricTags : TagSet ) extends Runnable {
677
+ override def run (): Unit = {
678
+ if (isSampled)
679
+ onFinish(toFinishedSpan(finishedAt, metricTags))
680
+ }
681
+ }
665
682
}
666
683
667
684
object Local {
0 commit comments