package kamon.status
import com.typesafe.config.Config
import kamon.metric.InstrumentFactory.InstrumentType
import kamon.metric.{MeasurementUnit, MetricRegistry}
import kamon.{Configuration, Environment, Kamon}
import kamon.module.ModuleRegistry
import kamon.module.Module.{Kind => ModuleKind}
import java.util.{Collections, List => JavaList, Map => JavaMap}
/**
* Exposes Kamon components' status information. This is meant to be used for informational and debugging purposes and
* by no means should replace the use of reporters to extract information from Kamon.
*/
class Status(_moduleRegistry: ModuleRegistry, _metricRegistry: MetricRegistry, configuration: Configuration) {
/**
* Settings currently used by Kamon.
*/
def settings(): Status.Settings =
Status.Settings(BuildInfo.version, Kamon.environment, configuration.config())
/**
* Status of the module registry. Describes what modules have been detected and registered, either from the classpath
* or programmatically and their current status.
*/
def moduleRegistry(): Status.ModuleRegistry =
_moduleRegistry.status()
/**
* Status of the metric registry. Describes all metrics currently tracked by Kamon.
*/
def metricRegistry(): Status.MetricRegistry =
_metricRegistry.status()
/**
* Status of instrumentation modules that have been detected and/or loaded into the current JVM. Read the
* [[Status.Instrumentation]] companion object's docs for more information.
*/
def instrumentation(): Status.Instrumentation = {
import Status.Instrumentation._
Status.Instrumentation(
isActive(),
modules(),
errors()
)
}
}
object Status {
case class Settings(
version: String,
environment: Environment,
config: Config
)
case class ModuleRegistry(
modules: Seq[Module]
)
case class Module(
name: String,
description: String,
clazz: String,
kind: ModuleKind,
programmaticallyRegistered: Boolean,
enabled: Boolean,
started: Boolean
)
case class MetricRegistry(
metrics: Seq[Metric]
)
case class Metric(
name: String,
tags: Map[String, String],
unit: MeasurementUnit,
instrumentType: InstrumentType
)
/**
* Status of the instrumentation modules. This data is completely untyped and not expected to be used anywhere
* outside Kamon.
*/
private[kamon] case class Instrumentation(
active: Boolean,
modules: JavaMap[String, String],
errors: JavaMap[String, JavaList[Throwable]]
)
/**
* This object works as a bridge between Kamon and Kanela to gather information about instrumentation modules. When
* instrumentation is enabled, it should replace the implementation of the members of this object and return proper
* information.
*
* This data is only exposed directly to the status page API because it lacks any sort of type safety. We might
* change this in the future and provide proper types for all instrumentation modules' info.
*/
private[kamon] object Instrumentation {
/**
* Whether instrumentation is active or not. When Kanela is present it will replace this method to return true.
*/
def isActive(): java.lang.Boolean =
false
/**
* List all instrumentation modules known and their current status. The result map contains the module name as keys
* and a JSON representation of the module status as values. The expected structure in the JSON representations is
* as follows:
*
* {
* 'description': 'A explicative module description',
* 'isEnabled': true | false,
* 'isActive': true | false
* }
*
* The "isEnabled" flag tells whether the module is able to instrument classes or not. By default, all modules are
* able to instrument classes but some modules might be shipped in a disabled state or forced to be disabled via
* configuration.
*
* The "isActive" flag tells whether the modules has already applied instrumentation to any of its target classes.
*
*/
def modules(): JavaMap[String, String] =
Collections.emptyMap()
/**
* List all errors that might have happened during the instrumentation initialization. The resulting map contains
* a list of modules and any exceptions thrown by them during initialization. If not exceptions are thrown the map
* will always be empty.
*/
def errors(): JavaMap[String, JavaList[Throwable]] =
Collections.emptyMap()
}
}