diff options
Diffstat (limited to 'kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala | 75 |
1 files changed, 55 insertions, 20 deletions
diff --git a/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala b/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala index 72e473e8..96d2cd48 100644 --- a/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala +++ b/kamon-core/src/main/scala/kamon/metrics/ActorMetrics.scala @@ -1,31 +1,66 @@ -/* =================================================== +/* + * ========================================================================================= * Copyright © 2013 the kamon project <http://kamon.io/> * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + * ========================================================================================= + */ package kamon.metrics -import akka.actor.{ Props, ExtendedActorSystem, ExtensionIdProvider, ExtensionId } -import akka.actor -import kamon.Kamon +import com.typesafe.config.Config +import org.HdrHistogram.HighDynamicRangeRecorder -object ActorMetrics extends ExtensionId[ActorMetricsExtension] with ExtensionIdProvider { - def lookup(): ExtensionId[_ <: actor.Extension] = ActorMetrics - def createExtension(system: ExtendedActorSystem): ActorMetricsExtension = new ActorMetricsExtension(system) +object ActorMetrics extends MetricGroupIdentity.Category with MetricGroupFactory { + val name: String = "actor" + type Group = ActorMetricRecorder -} + case object ProcessingTime extends MetricIdentity { val name = "ProcessingTime" } + case object MailboxSize extends MetricIdentity { val name = "MailboxSize" } + case object TimeInMailbox extends MetricIdentity { val name = "TimeInMailbox" } + + case class ActorMetricRecorder(processingTime: MetricRecorder, mailboxSize: MetricRecorder, timeInMailbox: MetricRecorder) + extends MetricGroupRecorder { + + def record(identity: MetricIdentity, value: Long): Unit = identity match { + case ProcessingTime ⇒ processingTime.record(value) + case MailboxSize ⇒ mailboxSize.record(value) + case TimeInMailbox ⇒ timeInMailbox.record(value) + } + + def collect: MetricGroupSnapshot = { + ActorMetricSnapshot(processingTime.collect(), mailboxSize.collect(), timeInMailbox.collect()) + } + } + + case class ActorMetricSnapshot(processingTime: MetricSnapshot, mailboxSize: MetricSnapshot, timeInMailbox: MetricSnapshot) + extends MetricGroupSnapshot { + + def metrics: Map[MetricIdentity, MetricSnapshot] = Map( + (ProcessingTime -> processingTime), + (MailboxSize -> mailboxSize), + (TimeInMailbox -> timeInMailbox)) + } + + def create(config: Config): ActorMetricRecorder = { + import HighDynamicRangeRecorder.Configuration + + val settings = config.getConfig("kamon.metrics.actors.hdr-settings") + val processingTimeHdrConfig = Configuration.fromConfig(settings.getConfig("processing-time")) + val mailboxSizeHdrConfig = Configuration.fromConfig(settings.getConfig("mailbox-size")) + val timeInMailboxHdrConfig = Configuration.fromConfig(settings.getConfig("time-in-mailbox")) -class ActorMetricsExtension(val system: ExtendedActorSystem) extends Kamon.Extension with ActorMetricsOps { - lazy val metricsDispatcher = system.actorOf(Props[ActorMetricsDispatcher], "kamon-actor-metrics") + ActorMetricRecorder( + HighDynamicRangeRecorder(processingTimeHdrConfig), + HighDynamicRangeRecorder(mailboxSizeHdrConfig), + HighDynamicRangeRecorder(timeInMailboxHdrConfig)) + } } |