From e7991fd2e38e36d6526db1e443bdce04bed39622 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Mon, 20 Oct 2014 02:09:06 +0200 Subject: + core: provide sum and percentile functions in Histogram.Snapshot, closes #85 --- .../scala/kamon/metric/instrument/Histogram.scala | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'kamon-core/src/main/scala/kamon') diff --git a/kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala b/kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala index 67db5d93..813a2a16 100644 --- a/kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala +++ b/kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala @@ -75,6 +75,8 @@ object Histogram { def numberOfMeasurements: Long def min: Long def max: Long + def sum: Long + def percentile(percentile: Double): Long def recordsIterator: Iterator[Record] def merge(that: Histogram.Snapshot, context: CollectionContext): Histogram.Snapshot } @@ -83,6 +85,8 @@ object Histogram { def empty(targetScale: Scale) = new Snapshot { override def min: Long = 0L override def max: Long = 0L + override def sum: Long = 0L + override def percentile(percentile: Double): Long = 0L override def recordsIterator: Iterator[Record] = Iterator.empty override def merge(that: Snapshot, context: CollectionContext): Snapshot = that override def scale: Scale = targetScale @@ -161,6 +165,22 @@ class CompactHdrSnapshot(val scale: Scale, val numberOfMeasurements: Long, compa def min: Long = if (compactRecords.length == 0) 0 else levelFromCompactRecord(compactRecords(0)) def max: Long = if (compactRecords.length == 0) 0 else levelFromCompactRecord(compactRecords(compactRecords.length - 1)) + def sum: Long = recordsIterator.foldLeft(0L)((a, r) ⇒ a + (r.count * r.level)) + + def percentile(p: Double): Long = { + val records = recordsIterator + val threshold = numberOfMeasurements * (p / 100D) + var countToCurrentLevel = 0L + var percentileLevel = 0L + + while (countToCurrentLevel < threshold && records.hasNext) { + val record = records.next() + countToCurrentLevel += record.count + percentileLevel = record.level + } + + percentileLevel + } def merge(that: Histogram.Snapshot, context: CollectionContext): Histogram.Snapshot = { if (that.isEmpty) this else if (this.isEmpty) that else { -- cgit v1.2.3