diff options
5 files changed, 96 insertions, 15 deletions
diff --git a/kamon-log-reporter/src/main/resources/reference.conf b/kamon-log-reporter/src/main/resources/reference.conf new file mode 100644 index 00000000..dea218eb --- /dev/null +++ b/kamon-log-reporter/src/main/resources/reference.conf @@ -0,0 +1,12 @@ +# ========================================== # +# Kamon-Log-Reporter Reference Configuration # +# ========================================== # + +kamon { + log-reporter { + + # Enable system metrics + # In order to not get a ClassNotFoundException, we must register the kamon-sytem-metrics module + report-system-metrics = false + } +} diff --git a/kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala b/kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala index 4fde7f92..d58c6330 100644 --- a/kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala +++ b/kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala @@ -23,8 +23,12 @@ import kamon.metric.ActorMetrics.ActorMetricSnapshot import kamon.metric.Subscriptions.TickMetricSnapshot import kamon.metric.TraceMetrics.TraceMetricsSnapshot import kamon.metric.UserMetrics._ -import kamon.metric.instrument.{ Counter, Histogram } import kamon.metric._ +import kamon.metric.instrument.{ Counter, Histogram } +import kamon.metrics.MemoryMetrics.MemoryMetricSnapshot +import kamon.metrics.NetworkMetrics.NetworkMetricSnapshot +import kamon.metrics.{ NetworkMetrics, MemoryMetrics, CPUMetrics } +import kamon.metrics.CPUMetrics.CPUMetricSnapshot object LogReporter extends ExtensionId[LogReporterExtension] with ExtensionIdProvider { override def lookup(): ExtensionId[_ <: Extension] = LogReporter @@ -41,6 +45,8 @@ class LogReporterExtension(system: ExtendedActorSystem) extends Kamon.Extension val log = Logging(system, classOf[LogReporterExtension]) log.info("Starting the Kamon(LogReporter) extension") + val logReporterConfig = system.settings.config.getConfig("kamon.log-reporter") + val subscriber = system.actorOf(Props[LogReporterSubscriber], "kamon-log-reporter") Kamon(Metrics)(system).subscribe(TraceMetrics, "*", subscriber, permanently = true) Kamon(Metrics)(system).subscribe(ActorMetrics, "*", subscriber, permanently = true) @@ -51,10 +57,18 @@ class LogReporterExtension(system: ExtendedActorSystem) extends Kamon.Extension Kamon(Metrics)(system).subscribe(UserMinMaxCounters, "*", subscriber, permanently = true) Kamon(Metrics)(system).subscribe(UserGauges, "*", subscriber, permanently = true) + // Subscribe to SystemMetrics + val includeSystemMetrics = logReporterConfig.getBoolean("report-system-metrics") + + if (includeSystemMetrics) { + Kamon(Metrics)(system).subscribe(CPUMetrics, "*", subscriber, permanently = true) + Kamon(Metrics)(system).subscribe(NetworkMetrics, "*", subscriber, permanently = true) + } + } class LogReporterSubscriber extends Actor with ActorLogging { - import LogReporterSubscriber.RichHistogramSnapshot + import kamon.logreporter.LogReporterSubscriber.RichHistogramSnapshot def receive = { case tick: TickMetricSnapshot ⇒ printMetricSnapshot(tick) @@ -74,6 +88,8 @@ class LogReporterSubscriber extends Actor with ActorLogging { case (c: UserCounter, s: UserCounterSnapshot) ⇒ counters += (c -> s.counterSnapshot) case (m: UserMinMaxCounter, s: UserMinMaxCounterSnapshot) ⇒ minMaxCounters += (m -> s.minMaxCounterSnapshot) case (g: UserGauge, s: UserGaugeSnapshot) ⇒ gauges += (g -> s.gaugeSnapshot) + case (_, cms: CPUMetricSnapshot) ⇒ logCpuMetrics(cms) + case (_, nms: NetworkMetricSnapshot) ⇒ logNetworkMetrics(nms) case ignoreEverythingElse ⇒ } @@ -110,6 +126,50 @@ class LogReporterSubscriber extends Actor with ActorLogging { ams.processingTime.max, ams.timeInMailbox.max)) } + def logCpuMetrics(cms: CPUMetricSnapshot): Unit = { + import cms._ + + log.info( + """ + |+--------------------------------------------------------------------------------------------------+ + || | + || CPU (ALL) | + || | + || User (percentage) System (percentage) Wait (percentage) Idle (percentage) | + || Min: %-3s Min: %-3s Min: %-3s Min: %-3s | + || Avg: %-3s Avg: %-3s Avg: %-3s Avg: %-3s | + || Max: %-3s Max: %-3s Max: %-3s Max: %-3s | + || | + || | + |+--------------------------------------------------------------------------------------------------+""" + .stripMargin.format( + user.min, system.min, cpuWait.min, idle.min, + user.average, system.average, cpuWait.average, idle.average, + user.max, system.max, cpuWait.max, idle.max)) + + } + + def logNetworkMetrics(nms: NetworkMetricSnapshot): Unit = { + import nms._ + + log.info( + """ + |+--------------------------------------------------------------------------------------------------+ + || | + || Network (ALL) | + || | + || Rx-Bytes (KB) Tx-Bytes (KB) Rx-Errors Tx-Errors | + || Min: %-4s Min: %-4s Total: %-8s Total: %-8s| + || Avg: %-4s Avg: %-4s | + || Max: %-4s Max: %-4s | + || | + |+--------------------------------------------------------------------------------------------------+""" + .stripMargin.format( + rxBytes.min, txBytes.min, rxErrors.total, txErrors.total, + rxBytes.average, txBytes.average, + rxBytes.max, txBytes.max)) + } + def logTraceMetrics(name: String, tms: TraceMetricsSnapshot): Unit = { val traceMetricsData = StringBuilder.newBuilder @@ -248,5 +308,13 @@ object LogReporterSubscriber { return acc / histogram.numberOfMeasurements } + + def total: Long = { + histogram.recordsIterator.foldLeft(0L) { (acc, record) ⇒ + { + acc + (record.count * record.level) + } + } + } } }
\ No newline at end of file diff --git a/kamon-playground/src/main/resources/application.conf b/kamon-playground/src/main/resources/application.conf index bac3c97e..5d96c7f6 100644 --- a/kamon-playground/src/main/resources/application.conf +++ b/kamon-playground/src/main/resources/application.conf @@ -1,7 +1,7 @@ akka { loglevel = INFO - extensions = ["kamon.logreporter.LogReporter"] + extensions = ["kamon.logreporter.LogReporter", "kamon.system.SystemMetrics"] actor { debug { @@ -86,7 +86,7 @@ kamon { } weaver { - showWeaveInfo = on + showWeaveInfo = off verbose = off debug = off showWarn = off diff --git a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala index a5a2f411..31963487 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala @@ -42,8 +42,7 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with val networkRecorder = systemMetricsExtension.register(NetworkMetrics(Network), NetworkMetrics.Factory) def receive: Receive = { - case Collect ⇒ collectMetrics() - case anything ⇒ + case Collect ⇒ collectMetrics() } override def postStop() = collectSchedule.cancel() @@ -56,18 +55,24 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with } private def recordCpu(cpur: CPUMetricRecorder) = { - cpur.user.record(toLong(cpu.getUser)) - cpur.system.record(toLong(cpu.getSys)) - cpur.cpuWait.record(toLong(cpu.getWait())) - cpur.idle.record(toLong(cpu.getIdle)) + val cpuPerc = sigar.getCpuPerc + cpur.user.record(toLong(cpuPerc.getUser)) + cpur.system.record(toLong(cpuPerc.getSys)) + cpur.cpuWait.record(toLong(cpuPerc.getWait)) + cpur.idle.record(toLong(cpuPerc.getIdle)) } private def recordProcessCpu(pcpur: ProcessCPUMetricsRecorder) = { + val procCpu = sigar.getProcCpu(pid) + pcpur.user.record(procCpu.getUser) pcpur.system.record(procCpu.getSys) } private def recordMemory(mr: MemoryMetricRecorder) = { + val mem = sigar.getMem + val swap = sigar.getSwap + mr.used.record(toMB(mem.getUsed)) mr.free.record(toMB(mem.getFree)) mr.swapUsed.record(toMB(swap.getUsed)) @@ -106,10 +111,6 @@ trait SigarExtensionProvider { lazy val sigar = SigarHolder.instance() def pid = sigar.getPid - def procCpu = sigar.getProcCpu(pid) - def cpu = sigar.getCpuPerc - def mem = sigar.getMem - def swap = sigar.getSwap val interfaces: Set[String] = sigar.getNetInterfaceList.toSet } diff --git a/version.sbt b/version.sbt index 23a2d9bf..dfd7e193 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.3.4-SNAPSHOT"
\ No newline at end of file +version in ThisBuild := "0.3.4-SNAPSHOT" |