diff options
6 files changed, 74 insertions, 31 deletions
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 d58c6330..307343de 100644 --- a/kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala +++ b/kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala @@ -25,9 +25,11 @@ import kamon.metric.TraceMetrics.TraceMetricsSnapshot import kamon.metric.UserMetrics._ import kamon.metric._ import kamon.metric.instrument.{ Counter, Histogram } +import kamon.metrics.GCMetrics.GCMetricSnapshot import kamon.metrics.MemoryMetrics.MemoryMetricSnapshot import kamon.metrics.NetworkMetrics.NetworkMetricSnapshot -import kamon.metrics.{ NetworkMetrics, MemoryMetrics, CPUMetrics } +import kamon.metrics.ProcessCPUMetrics.ProcessCPUMetricsSnapshot +import kamon.metrics._ import kamon.metrics.CPUMetrics.CPUMetricSnapshot object LogReporter extends ExtensionId[LogReporterExtension] with ExtensionIdProvider { @@ -57,11 +59,12 @@ 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) { + // Subscribe to SystemMetrics Kamon(Metrics)(system).subscribe(CPUMetrics, "*", subscriber, permanently = true) + Kamon(Metrics)(system).subscribe(ProcessCPUMetrics, "*", subscriber, permanently = true) Kamon(Metrics)(system).subscribe(NetworkMetrics, "*", subscriber, permanently = true) } @@ -89,6 +92,7 @@ class LogReporterSubscriber extends Actor with ActorLogging { case (m: UserMinMaxCounter, s: UserMinMaxCounterSnapshot) ⇒ minMaxCounters += (m -> s.minMaxCounterSnapshot) case (g: UserGauge, s: UserGaugeSnapshot) ⇒ gauges += (g -> s.gaugeSnapshot) case (_, cms: CPUMetricSnapshot) ⇒ logCpuMetrics(cms) + case (_, pcms: ProcessCPUMetricsSnapshot) ⇒ logProcessCpuMetrics(pcms) case (_, nms: NetworkMetricSnapshot) ⇒ logNetworkMetrics(nms) case ignoreEverythingElse ⇒ } @@ -137,7 +141,7 @@ class LogReporterSubscriber extends Actor with ActorLogging { || | || User (percentage) System (percentage) Wait (percentage) Idle (percentage) | || Min: %-3s Min: %-3s Min: %-3s Min: %-3s | - || Avg: %-3s Avg: %-3s Avg: %-3s Avg: %-3s | + || Avg: %-3s Avg: %-3s Avg: %-3s Avg: %-3s | || Max: %-3s Max: %-3s Max: %-3s Max: %-3s | || | || | @@ -170,6 +174,27 @@ class LogReporterSubscriber extends Actor with ActorLogging { rxBytes.max, txBytes.max)) } + def logProcessCpuMetrics(pcms: ProcessCPUMetricsSnapshot): Unit = { + import pcms._ + + log.info( + """ + |+--------------------------------------------------------------------------------------------------+ + || | + || Process-CPU | + || | + || Cpu-Percentage Total-Process-Time | + || Min: %-12s Min: %-12s | + || Avg: %-12s Avg: %-12s | + || Max: %-12s Max: %-12s | + || | + |+--------------------------------------------------------------------------------------------------+""" + .stripMargin.format( + (cpuPercent.min / 100), totalProcessTime.min, + (cpuPercent.average / 100), totalProcessTime.average, + (cpuPercent.max / 100), totalProcessTime.max)) + } + def logTraceMetrics(name: String, tms: TraceMetricsSnapshot): Unit = { val traceMetricsData = StringBuilder.newBuilder diff --git a/kamon-system-metrics/src/main/resources/reference.conf b/kamon-system-metrics/src/main/resources/reference.conf index 0600388d..e5315223 100644 --- a/kamon-system-metrics/src/main/resources/reference.conf +++ b/kamon-system-metrics/src/main/resources/reference.conf @@ -7,13 +7,11 @@ kamon { precision { system { process-cpu { - user = { - refresh-interval = 100 milliseconds + cpu-percentage = { highest-trackable-value = 999999999 significant-value-digits = 2 } - system = { - refresh-interval = 100 milliseconds + total-process-time = { highest-trackable-value = 999999999 significant-value-digits = 2 } @@ -21,22 +19,18 @@ kamon { cpu { user = { - refresh-interval = 100 milliseconds highest-trackable-value = 999 significant-value-digits = 2 } system = { - refresh-interval = 100 milliseconds highest-trackable-value = 999 significant-value-digits = 2 } wait = { - refresh-interval = 100 milliseconds highest-trackable-value = 999 significant-value-digits = 2 } idle ={ - refresh-interval = 100 milliseconds highest-trackable-value = 999 significant-value-digits = 2 } diff --git a/kamon-system-metrics/src/main/scala/kamon/metrics/ProcessCPUMetrics.scala b/kamon-system-metrics/src/main/scala/kamon/metrics/ProcessCPUMetrics.scala index 61f7ddb2..21f76a12 100644 --- a/kamon-system-metrics/src/main/scala/kamon/metrics/ProcessCPUMetrics.scala +++ b/kamon-system-metrics/src/main/scala/kamon/metrics/ProcessCPUMetrics.scala @@ -27,31 +27,31 @@ case class ProcessCPUMetrics(name: String) extends MetricGroupIdentity { object ProcessCPUMetrics extends MetricGroupCategory { val name = "proc-cpu" - case object User extends MetricIdentity { val name = "user" } - case object System extends MetricIdentity { val name = "system" } + case object CpuPercent extends MetricIdentity { val name = "cpu-percentage" } + case object TotalProcessTime extends MetricIdentity { val name = "total-process-time" } - case class ProcessCPUMetricsRecorder(user: Histogram, system: Histogram) + case class ProcessCPUMetricsRecorder(cpuPercent: Histogram, totalProcessTime: Histogram) extends MetricGroupRecorder { def collect(context: CollectionContext): MetricGroupSnapshot = { - ProcessCPUMetricsSnapshot(user.collect(context), system.collect(context)) + ProcessCPUMetricsSnapshot(cpuPercent.collect(context), totalProcessTime.collect(context)) } def cleanup: Unit = {} } - case class ProcessCPUMetricsSnapshot(user: Histogram.Snapshot, system: Histogram.Snapshot) + case class ProcessCPUMetricsSnapshot(cpuPercent: Histogram.Snapshot, totalProcessTime: Histogram.Snapshot) extends MetricGroupSnapshot { type GroupSnapshotType = ProcessCPUMetricsSnapshot def merge(that: ProcessCPUMetricsSnapshot, context: CollectionContext): GroupSnapshotType = { - ProcessCPUMetricsSnapshot(user.merge(that.user, context), system.merge(that.system, context)) + ProcessCPUMetricsSnapshot(cpuPercent.merge(that.cpuPercent, context), totalProcessTime.merge(that.totalProcessTime, context)) } lazy val metrics: Map[MetricIdentity, MetricSnapshot] = Map( - User -> user, - System -> system) + CpuPercent -> cpuPercent, + TotalProcessTime -> totalProcessTime) } val Factory = new MetricGroupFactory { @@ -61,12 +61,12 @@ object ProcessCPUMetrics extends MetricGroupCategory { def create(config: Config, system: ActorSystem): GroupRecorder = { val settings = config.getConfig("precision.system.process-cpu") - val userConfig = settings.getConfig("user") - val systemConfig = settings.getConfig("system") + val cpuPercentageConfig = settings.getConfig("cpu-percentage") + val totalProcessTimeConfig = settings.getConfig("total-process-time") new ProcessCPUMetricsRecorder( - Histogram.fromConfig(userConfig), - Histogram.fromConfig(systemConfig)) + Histogram.fromConfig(cpuPercentageConfig), + Histogram.fromConfig(totalProcessTimeConfig)) } } } 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 31963487..725f634d 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala @@ -64,9 +64,10 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with private def recordProcessCpu(pcpur: ProcessCPUMetricsRecorder) = { val procCpu = sigar.getProcCpu(pid) + val procTime = sigar.getProcTime(pid) - pcpur.user.record(procCpu.getUser) - pcpur.system.record(procCpu.getSys) + pcpur.cpuPercent.record(toLong(procCpu.getPercent)) + pcpur.totalProcessTime.record(procTime.getTotal) // gives an idea of what is really measured and then interpreted as % } private def recordMemory(mr: MemoryMetricRecorder) = { diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala b/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala index af49fca5..36e62756 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala @@ -142,10 +142,33 @@ object SigarLoader { } def uptime(sigar: Sigar) = { - val sdf = new SimpleDateFormat("yyyy-MM-dd") + def formatUptime(uptime: Double): String = { + var retval: String = "" + val days: Int = uptime.toInt / (60 * 60 * 24) + var minutes: Int = 0 + var hours: Int = 0 + + if (days != 0) { + retval += s"$days ${(if ((days > 1)) "days" else "day")}, " + } + + minutes = uptime.toInt / 60 + hours = minutes / 60 + hours %= 24 + minutes %= 60 + + if (hours != 0) { + retval += hours + ":" + minutes + } else { + retval += minutes + " min" + } + retval + } + val uptime = sigar.getUptime val now = System.currentTimeMillis() - sdf.format(new Date(now - (uptime.getUptime() * 1000).toLong)) + + s"up ${formatUptime(uptime.getUptime())}" } val message = @@ -162,7 +185,7 @@ object SigarLoader { | | [System Status] [OS Information] | |--------------------------------| |----------------------------------------| - | Boot Time: %-10s Description: %s + | Up Time: %-10s Description: %s | Load Average: %-16s Name: %s | Version: %s | Arch: %s diff --git a/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala b/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala index cda820fc..461fd493 100644 --- a/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala +++ b/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala @@ -205,12 +205,12 @@ class SystemMetricsSpec extends TestKitBase with WordSpecLike with Matchers { } "the Kamon Process CPU Metrics" should { - "record user, system metrics" in new ProcessCPUMetricsListenerFixture { + "record Cpu Percent, Total ProcessbTime metrics" in new ProcessCPUMetricsListenerFixture { val metricsListener = subscribeToMetrics() val ProcessCPUMetrics = expectProcessCPUMetrics(metricsListener, 3 seconds) - ProcessCPUMetrics.user.max should be > 0L - ProcessCPUMetrics.system.max should be > 0L + ProcessCPUMetrics.cpuPercent.max should be > 0L + ProcessCPUMetrics.totalProcessTime.max should be > 0L } } |