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/src/main/scala | |
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/src/main/scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala | 20 |
1 files changed, 20 insertions, 0 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 { |