diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2014-11-06 16:29:54 +0100 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2014-11-09 18:01:35 +0100 |
commit | f498749274bc9f25ede7221d6bd8b3f0c3822dda (patch) | |
tree | 9371eb98b88830b5c61619a29f53fd4d45040e71 /kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala | |
parent | 6e3d9ae88ecce10420eeac82294c54c1b43dedf4 (diff) | |
download | Kamon-f498749274bc9f25ede7221d6bd8b3f0c3822dda.tar.gz Kamon-f498749274bc9f25ede7221d6bd8b3f0c3822dda.tar.bz2 Kamon-f498749274bc9f25ede7221d6bd8b3f0c3822dda.zip |
! newrelic: major refactor of the newrelic reporter
Most notable changes:
- The agent connection setup is separated from the actual metrics reporting,
this will be important in the near future when we start sending errors too.
- The metrics subscriptions are delayed until the connection to the agent is
established.
- The Tick metrics buffer is only created if necessary.
- Introduced the kamon.newrelic.max-initialize-retries and initialize-retry-delay
settings.
- External service calls via HTTP clients are reported as external services.
Diffstat (limited to 'kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala')
-rw-r--r-- | kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala new file mode 100644 index 00000000..14541483 --- /dev/null +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala @@ -0,0 +1,55 @@ +package kamon.newrelic + +import kamon.metric.instrument.{ Counter, Histogram } +import kamon.metric.{ MetricSnapshot, Scale } + +case class MetricID(name: String, scope: Option[String]) +case class MetricData(callCount: Long, total: Double, totalExclusive: Double, min: Double, max: Double, sumOfSquares: Double) { + def merge(that: MetricData): MetricData = + MetricData( + callCount + that.callCount, + total + that.total, + totalExclusive + that.totalExclusive, + math.min(min, that.min), + math.max(max, that.max), + sumOfSquares + that.sumOfSquares) +} + +object Metric { + + def fromKamonMetricSnapshot(snapshot: MetricSnapshot, name: String, scope: Option[String], targetScale: Scale): Metric = { + snapshot match { + case hs: Histogram.Snapshot ⇒ + var total: Double = 0D + var sumOfSquares: Double = 0D + val scaledMin = Scale.convert(hs.scale, targetScale, hs.min) + val scaledMax = Scale.convert(hs.scale, targetScale, hs.max) + + hs.recordsIterator.foreach { record ⇒ + val scaledValue = Scale.convert(hs.scale, targetScale, record.level) + + total += scaledValue * record.count + sumOfSquares += (scaledValue * scaledValue) * record.count + } + + (MetricID(name, scope), MetricData(hs.numberOfMeasurements, total, total, scaledMin, scaledMax, sumOfSquares)) + + case cs: Counter.Snapshot ⇒ + (MetricID(name, scope), MetricData(cs.count, cs.count, cs.count, 0, cs.count, cs.count * cs.count)) + } + } +} + +case class TimeSliceMetrics(from: Long, to: Long, metrics: Map[MetricID, MetricData]) { + import kamon.metric.combineMaps + + def merge(that: TimeSliceMetrics): TimeSliceMetrics = { + val mergedFrom = math.min(from, that.from) + val mergedTo = math.max(to, that.to) + val mergedMetrics = combineMaps(metrics, that.metrics)((l, r) ⇒ l.merge(r)) + + TimeSliceMetrics(mergedFrom, mergedTo, mergedMetrics) + } +} + +case class MetricBatch(runID: Long, timeSliceMetrics: TimeSliceMetrics)
\ No newline at end of file |