diff options
Diffstat (limited to 'kamon-system-metrics')
24 files changed, 31 insertions, 157 deletions
diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/index b/kamon-system-metrics/src/main/resources/kamon/system/sigar/index deleted file mode 100644 index cad1f326..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/index +++ /dev/null @@ -1,21 +0,0 @@ -libsigar-amd64-freebsd-6.so -libsigar-amd64-linux.so -libsigar-amd64-solaris.so -libsigar-ia64-hpux-11.sl -libsigar-ia64-linux.so -libsigar-pa-hpux-11.sl -libsigar-ppc64-aix-5.so -libsigar-ppc64-linux.so -libsigar-ppc-aix-5.so -libsigar-ppc-linux.so -libsigar-s390x-linux.so -libsigar-sparc64-solaris.so -libsigar-sparc-solaris.so -libsigar-universal64-macosx.dylib -libsigar-universal-macosx.dylib -libsigar-x86-freebsd-5.so -libsigar-x86-freebsd-6.so -libsigar-x86-linux.so -libsigar-x86-solaris.so -sigar-amd64-winnt.dll -sigar-x86-winnt.dll
\ No newline at end of file diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-freebsd-6.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-freebsd-6.so Binary files differdeleted file mode 100644 index 3e94f0d2..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-freebsd-6.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-linux.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-linux.so Binary files differdeleted file mode 100644 index 5a2e4c24..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-linux.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-solaris.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-solaris.so Binary files differdeleted file mode 100644 index 6396482a..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-amd64-solaris.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ia64-hpux-11.sl b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ia64-hpux-11.sl Binary files differdeleted file mode 100644 index d92ea4a9..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ia64-hpux-11.sl +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ia64-linux.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ia64-linux.so Binary files differdeleted file mode 100644 index 2bd2fc8e..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ia64-linux.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-pa-hpux-11.sl b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-pa-hpux-11.sl Binary files differdeleted file mode 100644 index 0dfd8a11..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-pa-hpux-11.sl +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc-aix-5.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc-aix-5.so Binary files differdeleted file mode 100644 index 7d4b5199..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc-aix-5.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc-linux.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc-linux.so Binary files differdeleted file mode 100644 index 4394b1b0..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc-linux.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc64-aix-5.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc64-aix-5.so Binary files differdeleted file mode 100644 index 35fd8288..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc64-aix-5.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc64-linux.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc64-linux.so Binary files differdeleted file mode 100644 index a1ba2529..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-ppc64-linux.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-s390x-linux.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-s390x-linux.so Binary files differdeleted file mode 100644 index c275f4ac..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-s390x-linux.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-sparc-solaris.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-sparc-solaris.so Binary files differdeleted file mode 100644 index aa847d2b..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-sparc-solaris.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-sparc64-solaris.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-sparc64-solaris.so Binary files differdeleted file mode 100644 index 6c4fe809..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-sparc64-solaris.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-universal-macosx.dylib b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-universal-macosx.dylib Binary files differdeleted file mode 100644 index 27ab1071..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-universal-macosx.dylib +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-universal64-macosx.dylib b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-universal64-macosx.dylib Binary files differdeleted file mode 100644 index 0c721fec..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-universal64-macosx.dylib +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-freebsd-5.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-freebsd-5.so Binary files differdeleted file mode 100644 index 8c50c611..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-freebsd-5.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-freebsd-6.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-freebsd-6.so Binary files differdeleted file mode 100644 index f0800274..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-freebsd-6.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-linux.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-linux.so Binary files differdeleted file mode 100644 index a0b64edd..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-linux.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-solaris.so b/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-solaris.so Binary files differdeleted file mode 100644 index c6452e56..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/libsigar-x86-solaris.so +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/sigar-amd64-winnt.dll b/kamon-system-metrics/src/main/resources/kamon/system/sigar/sigar-amd64-winnt.dll Binary files differdeleted file mode 100644 index 1ec8a035..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/sigar-amd64-winnt.dll +++ /dev/null diff --git a/kamon-system-metrics/src/main/resources/kamon/system/sigar/sigar-x86-winnt.dll b/kamon-system-metrics/src/main/resources/kamon/system/sigar/sigar-x86-winnt.dll Binary files differdeleted file mode 100644 index 6afdc016..00000000 --- a/kamon-system-metrics/src/main/resources/kamon/system/sigar/sigar-x86-winnt.dll +++ /dev/null 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 f41a76d5..2fe66a43 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala @@ -17,7 +17,7 @@ package kamon.system import java.io.IOException -import akka.actor.{ ActorLogging, Actor, Props } +import akka.actor.{ Actor, ActorLogging, Props } import kamon.Kamon import kamon.metric.Metrics import kamon.metrics.CPUMetrics.CPUMetricRecorder @@ -26,7 +26,7 @@ import kamon.metrics.MemoryMetrics.MemoryMetricRecorder import kamon.metrics.NetworkMetrics.NetworkMetricRecorder import kamon.metrics.ProcessCPUMetrics.ProcessCPUMetricsRecorder import kamon.metrics._ -import kamon.system.sigar.SigarHolder +import kamon.system.sigar.SigarLoader import org.hyperic.sigar.{ Mem, NetInterfaceStat, SigarProxy } import scala.concurrent.duration.FiniteDuration @@ -89,8 +89,8 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with mr.buffer.record(toMB(collectBuffer(mem))) mr.cache.record(toMB(collectCache(mem))) - def collectBuffer(mem: Mem): Long = if (mem.getUsed() != mem.getActualUsed()) mem.getActualUsed() else 0L - def collectCache(mem: Mem): Long = if (mem.getFree() != mem.getActualFree()) mem.getActualFree() else 0L + def collectBuffer(mem: Mem): Long = if (mem.getUsed != mem.getActualUsed) mem.getActualUsed else 0L + def collectCache(mem: Mem): Long = if (mem.getFree != mem.getActualFree) mem.getActualFree else 0L } private def recordNetwork(nr: NetworkMetricRecorder) = { @@ -109,7 +109,7 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with } } - private def recordContextSwitches(ctxt: ContextSwitchesMetricsRecorder) = { + private def recordContextSwitches(rcs: ContextSwitchesMetricsRecorder) = { def contextSwitchesByProcess(pid: Long): (Long, Long) = { val filename = s"/proc/$pid/status" var voluntaryContextSwitches = 0L @@ -125,9 +125,7 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with } } } catch { - case ex: IOException ⇒ { - log.error("Error trying to read [{}]", filename) - } + case ex: IOException ⇒ log.error("Error trying to read [{}]", filename) } (voluntaryContextSwitches, nonVoluntaryContextSwitches) } @@ -138,22 +136,20 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with try { for (line ← Source.fromFile(filename).getLines()) { - if (line.startsWith("ctxt")) { + if (line.startsWith("rcs")) { contextSwitches = line.substring(line.indexOf(" ") + 1).toLong } } } catch { - case ex: IOException ⇒ { - log.error("Error trying to read [{}]", filename) - } + case ex: IOException ⇒ log.error("Error trying to read [{}]", filename) } contextSwitches } val (perProcessVoluntary, perProcessNonVoluntary) = contextSwitchesByProcess(pid) - ctxt.perProcessVoluntary.record(perProcessVoluntary) - ctxt.perProcessNonVoluntary.record(perProcessNonVoluntary) - ctxt.global.record(contextSwitches) + rcs.perProcessVoluntary.record(perProcessVoluntary) + rcs.perProcessNonVoluntary.record(perProcessNonVoluntary) + rcs.global.record(contextSwitches) } } @@ -161,14 +157,14 @@ object SystemMetricsCollector { case object Collect object OsUtils { - def isLinux: Boolean = System.getProperty("os.name").indexOf("Linux") != -1; + def isLinux: Boolean = System.getProperty("os.name").indexOf("Linux") != -1 } def props(collectInterval: FiniteDuration): Props = Props[SystemMetricsCollector](new SystemMetricsCollector(collectInterval)) } trait SigarExtensionProvider { - lazy val sigar = SigarHolder.instance() + lazy val sigar = SigarLoader.instance def pid = sigar.getPid 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 607ebe13..1b33fd6f 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 @@ -17,134 +17,33 @@ package kamon.system.sigar import java.io._ -import java.text.SimpleDateFormat -import java.util import java.util.logging.Logger -import java.util.{ ArrayList, Date, List } - +import kamon.sigar.SigarAgent import org.hyperic.sigar._ - -import scala.annotation.tailrec -import scala.collection.JavaConversions._ -import scala.io.Source - -object SigarHolder { - private lazy val sigarProxy = SigarLoader.sigarProxy - def instance() = sigarProxy -} +import scala.util.control.{ NoStackTrace, NonFatal } object SigarLoader { - - val Version = "1.6.4" - val JavaLibraryPath = "java.library.path" - val TmpDir = "java.io.tmpdir" - val IndexFile = "/kamon/system/sigar/index" - val UsrPathField = "usr_paths" - private val log = Logger.getLogger("SigarLoader") - def sigarProxy = init(new File(System.getProperty(TmpDir))) - - private[sigar] def init(baseTmp: File): SigarProxy = { - val tmpDir = createTmpDir(baseTmp) - for (lib ← loadIndex) copy(lib, tmpDir) - - attachToLibraryPath(tmpDir) - - try { - val sigar = new Sigar() - printBanner(sigar) - sigar - } catch { - case t: Throwable ⇒ { - log.severe("Failed to load sigar") - throw new RuntimeException(t) - } - } - } - - private[sigar] val usrPathField = { - val usrPathField = classOf[ClassLoader].getDeclaredField(UsrPathField) - usrPathField.setAccessible(true) - usrPathField - } - - private[sigar] def attachToLibraryPath(dir: File): Unit = { - val dirAbsolute = dir.getAbsolutePath - System.setProperty(JavaLibraryPath, newLibraryPath(dirAbsolute)) - var paths = usrPathField.get(null).asInstanceOf[Array[String]] - if (paths == null) paths = new Array[String](0) - for (path ← paths) if (path == dirAbsolute) return - val newPaths = util.Arrays.copyOf(paths, paths.length + 1) - newPaths(newPaths.length - 1) = dirAbsolute - usrPathField.set(null, newPaths) - } - - private[sigar] def newLibraryPath(dirAbsolutePath: String): String = { - Option(System.getProperty(JavaLibraryPath)).fold(dirAbsolutePath)(oldValue ⇒ s"$dirAbsolutePath${File.pathSeparator}$oldValue") - } + lazy val instance = init(new File(System.getProperty("java.io.tmpdir"))) - private[sigar] def copy(lib: String, tmpDir: File) { - val target = new File(tmpDir, lib) - if (target.exists()) return - write(classOf[Loader].getResourceAsStream(lib), target) - } - - private[sigar] def createTmpDir(baseTmp: File): File = { - val tmpDir = new File(baseTmp, s"sigar-$Version") - if (!tmpDir.exists()) { - if (!tmpDir.mkdirs()) throw new RuntimeException(s"Could not create temp sigar directory: ${tmpDir.getAbsolutePath}") - } - if (!tmpDir.isDirectory) throw new RuntimeException(s"sigar temp directory path is not a directory: ${tmpDir.getAbsolutePath}") - if (!tmpDir.canWrite()) throw new RuntimeException(s"sigar temp directory not writeable: ${tmpDir.getAbsolutePath}") - tmpDir - } - - private[sigar] def loadIndex(): List[String] = { - val libs = new ArrayList[String]() - val is = classOf[Loader].getResourceAsStream(IndexFile) - - for (line ← Source.fromInputStream(is).getLines()) { - val currentLine = line.trim() - libs add currentLine - } - libs - } - - private[sigar] def write(input: InputStream, to: File) { - val out = new FileOutputStream(to) - try { - transfer(input, out) - } finally { - out.close() - } - } - - private[sigar] def transfer(input: InputStream, out: OutputStream) { - val buffer = new Array[Byte](8192) - - @tailrec def transfer() { - val read = input.read(buffer) - if (read >= 0) { - out.write(buffer, 0, read) - transfer() - } - } - transfer() + private[sigar] def init(baseTmp: File): SigarProxy = try { + SigarAgent.provision(baseTmp) + val sigar = new Sigar() + printBanner(sigar) + sigar + } catch { + case NonFatal(t) ⇒ throw new UnexpectedSigarException("Failed to load sigar") } private[sigar] def printBanner(sigar: Sigar) = { val os = OperatingSystem.getInstance - def loadAverage(sigar: Sigar) = { - try { - val average = sigar.getLoadAverage - (average(0), average(1), average(2)) - } catch { - case s: org.hyperic.sigar.SigarNotImplementedException ⇒ { - (0d, 0d, 0d) - } - } + def loadAverage(sigar: Sigar) = try { + val average = sigar.getLoadAverage + (average(0), average(1), average(2)) + } catch { + case s: org.hyperic.sigar.SigarNotImplementedException ⇒ (0d, 0d, 0d) } def uptime(sigar: Sigar) = { @@ -155,7 +54,7 @@ object SigarLoader { var hours: Int = 0 if (days != 0) { - retval += s"$days ${(if ((days > 1)) "days" else "day")}, " + retval += s"$days ${if (days > 1) "days" else "day"}, " } minutes = uptime.toInt / 60 @@ -174,7 +73,7 @@ object SigarLoader { val uptime = sigar.getUptime val now = System.currentTimeMillis() - s"up ${formatUptime(uptime.getUptime())}" + s"up ${formatUptime(uptime.getUptime)}" } val message = @@ -199,5 +98,5 @@ object SigarLoader { """.stripMargin.format(uptime(sigar), os.getDescription, loadAverage(sigar), os.getName, os.getVersion, os.getArch) log.info(message) } - class Loader private[sigar] + class UnexpectedSigarException(message: String) extends RuntimeException(message) with NoStackTrace } |