From 9534d698ccf7e7c368db5e896abdb5d13ce27a48 Mon Sep 17 00:00:00 2001 From: Ivan Topolnak Date: Mon, 3 Feb 2014 15:10:40 -0300 Subject: continuous hdr tracking instrument, special for mailbox size metrics --- .../main/scala/kamon/metrics/ActorMetrics.scala | 3 +- .../ContinuousHighDynamicRangeRecorder.scala | 50 ++++++++++++++++++++++ .../spray/ClientRequestInstrumentationSpec.scala | 2 - 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 kamon-core/src/main/scala/kamon/metrics/instruments/ContinuousHighDynamicRangeRecorder.scala 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 + * + * 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 diff --git a/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala b/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala index 8163e25c..0b1db1b7 100644 --- a/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala +++ b/kamon-spray/src/test/scala/kamon/spray/ClientRequestInstrumentationSpec.scala @@ -74,13 +74,11 @@ class ClientRequestInstrumentationSpec extends TestKitBase with WordSpecLike wit } } - "record the elapsed time for a http request when using the pipelining sendReceive and tag it as UserTime" in { val metricListener = TestProbe() Kamon(Metrics)(system).subscribe(TraceMetrics, "*", metricListener.ref, permanently = true) - val (hostConnector, server) = buildSHostConnectorAndServer val client = TestProbe() val pipeline = pipelining.sendReceive(hostConnector)(system.dispatcher, 10 seconds) -- cgit v1.2.3