aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2015-11-26 00:50:25 -0300
committerDiego <diegolparra@gmail.com>2015-11-26 00:50:25 -0300
commit96c9eefdbf8194a7d60006cd02ec3fa61b105882 (patch)
treedcf57c8dc47ed83092d878cafb1af79ae76ecd87
parent8b20cf6440e032750e574d8a6da13084541c1500 (diff)
downloadKamon-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.scala30
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)