diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2014-10-20 02:09:06 +0200 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2014-10-20 02:09:06 +0200 |
commit | e7991fd2e38e36d6526db1e443bdce04bed39622 (patch) | |
tree | 9bd0e5607f68ca8184a0f66cf25fb827cc2461aa /kamon-core | |
parent | 53e63c5ed3de326d8c54aaa261dd7d51aaf071a4 (diff) | |
download | Kamon-e7991fd2e38e36d6526db1e443bdce04bed39622.tar.gz Kamon-e7991fd2e38e36d6526db1e443bdce04bed39622.tar.bz2 Kamon-e7991fd2e38e36d6526db1e443bdce04bed39622.zip |
+ core: provide sum and percentile functions in Histogram.Snapshot, closes #85
Diffstat (limited to 'kamon-core')
-rw-r--r-- | kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala | 20 | ||||
-rw-r--r-- | kamon-core/src/test/scala/kamon/metric/instrument/HistogramSpec.scala | 7 |
2 files changed, 26 insertions, 1 deletions
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 { diff --git a/kamon-core/src/test/scala/kamon/metric/instrument/HistogramSpec.scala b/kamon-core/src/test/scala/kamon/metric/instrument/HistogramSpec.scala index cefdf0f4..c3060d4a 100644 --- a/kamon-core/src/test/scala/kamon/metric/instrument/HistogramSpec.scala +++ b/kamon-core/src/test/scala/kamon/metric/instrument/HistogramSpec.scala @@ -57,7 +57,7 @@ class HistogramSpec extends WordSpec with Matchers { } "produce a snapshot" which { - "supports min, max and numberOfMeasurements operations" in new HistogramFixture { + "supports min, max, percentile, sum and numberOfMeasurements operations" in new HistogramFixture { histogram.record(100) histogram.record(200, count = 200) histogram.record(300) @@ -67,7 +67,12 @@ class HistogramSpec extends WordSpec with Matchers { snapshot.min should equal(100L +- 1L) snapshot.max should equal(900L +- 9L) + snapshot.percentile(50.0D) should be(200) + snapshot.percentile(99.5D) should be(300) + snapshot.percentile(99.9D) should be(900) + snapshot.sum should be(41300) snapshot.numberOfMeasurements should be(203) + } "can be merged with another snapshot" in new MultipleHistogramFixture { |