aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/metric/EntityRecorder.scala35
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