From 6b196b2626f618e452a25e9437c944ff4138636c Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Tue, 5 Dec 2017 02:11:34 +0100 Subject: rename MinMaxCounter to RangeSampler --- .../src/main/scala/kamon/metric/RangeSampler.scala | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 kamon-core/src/main/scala/kamon/metric/RangeSampler.scala (limited to 'kamon-core/src/main/scala/kamon/metric/RangeSampler.scala') diff --git a/kamon-core/src/main/scala/kamon/metric/RangeSampler.scala b/kamon-core/src/main/scala/kamon/metric/RangeSampler.scala new file mode 100644 index 00000000..2adecf45 --- /dev/null +++ b/kamon-core/src/main/scala/kamon/metric/RangeSampler.scala @@ -0,0 +1,88 @@ +/* ========================================================================================= + * Copyright © 2013-2017 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.metric + +import java.lang.Math.abs +import java.time.Duration +import java.util.concurrent.atomic.AtomicLong + +trait RangeSampler { + def unit: MeasurementUnit + def dynamicRange: DynamicRange + def sampleInterval: Duration + + def increment(): Unit + def increment(times: Long): Unit + def decrement(): Unit + def decrement(times: Long): Unit + def sample(): Unit +} + +class SimpleRangeSampler(name: String, tags: Map[String, String], underlyingHistogram: AtomicHdrHistogram, + val sampleInterval: Duration) extends RangeSampler { + + private val min = AtomicLongMaxUpdater() + private val max = AtomicLongMaxUpdater() + private val sum = new AtomicLong() + + def dynamicRange: DynamicRange = + underlyingHistogram.dynamicRange + + def unit: MeasurementUnit = + underlyingHistogram.unit + + def increment(): Unit = + increment(1L) + + def increment(times: Long): Unit = { + val currentValue = sum.addAndGet(times) + max.update(currentValue) + } + + def decrement(): Unit = + decrement(1L) + + def decrement(times: Long): Unit = { + val currentValue = sum.addAndGet(-times) + min.update(-currentValue) + } + + def sample(): Unit = { + val currentValue = { + val value = sum.get() + if (value <= 0) 0 else value + } + + val currentMin = { + val rawMin = min.maxThenReset(-currentValue) + if (rawMin >= 0) + 0 + else + abs(rawMin) + } + + val currentMax = max.maxThenReset(currentValue) + + underlyingHistogram.record(currentValue) + underlyingHistogram.record(currentMin) + underlyingHistogram.record(currentMax) + } + + private[kamon] def snapshot(resetState: Boolean = true): MetricDistribution = { + sample() + underlyingHistogram.snapshot(resetState) + } +} -- cgit v1.2.3