aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon')
-rw-r--r--kamon-core/src/main/scala/kamon/Kamon.scala9
-rw-r--r--kamon-core/src/main/scala/kamon/Metrics.scala2
-rw-r--r--kamon-core/src/main/scala/kamon/StatusPage.scala4
-rw-r--r--kamon-core/src/main/scala/kamon/metric/Metric.scala3
-rw-r--r--kamon-core/src/main/scala/kamon/metric/MetricRegistry.scala17
-rw-r--r--kamon-core/src/main/scala/kamon/module/Module.scala15
-rw-r--r--kamon-core/src/main/scala/kamon/module/ReportingModule.scala6
-rw-r--r--kamon-core/src/main/scala/kamon/status/JsonMarshalling.scala29
-rw-r--r--kamon-core/src/main/scala/kamon/status/Status.scala7
-rw-r--r--kamon-core/src/main/scala/kamon/status/StatusPageServer.scala1
10 files changed, 83 insertions, 10 deletions
diff --git a/kamon-core/src/main/scala/kamon/Kamon.scala b/kamon-core/src/main/scala/kamon/Kamon.scala
index 99327286..96aba81c 100644
--- a/kamon-core/src/main/scala/kamon/Kamon.scala
+++ b/kamon-core/src/main/scala/kamon/Kamon.scala
@@ -16,7 +16,8 @@
package kamon
import com.typesafe.config.{Config, ConfigRenderOptions}
-import kamon.module.Module
+import kamon.metric.PeriodSnapshot
+import kamon.module.{MetricReporter, Module}
object Kamon extends ClassLoading
with Configuration
@@ -42,13 +43,17 @@ object Kamon extends ClassLoading
object QuickTest extends App {
Kamon.loadModules()
- Kamon.registerModule("my-module", new Module {
+ Kamon.registerModule("my-module", new MetricReporter {
+ override def reportPeriodSnapshot(snapshot: PeriodSnapshot): Unit = {}
override def start(): Unit = {}
override def stop(): Unit = {}
override def reconfigure(newConfig: Config): Unit = {}
})
+ Kamon.histogram("test").refine("tagcito" -> "value").record(10)
+ Kamon.counter("test-counter").refine("tagcito" -> "value").increment(42)
+
//println("JSON CONFIG: " + Kamon.config().root().render(ConfigRenderOptions.concise().setFormatted(true).setJson(true)))
diff --git a/kamon-core/src/main/scala/kamon/Metrics.scala b/kamon-core/src/main/scala/kamon/Metrics.scala
index a2b74c20..5863b73e 100644
--- a/kamon-core/src/main/scala/kamon/Metrics.scala
+++ b/kamon-core/src/main/scala/kamon/Metrics.scala
@@ -6,7 +6,7 @@ import kamon.metric._
trait Metrics extends MetricLookup { self: Configuration with Utilities =>
- private val _metricsRegistry = new MetricRegistry(self.config(), self.scheduler())
+ protected val _metricsRegistry = new MetricRegistry(self.config(), self.scheduler())
override def histogram(name: String, unit: MeasurementUnit, dynamicRange: Option[DynamicRange]): HistogramMetric =
_metricsRegistry.histogram(name, unit, dynamicRange)
diff --git a/kamon-core/src/main/scala/kamon/StatusPage.scala b/kamon-core/src/main/scala/kamon/StatusPage.scala
index 6f382a85..e5c8ef52 100644
--- a/kamon-core/src/main/scala/kamon/StatusPage.scala
+++ b/kamon-core/src/main/scala/kamon/StatusPage.scala
@@ -3,9 +3,9 @@ package kamon
import com.typesafe.config.Config
import kamon.status.{StatusPageServer, Status}
-trait StatusPage { self: Configuration with ClassLoading with ModuleLoading with Configuration =>
+trait StatusPage { self: Configuration with ClassLoading with ModuleLoading with Metrics with Configuration =>
@volatile private var _statusPageServer: Option[StatusPageServer] = None
- private val _status = new Status(self._moduleRegistry, self)
+ private val _status = new Status(self._moduleRegistry, self._metricsRegistry, self)
// Initial configuration and reconfigures
init(self.config())
diff --git a/kamon-core/src/main/scala/kamon/metric/Metric.scala b/kamon-core/src/main/scala/kamon/metric/Metric.scala
index a66d1229..f5ce7b45 100644
--- a/kamon-core/src/main/scala/kamon/metric/Metric.scala
+++ b/kamon-core/src/main/scala/kamon/metric/Metric.scala
@@ -85,6 +85,9 @@ private[kamon] abstract sealed class BaseMetric[T, S](val instrumentType: Instru
private[kamon] def snapshot(): Seq[S] =
instruments.values.map(createSnapshot).toSeq
+ private[kamon] def incarnations(): Seq[Map[String, String]] =
+ instruments.keys.toSeq
+
protected def createInstrument(tags: Tags): T
protected def createSnapshot(instrument: T): S
diff --git a/kamon-core/src/main/scala/kamon/metric/MetricRegistry.scala b/kamon-core/src/main/scala/kamon/metric/MetricRegistry.scala
index cc111d95..11c5653f 100644
--- a/kamon-core/src/main/scala/kamon/metric/MetricRegistry.scala
+++ b/kamon-core/src/main/scala/kamon/metric/MetricRegistry.scala
@@ -88,6 +88,23 @@ class MetricRegistry(initialConfig: Config, scheduler: ScheduledExecutorService)
metric.asInstanceOf[T]
}
+
+ private[kamon] def status(): MetricRegistry.Status = {
+ var metricInfos = Seq.empty[MetricRegistry.MetricInfo]
+ metrics.foreach {
+ case (metricName, metric) =>
+ metric.incarnations().foreach(incarnation => {
+ metricInfos = metricInfos :+ MetricRegistry.MetricInfo(metricName, incarnation, metric.instrumentType)
+ })
+ }
+
+ MetricRegistry.Status(metricInfos)
+ }
+}
+
+object MetricRegistry {
+ case class Status(metrics: Seq[MetricInfo])
+ case class MetricInfo(name: String, tags: Map[String, String], instrumentType: InstrumentType)
}
trait MetricsSnapshotGenerator {
diff --git a/kamon-core/src/main/scala/kamon/module/Module.scala b/kamon-core/src/main/scala/kamon/module/Module.scala
index f32e949b..fd5af16c 100644
--- a/kamon-core/src/main/scala/kamon/module/Module.scala
+++ b/kamon-core/src/main/scala/kamon/module/Module.scala
@@ -331,15 +331,23 @@ object Module {
* Returns the current status of this module registry.
*/
private[kamon] def status(): Registry.Status = {
+ def moduleKind(instance: Any): String = instance match {
+ case _: CombinedReporter => "combined"
+ case _: MetricReporter => "metric"
+ case _: SpanReporter => "span"
+ case _: Module => "plain"
+ }
+
val automaticallyAddedModules = readModuleSettings(configuration.config()).map(moduleSettings => {
val entry = _registeredModules.get(moduleSettings.name)
- Registry.ModuleInfo(moduleSettings.name, moduleSettings.fqcn, moduleSettings.enabled, entry.nonEmpty)
+ val entryModuleKind = entry.map(e => moduleKind(e.module)).getOrElse("unknown")
+ Registry.ModuleInfo(moduleSettings.name, moduleSettings.fqcn, moduleSettings.enabled, entry.nonEmpty, entryModuleKind)
})
val programmaticallyAddedModules = _registeredModules
.filter { case (_, entry) => entry.programmaticallyAdded }
.map { case (name, entry) => {
- Registry.ModuleInfo(name, entry.module.getClass.getName, true, true)
+ Registry.ModuleInfo(name, entry.module.getClass.getName, true, true, moduleKind(entry.module))
}}
val allModules = automaticallyAddedModules ++ programmaticallyAddedModules
@@ -432,7 +440,8 @@ object Module {
name: String,
description: String,
enabled: Boolean,
- started: Boolean
+ started: Boolean,
+ kind: String
)
}
diff --git a/kamon-core/src/main/scala/kamon/module/ReportingModule.scala b/kamon-core/src/main/scala/kamon/module/ReportingModule.scala
index 0e88fc23..02a7344e 100644
--- a/kamon-core/src/main/scala/kamon/module/ReportingModule.scala
+++ b/kamon-core/src/main/scala/kamon/module/ReportingModule.scala
@@ -19,3 +19,9 @@ trait MetricReporter extends Module {
trait SpanReporter extends Module {
def reportSpans(spans: Seq[Span.FinishedSpan]): Unit
}
+
+/**
+ * Modules implementing this trait will get registered for periodically receiving metric period snapshots and span
+ * batches.
+ */
+trait CombinedReporter extends MetricReporter with SpanReporter
diff --git a/kamon-core/src/main/scala/kamon/status/JsonMarshalling.scala b/kamon-core/src/main/scala/kamon/status/JsonMarshalling.scala
index c7c480fd..345e5cad 100644
--- a/kamon-core/src/main/scala/kamon/status/JsonMarshalling.scala
+++ b/kamon-core/src/main/scala/kamon/status/JsonMarshalling.scala
@@ -6,6 +6,7 @@ import kamon.module.Module.Registry
import java.lang.{StringBuilder => JavaStringBuilder}
import com.typesafe.config.ConfigRenderOptions
+import kamon.metric.MetricRegistry
trait JsonMarshalling[T] {
@@ -29,6 +30,7 @@ object JsonMarshalling {
array.`object`()
.value("name", m.name)
.value("description", m.description)
+ .value("kind", m.kind)
.value("enabled", m.enabled)
.value("started", m.started)
.end()
@@ -62,4 +64,31 @@ object JsonMarshalling {
.done()
}
}
+
+ implicit object MetricRegistryStatusJsonMarshalling extends JsonMarshalling[MetricRegistry.Status] {
+ override def toJson(instance: MetricRegistry.Status, builder: JavaStringBuilder): Unit = {
+ val metricsObject = JsonWriter.on(builder)
+ .`object`
+ .array("metrics")
+
+ instance.metrics.foreach(metric => {
+ metricsObject
+ .`object`()
+ .value("name", metric.name)
+ .value("type", metric.instrumentType.name)
+ .`object`("tags")
+
+ metric.tags.foreach { case (tag, value) => metricsObject.value(tag, value) }
+
+ metricsObject
+ .end() // tags
+ .end() // metric info
+ })
+
+ metricsObject
+ .end() // metrics array
+ .end() // object
+ .done()
+ }
+ }
} \ No newline at end of file
diff --git a/kamon-core/src/main/scala/kamon/status/Status.scala b/kamon-core/src/main/scala/kamon/status/Status.scala
index f212ff55..0d141ed0 100644
--- a/kamon-core/src/main/scala/kamon/status/Status.scala
+++ b/kamon-core/src/main/scala/kamon/status/Status.scala
@@ -1,6 +1,7 @@
package kamon.status
import com.typesafe.config.Config
+import kamon.metric.MetricRegistry
import kamon.{Configuration, Environment, Kamon}
import kamon.module.Module
@@ -8,7 +9,7 @@ import kamon.module.Module
/**
* Allows accessing of component's status APIs without exposing any other internal API from those components.
*/
-class Status(_moduleRegistry: Module.Registry, configuration: Configuration) {
+class Status(_moduleRegistry: Module.Registry, _metricRegistry: MetricRegistry, configuration: Configuration) {
def baseInfo(): Status.BaseInfo =
Status.BaseInfo(BuildInfo.version, Kamon.environment, configuration.config())
@@ -18,8 +19,10 @@ class Status(_moduleRegistry: Module.Registry, configuration: Configuration) {
*/
def moduleRegistry(): Module.Registry.Status =
_moduleRegistry.status()
-}
+ def metricRegistry(): MetricRegistry.Status =
+ _metricRegistry.status()
+}
diff --git a/kamon-core/src/main/scala/kamon/status/StatusPageServer.scala b/kamon-core/src/main/scala/kamon/status/StatusPageServer.scala
index 4e2bf03c..7a124c1b 100644
--- a/kamon-core/src/main/scala/kamon/status/StatusPageServer.scala
+++ b/kamon-core/src/main/scala/kamon/status/StatusPageServer.scala
@@ -19,6 +19,7 @@ class StatusPageServer(hostname: String, port: Int, resourceLoader: ClassLoader,
session.getUri() match {
case "/status/config" => json(status.baseInfo())
case "/status/modules" => json(status.moduleRegistry())
+ case "/status/metrics" => json(status.metricRegistry())
case _ => NotFound
}