From c7a6d66636518a73cae4b79f20e1737f3f02e2ec Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 23 Jul 2014 21:01:27 -0300 Subject: = kamon-system-metrics: Initialization-on-demand holder idiom in order to load one instance of Sigar --- .../src/main/java/kamon/system/SigarHolder.java | 30 +++++ .../src/main/scala/kamon/metrics/CPUMetrics.scala | 2 +- .../main/scala/kamon/system/SystemMetrics.scala | 4 +- .../scala/kamon/system/native/SigarLoader.scala | 132 --------------------- .../src/main/scala/kamon/system/native/index | 22 ---- .../system/native/libsigar-amd64-freebsd-6.so | Bin 210641 -> 0 bytes .../kamon/system/native/libsigar-amd64-linux.so | Bin 246605 -> 0 bytes .../kamon/system/native/libsigar-amd64-solaris.so | Bin 251360 -> 0 bytes .../kamon/system/native/libsigar-ia64-hpux-11.sl | Bin 577452 -> 0 bytes .../kamon/system/native/libsigar-ia64-linux.so | Bin 494929 -> 0 bytes .../kamon/system/native/libsigar-pa-hpux-11.sl | Bin 516096 -> 0 bytes .../kamon/system/native/libsigar-ppc-aix-5.so | Bin 400925 -> 0 bytes .../kamon/system/native/libsigar-ppc-linux.so | Bin 258547 -> 0 bytes .../kamon/system/native/libsigar-ppc64-aix-5.so | Bin 425077 -> 0 bytes .../kamon/system/native/libsigar-ppc64-linux.so | Bin 330767 -> 0 bytes .../kamon/system/native/libsigar-s390x-linux.so | Bin 269932 -> 0 bytes .../kamon/system/native/libsigar-sparc-solaris.so | Bin 285004 -> 0 bytes .../system/native/libsigar-sparc64-solaris.so | Bin 261896 -> 0 bytes .../system/native/libsigar-universal-macosx.dylib | Bin 377668 -> 0 bytes .../native/libsigar-universal64-macosx.dylib | Bin 397440 -> 0 bytes .../kamon/system/native/libsigar-x86-freebsd-5.so | Bin 179751 -> 0 bytes .../kamon/system/native/libsigar-x86-freebsd-6.so | Bin 179379 -> 0 bytes .../kamon/system/native/libsigar-x86-linux.so | Bin 233385 -> 0 bytes .../kamon/system/native/libsigar-x86-solaris.so | Bin 242880 -> 0 bytes .../kamon/system/native/sigar-amd64-winnt.dll | Bin 402432 -> 0 bytes .../scala/kamon/system/native/sigar-x86-winnt.dll | Bin 266240 -> 0 bytes .../scala/kamon/system/sigar/SigarLoader.scala | 132 +++++++++++++++++++++ .../src/main/scala/kamon/system/sigar/index | 22 ++++ .../kamon/system/sigar/libsigar-amd64-freebsd-6.so | Bin 0 -> 210641 bytes .../kamon/system/sigar/libsigar-amd64-linux.so | Bin 0 -> 246605 bytes .../kamon/system/sigar/libsigar-amd64-solaris.so | Bin 0 -> 251360 bytes .../kamon/system/sigar/libsigar-ia64-hpux-11.sl | Bin 0 -> 577452 bytes .../kamon/system/sigar/libsigar-ia64-linux.so | Bin 0 -> 494929 bytes .../kamon/system/sigar/libsigar-pa-hpux-11.sl | Bin 0 -> 516096 bytes .../scala/kamon/system/sigar/libsigar-ppc-aix-5.so | Bin 0 -> 400925 bytes .../scala/kamon/system/sigar/libsigar-ppc-linux.so | Bin 0 -> 258547 bytes .../kamon/system/sigar/libsigar-ppc64-aix-5.so | Bin 0 -> 425077 bytes .../kamon/system/sigar/libsigar-ppc64-linux.so | Bin 0 -> 330767 bytes .../kamon/system/sigar/libsigar-s390x-linux.so | Bin 0 -> 269932 bytes .../kamon/system/sigar/libsigar-sparc-solaris.so | Bin 0 -> 285004 bytes .../kamon/system/sigar/libsigar-sparc64-solaris.so | Bin 0 -> 261896 bytes .../system/sigar/libsigar-universal-macosx.dylib | Bin 0 -> 377668 bytes .../system/sigar/libsigar-universal64-macosx.dylib | Bin 0 -> 397440 bytes .../kamon/system/sigar/libsigar-x86-freebsd-5.so | Bin 0 -> 179751 bytes .../kamon/system/sigar/libsigar-x86-freebsd-6.so | Bin 0 -> 179379 bytes .../scala/kamon/system/sigar/libsigar-x86-linux.so | Bin 0 -> 233385 bytes .../kamon/system/sigar/libsigar-x86-solaris.so | Bin 0 -> 242880 bytes .../scala/kamon/system/sigar/sigar-amd64-winnt.dll | Bin 0 -> 402432 bytes .../scala/kamon/system/sigar/sigar-x86-winnt.dll | Bin 0 -> 266240 bytes 49 files changed, 187 insertions(+), 157 deletions(-) create mode 100644 kamon-system-metrics/src/main/java/kamon/system/SigarHolder.java delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/index delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll delete mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/index create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-freebsd-6.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-hpux-11.sl create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-pa-hpux-11.sl create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-aix-5.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-aix-5.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-s390x-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc64-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal-macosx.dylib create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal64-macosx.dylib create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-5.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-6.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-amd64-winnt.dll create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-x86-winnt.dll (limited to 'kamon-system-metrics/src') diff --git a/kamon-system-metrics/src/main/java/kamon/system/SigarHolder.java b/kamon-system-metrics/src/main/java/kamon/system/SigarHolder.java new file mode 100644 index 00000000..d00750df --- /dev/null +++ b/kamon-system-metrics/src/main/java/kamon/system/SigarHolder.java @@ -0,0 +1,30 @@ +/* + * ========================================================================================= + * Copyright © 2013-2014 the kamon project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + * ========================================================================================= + */ + +package kamon.system; + +import kamon.system.sigar.SigarLoader; +import org.hyperic.sigar.SigarProxy; + +public class SigarHolder { + private static class LazySigarHolder { + static final SigarProxy instance = SigarLoader.sigarProxy(); + } + + public static SigarProxy instance() { + return LazySigarHolder.instance; + } +} diff --git a/kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala b/kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala index a45896ac..89ec5729 100644 --- a/kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala +++ b/kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala @@ -18,7 +18,7 @@ package kamon.metrics import akka.actor.ActorSystem import com.typesafe.config.Config import kamon.metric._ -import kamon.metric.instrument.{Gauge, Histogram} +import kamon.metric.instrument.{ Gauge, Histogram } import kamon.system.SigarExtensionProvider case class CPUMetrics(name: String) extends MetricGroupIdentity { diff --git a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala index a46d8e1f..bd156c2a 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala @@ -22,7 +22,7 @@ import akka.event.Logging import kamon.Kamon import kamon.metric.Metrics import kamon.metrics._ -import kamon.system.native.SigarLoader + import scala.collection.JavaConverters._ object SystemMetrics extends ExtensionId[SystemMetricsExtension] with ExtensionIdProvider { @@ -60,6 +60,6 @@ object SystemMetricsExtension { } trait SigarExtensionProvider { - lazy val sigar = SigarLoader.sigarProxy + lazy val sigar = SigarHolder.instance() } diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala b/kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala deleted file mode 100644 index f1072f56..00000000 --- a/kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ========================================================================================= - * Copyright © 2013-2014 the kamon project - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the - * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the specific language governing permissions - * and limitations under the License. - * ========================================================================================= - */ - -package kamon.system.native - -import java.io._ -import java.util -import java.util.logging.Logger -import java.util.{ ArrayList, List } - -import kamon.system.SynchronizedSigar -import org.hyperic.sigar.SigarProxy - -import scala.annotation.tailrec -import scala.collection.JavaConversions._ -import scala.io.Source - -object SigarLoader { - - val Version = "1.6.4" - val JavaLibraryPath = "java.library.path" - val TmpDir = "java.io.tmpdir" - val IndexFile = "/kamon/system/native/index" - val UsrPathField = "usr_paths" - - private val log = Logger.getLogger("SigarLoader") - - lazy val sigarProxy = init(new File(System.getProperty(TmpDir))) - - private[native] def init(baseTmp: File): SigarProxy = { - val tmpDir = createTmpDir(baseTmp) - for (lib ← loadIndex) copy(lib, tmpDir) - - attachToLibraryPath(tmpDir) - - try { - val sigar = new SynchronizedSigar() - sigar.getPid - sigar - } catch { - case t: Throwable ⇒ { - log.severe("Failed to load sigar") - throw new RuntimeException(t) - } - } - } - - private[native] val usrPathField = { - val usrPathField = classOf[ClassLoader].getDeclaredField(UsrPathField) - usrPathField.setAccessible(true) - usrPathField - } - - private[native] 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[native] def newLibraryPath(dirAbsolutePath: String): String = { - Option(System.getProperty(JavaLibraryPath)).fold(dirAbsolutePath)(oldValue ⇒ s"$dirAbsolutePath${File.pathSeparator}$oldValue") - } - - private[native] def copy(lib: String, tmpDir: File) { - val target = new File(tmpDir, lib) - if (target.exists()) return - write(classOf[Loader].getResourceAsStream(lib), target) - } - - private[native] 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[native] 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[native] def write(input: InputStream, to: File) { - val out = new FileOutputStream(to) - try { - transfer(input, out) - } finally { - out.close() - } - } - - private[native] 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() - } - - class Loader private[native] -} diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/index b/kamon-system-metrics/src/main/scala/kamon/system/native/index deleted file mode 100644 index ebc7f952..00000000 --- a/kamon-system-metrics/src/main/scala/kamon/system/native/index +++ /dev/null @@ -1,22 +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 - diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so deleted file mode 100644 index 3e94f0d2..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so deleted file mode 100644 index 5a2e4c24..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so deleted file mode 100644 index 6396482a..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl deleted file mode 100644 index d92ea4a9..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so deleted file mode 100644 index 2bd2fc8e..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl deleted file mode 100644 index 0dfd8a11..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so deleted file mode 100644 index 7d4b5199..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so deleted file mode 100644 index 4394b1b0..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so deleted file mode 100644 index 35fd8288..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so deleted file mode 100644 index a1ba2529..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so deleted file mode 100644 index c275f4ac..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so deleted file mode 100644 index aa847d2b..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so deleted file mode 100644 index 6c4fe809..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib deleted file mode 100644 index 27ab1071..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib deleted file mode 100644 index 0c721fec..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so deleted file mode 100644 index 8c50c611..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so deleted file mode 100644 index f0800274..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so deleted file mode 100644 index a0b64edd..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so deleted file mode 100644 index c6452e56..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll b/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll deleted file mode 100644 index 1ec8a035..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll and /dev/null differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll b/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll deleted file mode 100644 index 6afdc016..00000000 Binary files a/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll and /dev/null differ 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 new file mode 100644 index 00000000..0c78504e --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarLoader.scala @@ -0,0 +1,132 @@ +/* + * ========================================================================================= + * Copyright © 2013-2014 the kamon project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions + * and limitations under the License. + * ========================================================================================= + */ + +package kamon.system.sigar + +import java.io._ +import java.util +import java.util.logging.Logger +import java.util.{ ArrayList, List } + +import kamon.system.SynchronizedSigar +import org.hyperic.sigar.SigarProxy + +import scala.annotation.tailrec +import scala.collection.JavaConversions._ +import scala.io.Source + +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 SynchronizedSigar() + sigar.getPid + 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") + } + + 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() + } + + class Loader private[sigar] +} diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/index b/kamon-system-metrics/src/main/scala/kamon/system/sigar/index new file mode 100644 index 00000000..ebc7f952 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/index @@ -0,0 +1,22 @@ +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 + diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-freebsd-6.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-freebsd-6.so new file mode 100644 index 00000000..3e94f0d2 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-freebsd-6.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-linux.so new file mode 100644 index 00000000..5a2e4c24 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-linux.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-solaris.so new file mode 100644 index 00000000..6396482a Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-solaris.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-hpux-11.sl b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-hpux-11.sl new file mode 100644 index 00000000..d92ea4a9 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-hpux-11.sl differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-linux.so new file mode 100644 index 00000000..2bd2fc8e Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-linux.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-pa-hpux-11.sl b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-pa-hpux-11.sl new file mode 100644 index 00000000..0dfd8a11 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-pa-hpux-11.sl differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-aix-5.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-aix-5.so new file mode 100644 index 00000000..7d4b5199 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-aix-5.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-linux.so new file mode 100644 index 00000000..4394b1b0 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-linux.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-aix-5.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-aix-5.so new file mode 100644 index 00000000..35fd8288 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-aix-5.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-linux.so new file mode 100644 index 00000000..a1ba2529 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-linux.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-s390x-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-s390x-linux.so new file mode 100644 index 00000000..c275f4ac Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-s390x-linux.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc-solaris.so new file mode 100644 index 00000000..aa847d2b Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc-solaris.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc64-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc64-solaris.so new file mode 100644 index 00000000..6c4fe809 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc64-solaris.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal-macosx.dylib b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal-macosx.dylib new file mode 100644 index 00000000..27ab1071 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal-macosx.dylib differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal64-macosx.dylib b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal64-macosx.dylib new file mode 100644 index 00000000..0c721fec Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal64-macosx.dylib differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-5.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-5.so new file mode 100644 index 00000000..8c50c611 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-5.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-6.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-6.so new file mode 100644 index 00000000..f0800274 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-6.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-linux.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-linux.so new file mode 100644 index 00000000..a0b64edd Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-linux.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-solaris.so b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-solaris.so new file mode 100644 index 00000000..c6452e56 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-solaris.so differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-amd64-winnt.dll b/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-amd64-winnt.dll new file mode 100644 index 00000000..1ec8a035 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-amd64-winnt.dll differ diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-x86-winnt.dll b/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-x86-winnt.dll new file mode 100644 index 00000000..6afdc016 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-x86-winnt.dll differ -- cgit v1.2.3