diff options
author | Diego <diegolparra@gmail.com> | 2015-11-26 00:50:25 -0300 |
---|---|---|
committer | Diego <diegolparra@gmail.com> | 2015-11-26 00:50:25 -0300 |
commit | 96c9eefdbf8194a7d60006cd02ec3fa61b105882 (patch) | |
tree | dcf57c8dc47ed83092d878cafb1af79ae76ecd87 | |
parent | 8b20cf6440e032750e574d8a6da13084541c1500 (diff) | |
download | Kamon-96c9eefdbf8194a7d60006cd02ec3fa61b105882.tar.gz Kamon-96c9eefdbf8194a7d60006cd02ec3fa61b105882.tar.bz2 Kamon-96c9eefdbf8194a7d60006cd02ec3fa61b105882.zip |
! system-metrics: avoid negatives values of systemDiff and systemPercent, and close #291
-rw-r--r-- | kamon-system-metrics/src/main/scala/kamon/system/sigar/ProcessCpuMetrics.scala | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/ProcessCpuMetrics.scala b/kamon-system-metrics/src/main/scala/kamon/system/sigar/ProcessCpuMetrics.scala index 1283c07d..4d61a66f 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/sigar/ProcessCpuMetrics.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/ProcessCpuMetrics.scala @@ -49,21 +49,27 @@ class ProcessCpuMetrics(sigar: Sigar, instrumentFactory: InstrumentFactory, logg * @see [[http://stackoverflow.com/questions/19323364/using-sigar-api-to-get-jvm-cpu-usage "StackOverflow: Using Sigar API to get JVM Cpu usage"]] */ def update(): Unit = { - val currentProcCpu = sigar.getProcCpu(pid) - val totalDiff = currentProcCpu.getTotal - lastProcCpu.getTotal - val userDiff = currentProcCpu.getUser - lastProcCpu.getUser - val systemDiff = currentProcCpu.getSys - lastProcCpu.getSys - val timeDiff = currentProcCpu.getLastTime - lastProcCpu.getLastTime - def percentUsage(delta: Long): Long = Try(100 * delta / timeDiff / totalCores).getOrElse(0L) + def percentUsage(delta: Long, timeDiff: Long): Long = Try(100 * delta / timeDiff / totalCores).getOrElse(0L) + + def positiveSubtraction(left: Long, right: Long): Long = { + val result = left - right + if (result < 0L) 0L else result + } + + val currentProcCpu = sigar.getProcCpu(pid) + val totalDiff = positiveSubtraction(currentProcCpu.getTotal, lastProcCpu.getTotal) + val userDiff = positiveSubtraction(currentProcCpu.getUser, lastProcCpu.getUser) + val systemDiff = positiveSubtraction(currentProcCpu.getSys, lastProcCpu.getSys) + val timeDiff = positiveSubtraction(currentProcCpu.getLastTime, lastProcCpu.getLastTime) - if (totalDiff == 0) { - if (timeDiff > 2000) currentLoad = 0 - if (currentLoad == 0) lastProcCpu = currentProcCpu + if (totalDiff == 0L) { + if (timeDiff > 2000L) currentLoad = 0L + if (currentLoad == 0L) lastProcCpu = currentProcCpu } else { - val totalPercent = percentUsage(totalDiff) - val userPercent = percentUsage(userDiff) - val systemPercent = percentUsage(systemDiff) + val totalPercent = percentUsage(totalDiff, timeDiff) + val userPercent = percentUsage(userDiff, timeDiff) + val systemPercent = percentUsage(systemDiff, timeDiff) processUserCpu.record(userPercent) processSystemCpu.record(systemPercent) |