diff options
author | Ivan Topolnak <itopolnak@despegar.com> | 2014-02-03 15:10:40 -0300 |
---|---|---|
committer | Ivan Topolnak <itopolnak@despegar.com> | 2014-02-03 15:10:40 -0300 |
commit | 9534d698ccf7e7c368db5e896abdb5d13ce27a48 (patch) | |
tree | 8ea9e5879ac9b88890540428bca223acbb8a54f0 /kamon-core | |
parent | 481a50b253fee53ec92901731f152ce9ba63e6a4 (diff) | |
download | Kamon-9534d698ccf7e7c368db5e896abdb5d13ce27a48.tar.gz Kamon-9534d698ccf7e7c368db5e896abdb5d13ce27a48.tar.bz2 Kamon-9534d698ccf7e7c368db5e896abdb5d13ce27a48.zip |
continuous hdr tracking instrument, special for mailbox size metrics
Diffstat (limited to 'kamon-core')
-rw-r--r-- | kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala | 3 | ||||
-rw-r--r-- | kamon-core/src/main/scala/kamon/metrics/instruments/ContinuousHighDynamicRangeRecorder.scala | 50 |
2 files changed, 52 insertions, 1 deletions
diff --git a/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala b/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala index 66d3f888..a00b443e 100644 --- a/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala +++ b/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala @@ -17,6 +17,7 @@ package kamon.metrics import com.typesafe.config.Config +import kamon.metrics.instruments.ContinuousHighDynamicRangeRecorder import org.HdrHistogram.HighDynamicRangeRecorder object ActorMetrics extends MetricGroupIdentity.Category with MetricGroupFactory { @@ -60,7 +61,7 @@ object ActorMetrics extends MetricGroupIdentity.Category with MetricGroupFactory new ActorMetricRecorder( HighDynamicRangeRecorder(processingTimeHdrConfig), - HighDynamicRangeRecorder(mailboxSizeHdrConfig), + ContinuousHighDynamicRangeRecorder(mailboxSizeHdrConfig), HighDynamicRangeRecorder(timeInMailboxHdrConfig)) } } diff --git a/kamon-core/src/main/scala/kamon/metrics/instruments/ContinuousHighDynamicRangeRecorder.scala b/kamon-core/src/main/scala/kamon/metrics/instruments/ContinuousHighDynamicRangeRecorder.scala new file mode 100644 index 00000000..533e06b1 --- /dev/null +++ b/kamon-core/src/main/scala/kamon/metrics/instruments/ContinuousHighDynamicRangeRecorder.scala @@ -0,0 +1,50 @@ +/* + * ========================================================================================= + * Copyright © 2013 the kamon project <http://kamon.io/> + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + * ========================================================================================= + */ + +package kamon.metrics.instruments + +import org.HdrHistogram.HighDynamicRangeRecorder +import org.HdrHistogram.HighDynamicRangeRecorder.Configuration +import kamon.metrics.MetricSnapshot + +/** + * This recorder keeps track of the last value recoded and automatically adds it after collecting a snapshot. This is + * useful in cases where the absence of recordings does not necessarily mean the absence of values. For example, if this + * recorder is used for recording the mailbox size of an actor, and it only gets updated upon message enqueue o dequeue, + * the absence of recordings during 1 second means that the size hasn't change (example: the actor being blocked doing + * some work) and it should keep its last known value, instead of dropping to zero and then going back to the real value + * after a new event is processed. + * + */ +class ContinuousHighDynamicRangeRecorder(configuration: Configuration) extends HighDynamicRangeRecorder(configuration) { + @volatile private var lastRecordedValue: Long = 0 + + override def record(value: Long): Unit = { + lastRecordedValue = value + super.record(value) + } + + override def collect(): MetricSnapshot = { + val snapshot = super.collect() + super.record(lastRecordedValue) + + snapshot + } +} + +object ContinuousHighDynamicRangeRecorder { + def apply(configuration: Configuration) = new ContinuousHighDynamicRangeRecorder(configuration) +}
\ No newline at end of file |