aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/Sampler.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-12-04 03:22:20 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2014-12-04 03:22:20 +0100
commitfcbde8b48a539b649cb5c1237824cdaf6badb370 (patch)
treeb5209a4305709d3b668d73cd64f40cbe358f1402 /kamon-core/src/main/scala/kamon/trace/Sampler.scala
parent84ceb0a7b293e1a4279337eb0d4eb2b5b8b131bb (diff)
parent432fb45952c587bcebf81d718188e7067572cf49 (diff)
downloadKamon-fcbde8b48a539b649cb5c1237824cdaf6badb370.tar.gz
Kamon-fcbde8b48a539b649cb5c1237824cdaf6badb370.tar.bz2
Kamon-fcbde8b48a539b649cb5c1237824cdaf6badb370.zip
Merge branch 'wip/simple-tracing-implementation'
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/Sampler.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/Sampler.scala46
1 files changed, 46 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/Sampler.scala b/kamon-core/src/main/scala/kamon/trace/Sampler.scala
new file mode 100644
index 00000000..650592a5
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/trace/Sampler.scala
@@ -0,0 +1,46 @@
+package kamon.trace
+
+import java.util.concurrent.atomic.AtomicLong
+
+import kamon.NanoInterval
+import scala.concurrent.forkjoin.ThreadLocalRandom
+
+trait Sampler {
+ def shouldTrace: Boolean
+ def shouldReport(traceElapsedTime: NanoInterval): Boolean
+}
+
+object NoSampling extends Sampler {
+ def shouldTrace: Boolean = false
+ def shouldReport(traceElapsedTime: NanoInterval): Boolean = false
+}
+
+object SampleAll extends Sampler {
+ def shouldTrace: Boolean = true
+ def shouldReport(traceElapsedTime: NanoInterval): Boolean = true
+}
+
+class RandomSampler(chance: Int) extends Sampler {
+ require(chance > 0, "kamon.trace.random-sampler.chance cannot be <= 0")
+ require(chance <= 100, "kamon.trace.random-sampler.chance cannot be > 100")
+
+ def shouldTrace: Boolean = ThreadLocalRandom.current().nextInt(100) <= chance
+ def shouldReport(traceElapsedTime: NanoInterval): Boolean = true
+}
+
+class OrderedSampler(interval: Int) extends Sampler {
+ require(interval > 0, "kamon.trace.ordered-sampler.interval cannot be <= 0")
+
+ private val counter = new AtomicLong(0L)
+ def shouldTrace: Boolean = counter.incrementAndGet() % interval == 0
+ // TODO: find a more efficient way to do this, protect from long overflow.
+ def shouldReport(traceElapsedTime: NanoInterval): Boolean = true
+}
+
+class ThresholdSampler(thresholdInNanoseconds: Long) extends Sampler {
+ require(thresholdInNanoseconds > 0, "kamon.trace.threshold-sampler.minimum-elapsed-time cannot be <= 0")
+
+ def shouldTrace: Boolean = true
+ def shouldReport(traceElapsedTime: NanoInterval): Boolean = traceElapsedTime.nanos >= thresholdInNanoseconds
+}
+