aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/instrumentation/MetricGroup.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/instrumentation/MetricGroup.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/instrumentation/MetricGroup.scala64
1 files changed, 64 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/instrumentation/MetricGroup.scala b/kamon-core/src/main/scala/kamon/instrumentation/MetricGroup.scala
new file mode 100644
index 00000000..b27c6f54
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/instrumentation/MetricGroup.scala
@@ -0,0 +1,64 @@
+package kamon
+package instrumentation
+
+import kamon.metric.Metric
+import scala.collection.JavaConverters._
+
+/**
+ * Utility class that helps to apply the same tags to several metrics and keep track of all the tagged instruments so
+ * that they can later be cleaned up. This becomes specially handy when tracking several metrics that are related to
+ * each other and should be created and removed together, for example, when tracking metrics on a thread pool you will
+ * want to register several metrics related to one particular thread pool with a number of common tags and then remove
+ * all of those metrics once the thread pool is shut down.
+ *
+ * @param commonTags Tags to be applied to all metrics returned by calls to the tag method.
+ */
+abstract class MetricGroup(commonTags: Map[String, String]) {
+ private var _groupInstruments = List.empty[(Metric[_], Map[String, String])]
+
+ /**
+ * Tag a metric using the common tags.
+ */
+ def tag[T](metric: Metric[T]): T =
+ register(metric, commonTags)
+
+ /**
+ * Tag a metric using the supplied key/value pair and the common tags.
+ */
+ def tag[T](metric: Metric[T], key: String, value: String): T =
+ register(metric, commonTags ++ Map(key -> value))
+
+ /**
+ * Tag a metric using the supplied tuple and the common tags.
+ */
+ def tag[T](metric: Metric[T], tag: (String, String)): T =
+ register(metric, commonTags + tag)
+
+ /**
+ * Tag a metric using the supplied tags map and the common tags.
+ */
+ def tag[T](metric: Metric[T], tags: Map[String, String]): T =
+ register(metric, commonTags ++ tags)
+
+ /**
+ * Tag a metric using the supplied tags map and the common tags.
+ */
+ def tag[T](metric: Metric[T], tags: java.util.Map[String, String]): T =
+ register(metric, commonTags ++ tags.asScala.toMap)
+
+
+ private def register[T](metric: Metric[T], tags: Map[String, String]): T = synchronized {
+ _groupInstruments = (metric -> tags) :: _groupInstruments
+ metric.refine(tags)
+ }
+
+
+ /**
+ * Removes all metrics that were tagged by this group.
+ */
+ def cleanup(): Unit = synchronized {
+ _groupInstruments foreach {
+ case (metric, tags) => metric.remove(tags)
+ }
+ }
+} \ No newline at end of file