From 5c141733ad39cf2730cf34dc8f3f4a82f0c1b516 Mon Sep 17 00:00:00 2001 From: Diego Date: Tue, 24 Jun 2014 23:35:14 -0300 Subject: ! kamon-system-metrics: introducing System and JVM metrics module --- .../main/scala/kamon/system/SystemMetrics.scala | 64 ++++++++++ .../scala/kamon/system/native/SigarLoader.scala | 131 +++++++++++++++++++++ .../src/main/scala/kamon/system/native/index | 22 ++++ .../system/native/libsigar-amd64-freebsd-6.so | Bin 0 -> 210641 bytes .../kamon/system/native/libsigar-amd64-linux.so | Bin 0 -> 246605 bytes .../kamon/system/native/libsigar-amd64-solaris.so | Bin 0 -> 251360 bytes .../kamon/system/native/libsigar-ia64-hpux-11.sl | Bin 0 -> 577452 bytes .../kamon/system/native/libsigar-ia64-linux.so | Bin 0 -> 494929 bytes .../kamon/system/native/libsigar-pa-hpux-11.sl | Bin 0 -> 516096 bytes .../kamon/system/native/libsigar-ppc-aix-5.so | Bin 0 -> 400925 bytes .../kamon/system/native/libsigar-ppc-linux.so | Bin 0 -> 258547 bytes .../kamon/system/native/libsigar-ppc64-aix-5.so | Bin 0 -> 425077 bytes .../kamon/system/native/libsigar-ppc64-linux.so | Bin 0 -> 330767 bytes .../kamon/system/native/libsigar-s390x-linux.so | Bin 0 -> 269932 bytes .../kamon/system/native/libsigar-sparc-solaris.so | Bin 0 -> 285004 bytes .../system/native/libsigar-sparc64-solaris.so | Bin 0 -> 261896 bytes .../system/native/libsigar-universal-macosx.dylib | Bin 0 -> 377668 bytes .../native/libsigar-universal64-macosx.dylib | Bin 0 -> 397440 bytes .../kamon/system/native/libsigar-x86-freebsd-5.so | Bin 0 -> 179751 bytes .../kamon/system/native/libsigar-x86-freebsd-6.so | Bin 0 -> 179379 bytes .../kamon/system/native/libsigar-x86-linux.so | Bin 0 -> 233385 bytes .../kamon/system/native/libsigar-x86-solaris.so | Bin 0 -> 242880 bytes .../kamon/system/native/sigar-amd64-winnt.dll | Bin 0 -> 402432 bytes .../scala/kamon/system/native/sigar-x86-winnt.dll | Bin 0 -> 266240 bytes 24 files changed, 217 insertions(+) create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/index create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll create mode 100644 kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll (limited to 'kamon-system-metrics/src/main/scala/kamon/system') 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 + * + * 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 + * + * 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-linux.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ia64-linux.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc-linux.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-s390x-linux.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-linux.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/libsigar-x86-solaris.so 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll 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 Binary files /dev/null and b/kamon-system-metrics/src/main/scala/kamon/system/native/sigar-x86-winnt.dll differ -- cgit v1.2.3