diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2019-01-31 22:59:18 +0100 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2019-01-31 22:59:18 +0100 |
commit | ff8b915260e90084179dcb1d8b0b7b5f62b98470 (patch) | |
tree | 612de8f038d3bfb4d1a7fe0d4f41669420fa0f7e /kamon-core/src/main/scala | |
parent | 1db3f5c9c984dabbad7400c0c092942ff04580c0 (diff) | |
download | Kamon-ff8b915260e90084179dcb1d8b0b7b5f62b98470.tar.gz Kamon-ff8b915260e90084179dcb1d8b0b7b5f62b98470.tar.bz2 Kamon-ff8b915260e90084179dcb1d8b0b7b5f62b98470.zip |
show number of modules and metrics on the status page
Diffstat (limited to 'kamon-core/src/main/scala')
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 } |