aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-10-20 02:09:06 +0200
committerIvan Topolnjak <ivantopo@gmail.com>2014-10-20 02:09:06 +0200
commite7991fd2e38e36d6526db1e443bdce04bed39622 (patch)
tree9bd0e5607f68ca8184a0f66cf25fb827cc2461aa /kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala
parent53e63c5ed3de326d8c54aaa261dd7d51aaf071a4 (diff)
downloadKamon-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/kamon/metric/instrument/Histogram.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/metric/instrument/Histogram.scala20
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 {