aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/util
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2017-06-07 11:28:45 +0200
committerIvan Topolnjak <ivantopo@gmail.com>2017-06-07 11:28:45 +0200
commit7817621ad1a62db1bd7b7b60ed823b4da169a34a (patch)
tree01efae6f4493b3097b9d1ada1f2c97a25a41b8b7 /kamon-core/src/main/scala/kamon/util
parent0d29461f25851b0ea61dfbcd7784df49c08f840f (diff)
downloadKamon-7817621ad1a62db1bd7b7b60ed823b4da169a34a.tar.gz
Kamon-7817621ad1a62db1bd7b7b60ed823b4da169a34a.tar.bz2
Kamon-7817621ad1a62db1bd7b7b60ed823b4da169a34a.zip
add metric scaler
Diffstat (limited to 'kamon-core/src/main/scala/kamon/util')
-rw-r--r--kamon-core/src/main/scala/kamon/util/MetricScaler.scala58
1 files changed, 58 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/util/MetricScaler.scala b/kamon-core/src/main/scala/kamon/util/MetricScaler.scala
new file mode 100644
index 00000000..ca77a9a1
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/util/MetricScaler.scala
@@ -0,0 +1,58 @@
+package kamon.util
+
+import kamon.metric.{DynamicRange, HdrHistogram, MetricDistribution, MetricValue}
+import kamon.util.MeasurementUnit.Dimension
+
+class MetricScaler(targetTimeUnit: MeasurementUnit, targetInformationUnit: MeasurementUnit, dynamicRange: DynamicRange) {
+ require(targetTimeUnit.dimension == Dimension.Time, "timeUnit must be in the time dimension.")
+ require(targetInformationUnit.dimension == Dimension.Information, "informationUnit must be in the information dimension.")
+
+ val scaleHistogram = new HdrHistogram("scaler", Map.empty, MeasurementUnit.none, dynamicRange)
+
+ def scaleDistribution(metric: MetricDistribution): MetricDistribution = {
+ metric.measurementUnit match {
+ case MeasurementUnit(Dimension.Time, magnitude) if(magnitude != targetTimeUnit.magnitude) =>
+ scaleMetricDistributionToTarget(metric, targetTimeUnit)
+
+ case MeasurementUnit(Dimension.Information, magnitude) if(magnitude != targetTimeUnit.magnitude) =>
+ scaleMetricDistributionToTarget(metric, targetInformationUnit)
+
+ case _ => metric
+ }
+ }
+
+ def scaleMetricValue(metric: MetricValue): MetricValue = {
+ metric.measurementUnit match {
+ case MeasurementUnit(Dimension.Time, magnitude) if(magnitude != targetTimeUnit.magnitude) =>
+ scaleMetricValueToTarget(metric, targetTimeUnit)
+
+ case MeasurementUnit(Dimension.Information, magnitude) if(magnitude != targetTimeUnit.magnitude) =>
+ scaleMetricValueToTarget(metric, targetInformationUnit)
+
+ case _ => metric
+ }
+ }
+
+ private def scaleMetricDistributionToTarget(metric: MetricDistribution, targetUnit: MeasurementUnit): MetricDistribution = {
+ metric.distribution.bucketsIterator.foreach(b => {
+ val scaledValue = MeasurementUnit.scale(b.value, metric.measurementUnit, targetUnit)
+ scaleHistogram.record(Math.ceil(scaledValue).toLong, b.frequency)
+ })
+
+ scaleHistogram.snapshot().copy(
+ name = metric.name,
+ tags = metric.tags,
+ measurementUnit = targetUnit,
+ dynamicRange = dynamicRange
+ )
+ }
+
+ private def scaleMetricValueToTarget(metric: MetricValue, targetUnit: MeasurementUnit): MetricValue = {
+ val scaledValue = MeasurementUnit.scale(metric.value, metric.measurementUnit, targetUnit)
+
+ metric.copy(
+ value = Math.ceil(scaledValue).toLong,
+ measurementUnit = targetUnit
+ )
+ }
+}