From d48ca216f6437c7e9fcf3fa3233139218fd133af Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 2 Apr 2014 18:16:09 -0300 Subject: refactor --- .../src/main/scala/kamon/statsd/Statsd.scala | 8 ++- .../kamon/statsd/StatsdMetricTranslator.scala | 32 ++++++++++ .../scala/kamon/statsd/StatsdMetricsSender.scala | 70 ++++++++++++++++++++++ .../kamon/statsd/client/StatsdMetricsSender.scala | 70 ---------------------- 4 files changed, 107 insertions(+), 73 deletions(-) create mode 100644 kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricTranslator.scala create mode 100644 kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricsSender.scala delete mode 100644 kamon-statsd/src/main/scala/kamon/statsd/client/StatsdMetricsSender.scala diff --git a/kamon-statsd/src/main/scala/kamon/statsd/Statsd.scala b/kamon-statsd/src/main/scala/kamon/statsd/Statsd.scala index 4e0f0dfe..a0af09bb 100644 --- a/kamon-statsd/src/main/scala/kamon/statsd/Statsd.scala +++ b/kamon-statsd/src/main/scala/kamon/statsd/Statsd.scala @@ -18,9 +18,9 @@ package kamon.statsd import akka.actor._ import kamon.Kamon -import kamon.statsd.client.StatsdMetricsSender import kamon.metrics.Subscriptions.TickMetricSnapshot -import kamon.metrics.{CustomMetric, TraceMetrics, Metrics} +import kamon.metrics.{TickMetricSnapshotBuffer, CustomMetric, TraceMetrics, Metrics} +import kamon.statsd.StatsdMetricsSender object Statsd extends ExtensionId[StatsdExtension] with ExtensionIdProvider { override def lookup(): ExtensionId[_ <: Extension] = Statsd @@ -46,7 +46,9 @@ class StatsdMetricsListener(host:String, port:Int, prefix:String) extends Actor log.info("Starting the Kamon(Statsd) extension") - val statsdActor = context.actorOf(StatsdMetricsSender.props(prefix, new InetSocketAddress(InetAddress.getByName(host), port)), "StatsdSender") + val statsdActor = context.actorOf(StatsdMetricsSender.props(prefix, new InetSocketAddress(InetAddress.getByName(host), port)), "statsd-metrics-sender") + val translator = context.actorOf(StatsdMetricTranslator.props(statsdActor), "statsd-metrics-translator") + val buffer = context.actorOf(TickMetricSnapshotBuffer.props(1 minute, translator), "metrics-buffer") def receive = { case tick: TickMetricSnapshot ⇒ statsdActor.forward(tick) diff --git a/kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricTranslator.scala b/kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricTranslator.scala new file mode 100644 index 00000000..ee56c005 --- /dev/null +++ b/kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricTranslator.scala @@ -0,0 +1,32 @@ +/* + * ========================================================================================= + * Copyright © 2013-2014 the kamon project + * + * 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 + * + * 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.statsd + +import akka.actor.{Props, Actor, ActorRef} +import kamon.metrics.Subscriptions.TickMetricSnapshot + +class StatsdMetricTranslator(receiver: ActorRef) extends Actor{ + + def receive = { + case TickMetricSnapshot(from, to, metrics) ⇒ + receiver ! "" + } + +} + +object StatsdMetricTranslator { + def props(receiver: ActorRef): Props = Props(new StatsdMetricTranslator(receiver)) +} diff --git a/kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricsSender.scala b/kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricsSender.scala new file mode 100644 index 00000000..1ccf5397 --- /dev/null +++ b/kamon-statsd/src/main/scala/kamon/statsd/StatsdMetricsSender.scala @@ -0,0 +1,70 @@ +/* + * ========================================================================================= + * Copyright © 2013-2014 the kamon project + * + * 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 + * + * 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.statsd + +import akka.actor.{ActorLogging, Props, ActorRef, Actor} +import akka.io.{Udp, IO} +import java.net.InetSocketAddress +import akka.util.ByteString + +class StatsdMetricsSender(statPrefix:String, remote: InetSocketAddress) extends Actor with ActorLogging { + import StatsdMetricsSender._ + import context.system + + IO(Udp) ! Udp.SimpleSender + + def receive = { + case Udp.SimpleSenderReady => + context.become(ready(sender)) + } + + def ready(send: ActorRef): Receive = { + case metric: StatsdMetric => + send ! Udp.Send(toByteString(statPrefix, metric), remote) + + case _ => log.error("Unknown Metric") + } +} + +object StatsdMetricsSender { + + sealed trait StatsdMetric + case class Counter(key: String, value: Long = 1, suffix:String = "c", samplingRate: Double = 1.0) extends StatsdMetric + case class Timing(key: String, millis: Long, suffix:String = "ms", samplingRate: Double = 1.0) extends StatsdMetric + case class Gauge(key: String, value: Long, suffix:String = "g", samplingRate: Double = 1.0) extends StatsdMetric + + def props(statPrefix:String, remote: InetSocketAddress): Props = Props(new StatsdMetricsSender(statPrefix, remote)) + + def toByteString(statPrefix:String, metric:StatsdMetric) : ByteString = metric match { + case Counter(key, value, suffix, samplingRate) => statFor(statPrefix, key, value, suffix, samplingRate) + case Timing(key, value, suffix, samplingRate) => statFor(statPrefix, key, value, suffix, samplingRate) + case Gauge(key, value, suffix, samplingRate) => statFor(statPrefix, key, value, suffix, samplingRate) + } + + /* + * Creates the stat string to send to statsd. + * For counters, it provides something like {@code key:value|c}. + * For timing, it provides something like {@code key:millis|ms}. + * If sampling rate is less than 1, it provides something like {@code key:value|type|@rate} + */ + private[this] def statFor(statPrefix:String, key: String, value: Long, suffix: String, samplingRate: Double): ByteString = { + samplingRate match { + case x if x >= 1.0 => ByteString(s"${statPrefix}.${key}:${value}|$suffix") + case _ => ByteString(s"${statPrefix}.${key}:${value}|${suffix}|@$samplingRate") + } + } +} \ No newline at end of file diff --git a/kamon-statsd/src/main/scala/kamon/statsd/client/StatsdMetricsSender.scala b/kamon-statsd/src/main/scala/kamon/statsd/client/StatsdMetricsSender.scala deleted file mode 100644 index d9173e45..00000000 --- a/kamon-statsd/src/main/scala/kamon/statsd/client/StatsdMetricsSender.scala +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ========================================================================================= - * Copyright © 2013-2014 the kamon project - * - * 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 - * - * 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.statsd.client - -import akka.actor.{ActorLogging, Props, ActorRef, Actor} -import akka.io.{Udp, IO} -import java.net.InetSocketAddress -import akka.util.ByteString - -class StatsdMetricsSender(statPrefix:String, remote: InetSocketAddress) extends Actor with ActorLogging { - import StatsdMetricsSender._ - import context.system - - IO(Udp) ! Udp.SimpleSender - - def receive = { - case Udp.SimpleSenderReady => - context.become(ready(sender)) - } - - def ready(send: ActorRef): Receive = { - case metric: StatsdMetric => - send ! Udp.Send(toByteString(statPrefix, metric), remote) - - case _ => log.error("Unknown Metric") - } -} - -object StatsdMetricsSender { - - sealed trait StatsdMetric - case class Counter(key: String, value: Long = 1, suffix:String = "c", samplingRate: Double = 1.0) extends StatsdMetric - case class Timing(key: String, millis: Long, suffix:String = "ms", samplingRate: Double = 1.0) extends StatsdMetric - case class Gauge(key: String, value: Long, suffix:String = "g", samplingRate: Double = 1.0) extends StatsdMetric - - def props(statPrefix:String, remote: InetSocketAddress): Props = Props(new StatsdMetricsSender(statPrefix, remote)) - - def toByteString(statPrefix:String, metric:StatsdMetric) : ByteString = metric match { - case Counter(key, value, suffix, samplingRate) => statFor(statPrefix, key, value, suffix, samplingRate) - case Timing(key, value, suffix, samplingRate) => statFor(statPrefix, key, value, suffix, samplingRate) - case Gauge(key, value, suffix, samplingRate) => statFor(statPrefix, key, value, suffix, samplingRate) - } - - /* - * Creates the stat string to send to statsd. - * For counters, it provides something like {@code key:value|c}. - * For timing, it provides something like {@code key:millis|ms}. - * If sampling rate is less than 1, it provides something like {@code key:value|type|@rate} - */ - private[this] def statFor(statPrefix:String, key: String, value: Long, suffix: String, samplingRate: Double): ByteString = { - samplingRate match { - case x if x >= 1.0 => ByteString(s"${statPrefix}.${key}:${value}|$suffix") - case _ => ByteString(s"${statPrefix}.${key}:${value}|${suffix}|@$samplingRate") - } - } -} \ No newline at end of file -- cgit v1.2.3