aboutsummaryrefslogtreecommitdiff
path: root/kamon-system-metrics/src/main/scala/kamon/system
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2014-06-24 23:35:14 -0300
committerDiego <diegolparra@gmail.com>2014-07-21 17:13:28 -0300
commit5c141733ad39cf2730cf34dc8f3f4a82f0c1b516 (patch)
treeab2830795cacae80aa232e41ed224534572ba678 /kamon-system-metrics/src/main/scala/kamon/system
parenta96f6dadd5f77271672215e731b842ce785954f4 (diff)
downloadKamon-5c141733ad39cf2730cf34dc8f3f4a82f0c1b516.tar.gz
Kamon-5c141733ad39cf2730cf34dc8f3f4a82f0c1b516.tar.bz2
Kamon-5c141733ad39cf2730cf34dc8f3f4a82f0c1b516.zip
! kamon-system-metrics: introducing System and JVM metrics module
Diffstat (limited to 'kamon-system-metrics/src/main/scala/kamon/system')
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala64
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala131
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/index22
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.sobin0 -> 210641 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.sobin0 -> 246605 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.sobin0 -> 251360 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.slbin0 -> 577452 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.sobin0 -> 494929 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.slbin0 -> 516096 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.sobin0 -> 400925 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.sobin0 -> 258547 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.sobin0 -> 425077 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.sobin0 -> 330767 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.sobin0 -> 269932 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.sobin0 -> 285004 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.sobin0 -> 261896 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylibbin0 -> 377668 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylibbin0 -> 397440 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.sobin0 -> 179751 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.sobin0 -> 179379 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.sobin0 -> 233385 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.sobin0 -> 242880 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dllbin0 -> 402432 bytes
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dllbin0 -> 266240 bytes
24 files changed, 217 insertions, 0 deletions
diff --git a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala
new file mode 100644
index 00000000..e46fca24
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala
@@ -0,0 +1,64 @@
+/*
+ * =========================================================================================
+ * 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
+
+import java.lang.management.ManagementFactory
+
+import akka.actor._
+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 {
+ override def lookup(): ExtensionId[_ <: Extension] = SystemMetrics
+
+ override def createExtension(system: ExtendedActorSystem): SystemMetricsExtension = new SystemMetricsExtension(system)
+}
+
+class SystemMetricsExtension(private val system: ExtendedActorSystem) extends Kamon.Extension {
+ import kamon.system.SystemMetricsExtension._
+
+ val log = Logging(system, classOf[SystemMetricsExtension])
+
+ log.info(s"Starting the Kamon(SystemMetrics) extension")
+
+ val systemMetricsExtension = Kamon(Metrics)(system)
+
+ systemMetricsExtension.register(CPUMetrics(CPU), CPUMetrics.Factory)
+ systemMetricsExtension.register(ProcessCPUMetrics(ProcessCPU), ProcessCPUMetrics.Factory)
+ systemMetricsExtension.register(NetworkMetrics(Network), NetworkMetrics.Factory)
+ systemMetricsExtension.register(MemoryMetrics(Memory), MemoryMetrics.Factory)
+ systemMetricsExtension.register(HeapMetrics(Heap), HeapMetrics.Factory)
+
+ garbageCollectors.map { gc ⇒ systemMetricsExtension.register(GCMetrics(gc.getName), GCMetrics.Factory(gc)) }
+}
+
+object SystemMetricsExtension {
+ val CPU = "cpu"
+ val ProcessCPU = "process-cpu"
+ val Network = "network"
+ val Memory = "memory"
+ val Heap = "heap"
+
+ val garbageCollectors = ManagementFactory.getGarbageCollectorMXBeans.asScala.filter(_.isValid)
+}
+
+trait SigarExtensionProvider {
+ lazy val sigar = SigarLoader.sigarProxy
+}
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
new file mode 100644
index 00000000..6af0a6d2
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala
@@ -0,0 +1,131 @@
+/*
+ * =========================================================================================
+ * 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.native
+
+import java.io._
+import java.util
+import java.util.logging.Logger
+import java.util.{ ArrayList, List }
+
+import org.hyperic.sigar.{ SigarProxy, SigarProxyCache }
+
+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")
+
+ def 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 = SigarProxyCache.newInstance()
+ 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
new file mode 100644
index 00000000..ebc7f952
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/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/native/libsigar-amd64-freebsd-6.so b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so
new file mode 100644
index 00000000..3e94f0d2
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so
Binary files 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
new file mode 100644
index 00000000..5a2e4c24
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so
Binary files 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
new file mode 100644
index 00000000..6396482a
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so
Binary files 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
new file mode 100644
index 00000000..d92ea4a9
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl
Binary files 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
new file mode 100644
index 00000000..2bd2fc8e
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so
Binary files 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
new file mode 100644
index 00000000..0dfd8a11
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl
Binary files 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
new file mode 100644
index 00000000..7d4b5199
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so
Binary files 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
new file mode 100644
index 00000000..4394b1b0
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so
Binary files 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
new file mode 100644
index 00000000..35fd8288
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so
Binary files 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
new file mode 100644
index 00000000..a1ba2529
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so
Binary files 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
new file mode 100644
index 00000000..c275f4ac
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so
Binary files 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
new file mode 100644
index 00000000..aa847d2b
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so
Binary files 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
new file mode 100644
index 00000000..6c4fe809
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so
Binary files 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
new file mode 100644
index 00000000..27ab1071
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib
Binary files 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
new file mode 100644
index 00000000..0c721fec
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib
Binary files 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
new file mode 100644
index 00000000..8c50c611
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so
Binary files 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
new file mode 100644
index 00000000..f0800274
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so
Binary files 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
new file mode 100644
index 00000000..a0b64edd
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so
Binary files 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
new file mode 100644
index 00000000..c6452e56
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so
Binary files 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
new file mode 100644
index 00000000..1ec8a035
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll
Binary files 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
new file mode 100644
index 00000000..6afdc016
--- /dev/null
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll
Binary files differ