diff options
author | Diego <diegolparra@gmail.com> | 2014-07-23 21:01:27 -0300 |
---|---|---|
committer | Diego <diegolparra@gmail.com> | 2014-07-23 21:01:27 -0300 |
commit | c7a6d66636518a73cae4b79f20e1737f3f02e2ec (patch) | |
tree | 1d64840a058f9f3510e23e5c1530f50272b31461 /kamon-system-metrics/src/main/scala/kamon/system/sigar | |
parent | c1157ec8812d8ac7522910df105400050d521000 (diff) | |
download | Kamon-c7a6d66636518a73cae4b79f20e1737f3f02e2ec.tar.gz Kamon-c7a6d66636518a73cae4b79f20e1737f3f02e2ec.tar.bz2 Kamon-c7a6d66636518a73cae4b79f20e1737f3f02e2ec.zip |
= kamon-system-metrics: Initialization-on-demand holder idiom in order to load one instance of Sigar
Diffstat (limited to 'kamon-system-metrics/src/main/scala/kamon/system/sigar')
23 files changed, 154 insertions, 0 deletions
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 <http://kamon.io/> + * + * 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 Binary files differnew file mode 100644 index 00000000..3e94f0d2 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-freebsd-6.so 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 Binary files differnew file mode 100644 index 00000000..5a2e4c24 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-linux.so 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 Binary files differnew file mode 100644 index 00000000..6396482a --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-amd64-solaris.so 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 Binary files differnew file mode 100644 index 00000000..d92ea4a9 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-hpux-11.sl 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 Binary files differnew file mode 100644 index 00000000..2bd2fc8e --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ia64-linux.so 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 Binary files differnew file mode 100644 index 00000000..0dfd8a11 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-pa-hpux-11.sl 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 Binary files differnew file mode 100644 index 00000000..7d4b5199 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-aix-5.so 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 Binary files differnew file mode 100644 index 00000000..4394b1b0 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc-linux.so 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 Binary files differnew file mode 100644 index 00000000..35fd8288 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-aix-5.so 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 Binary files differnew file mode 100644 index 00000000..a1ba2529 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-ppc64-linux.so 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 Binary files differnew file mode 100644 index 00000000..c275f4ac --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-s390x-linux.so 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 Binary files differnew file mode 100644 index 00000000..aa847d2b --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc-solaris.so 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 Binary files differnew file mode 100644 index 00000000..6c4fe809 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-sparc64-solaris.so 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 Binary files differnew file mode 100644 index 00000000..27ab1071 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal-macosx.dylib 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 Binary files differnew file mode 100644 index 00000000..0c721fec --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-universal64-macosx.dylib 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 Binary files differnew file mode 100644 index 00000000..8c50c611 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-5.so 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 Binary files differnew file mode 100644 index 00000000..f0800274 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-freebsd-6.so 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 Binary files differnew file mode 100644 index 00000000..a0b64edd --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-linux.so 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 Binary files differnew file mode 100644 index 00000000..c6452e56 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/libsigar-x86-solaris.so 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 Binary files differnew file mode 100644 index 00000000..1ec8a035 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-amd64-winnt.dll 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 Binary files differnew file mode 100644 index 00000000..6afdc016 --- /dev/null +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/sigar-x86-winnt.dll |