diff options
Diffstat (limited to 'kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala b/kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala index 8ce37082..ccdb463e 100644 --- a/kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala +++ b/kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala @@ -1,11 +1,13 @@ package kamon.metric import java.time.Duration +import java.util.concurrent.{ScheduledExecutorService, ScheduledFuture, TimeUnit} import kamon.metric.instrument._ import kamon.util.MeasurementUnit import scala.collection.concurrent.TrieMap +import scala.util.Try trait EntityRecorder { def histogram(name: String): Histogram @@ -25,12 +27,11 @@ trait EntitySnapshotProducer { def snapshot(): EntitySnapshot } +class DefaultEntityRecorder(entity: Entity, instrumentFactory: InstrumentFactory, scheduler: ScheduledExecutorService) + extends EntityRecorder with EntitySnapshotProducer { - - -class DefaultEntityRecorder(entity: Entity, instrumentFactory: InstrumentFactory) extends EntityRecorder with EntitySnapshotProducer { private val histograms = TrieMap.empty[String, Histogram with DistributionSnapshotInstrument] - private val minMaxCounters = TrieMap.empty[String, MinMaxCounter with DistributionSnapshotInstrument] + private val minMaxCounters = TrieMap.empty[String, MinMaxCounterEntry] private val counters = TrieMap.empty[String, Counter with SingleValueSnapshotInstrument] private val gauges = TrieMap.empty[String, Gauge with SingleValueSnapshotInstrument] @@ -41,10 +42,14 @@ class DefaultEntityRecorder(entity: Entity, instrumentFactory: InstrumentFactory histograms.atomicGetOrElseUpdate(name, instrumentFactory.buildHistogram(entity, name, dynamicRange, measurementUnit)) def minMaxCounter(name: String): MinMaxCounter = - minMaxCounters.atomicGetOrElseUpdate(name, instrumentFactory.buildMinMaxCounter(entity, name)) + minMaxCounters.atomicGetOrElseUpdate(name, + createMMCounterEntry(instrumentFactory.buildMinMaxCounter(entity, name)) + ).mmCounter def minMaxCounter(name: String, measurementUnit: MeasurementUnit, dynamicRange: DynamicRange, sampleFrequency: Duration): MinMaxCounter = - minMaxCounters.atomicGetOrElseUpdate(name, instrumentFactory.buildMinMaxCounter(entity, name, dynamicRange, sampleFrequency, measurementUnit)) + minMaxCounters.atomicGetOrElseUpdate(name, + createMMCounterEntry(instrumentFactory.buildMinMaxCounter(entity, name, dynamicRange, sampleFrequency, measurementUnit)) + ).mmCounter def gauge(name: String): Gauge = gauges.atomicGetOrElseUpdate(name, instrumentFactory.buildGauge(entity, name)) @@ -62,8 +67,24 @@ class DefaultEntityRecorder(entity: Entity, instrumentFactory: InstrumentFactory new EntitySnapshot( entity, histograms = histograms.values.map(_.snapshot()).toSeq, - minMaxCounters = minMaxCounters.values.map(_.snapshot()).toSeq, + minMaxCounters = minMaxCounters.values.map(_.mmCounter.snapshot()).toSeq, gauges = gauges.values.map(_.snapshot()).toSeq, counters = counters.values.map(_.snapshot()).toSeq ) + + def cleanup(): Unit = { + minMaxCounters.values.foreach { mmCounter => + Try(mmCounter.refreshFuture.cancel(true)) + } + } + + private case class MinMaxCounterEntry(mmCounter: MinMaxCounter with DistributionSnapshotInstrument, refreshFuture: ScheduledFuture[_]) + + private def createMMCounterEntry(mmCounter: MinMaxCounter with DistributionSnapshotInstrument): MinMaxCounterEntry = { + val refreshFuture = scheduler.schedule(new Runnable { + override def run(): Unit = mmCounter.sample() + }, mmCounter.sampleInterval.toMillis, TimeUnit.MILLISECONDS) + + MinMaxCounterEntry(mmCounter, refreshFuture) + } }
\ No newline at end of file |