aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kamon-log-reporter/src/main/scala/kamon/logreporter/LogReporter.scala31
-rw-r--r--kamon-system-metrics/src/main/resources/reference.conf10
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/metrics/ProcessCPUMetrics.scala24
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala5
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala29
-rw-r--r--kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala6
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
}
}