aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2014-05-28 22:25:32 -0300
committerDiego <diegolparra@gmail.com>2014-07-10 23:14:06 -0300
commita96f6dadd5f77271672215e731b842ce785954f4 (patch)
tree9f30261e7e6c9f14613033c7eab26741cc505fa1
parent9d81b6cf128859030f393c07a7d08abc464acbcf (diff)
downloadKamon-a96f6dadd5f77271672215e731b842ce785954f4.tar.gz
Kamon-a96f6dadd5f77271672215e731b842ce785954f4.tar.bz2
Kamon-a96f6dadd5f77271672215e731b842ce785954f4.zip
! core: introduce system + jvm metrics
-rw-r--r--kamon-datadog/src/main/scala/kamon/datadog/Datadog.scala2
-rw-r--r--kamon-system/src/main/resources/reference.conf28
-rw-r--r--kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala74
-rw-r--r--kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala71
-rw-r--r--kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala71
-rw-r--r--kamon-system/src/main/scala/kamon/system/System.scala36
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/SigarLoader.scala82
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/index22
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.sobin0 -> 210641 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-linux.sobin0 -> 246605 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-solaris.sobin0 -> 251360 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.slbin0 -> 577452 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-linux.sobin0 -> 494929 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.slbin0 -> 516096 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.sobin0 -> 400925 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-linux.sobin0 -> 258547 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.sobin0 -> 425077 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-linux.sobin0 -> 330767 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-s390x-linux.sobin0 -> 269932 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-sparc-solaris.sobin0 -> 285004 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.sobin0 -> 261896 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylibbin0 -> 377668 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylibbin0 -> 397440 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.sobin0 -> 179751 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.sobin0 -> 179379 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-x86-linux.sobin0 -> 233385 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/libsigar-x86-solaris.sobin0 -> 242880 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/sigar-amd64-winnt.dllbin0 -> 402432 bytes
-rw-r--r--kamon-system/src/main/scala/kamon/system/native/sigar-x86-winnt.dllbin0 -> 266240 bytes
-rw-r--r--project/Dependencies.scala3
-rw-r--r--project/Projects.scala2
31 files changed, 388 insertions, 3 deletions
diff --git a/kamon-datadog/src/main/scala/kamon/datadog/Datadog.scala b/kamon-datadog/src/main/scala/kamon/datadog/Datadog.scala
index 1ae493f7..1803b833 100644
--- a/kamon-datadog/src/main/scala/kamon/datadog/Datadog.scala
+++ b/kamon-datadog/src/main/scala/kamon/datadog/Datadog.scala
@@ -21,8 +21,6 @@ import kamon.Kamon
import kamon.metric._
import scala.concurrent.duration._
import scala.collection.JavaConverters._
-import com.typesafe.config.Config
-import java.lang.management.ManagementFactory
import akka.event.Logging
import java.net.InetSocketAddress
import java.util.concurrent.TimeUnit.MILLISECONDS
diff --git a/kamon-system/src/main/resources/reference.conf b/kamon-system/src/main/resources/reference.conf
new file mode 100644
index 00000000..94d28106
--- /dev/null
+++ b/kamon-system/src/main/resources/reference.conf
@@ -0,0 +1,28 @@
+# ==================================== #
+# Kamon-System Reference Configuration #
+# ==================================== #
+
+kamon {
+ precision {
+ system {
+ processing-time {
+ highest-trackable-value = 3600000000000
+ significant-value-digits = 2
+ }
+ time-in-mailbox {
+ highest-trackable-value = 3600000000000
+ significant-value-digits = 2
+ }
+ mailbox-size {
+ highest-trackable-value = 999999999
+ significant-value-digits = 2
+ }
+ }
+ jvm {
+ processing-time {
+ highest-trackable-value = 3600000000000
+ significant-value-digits = 2
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala b/kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala
new file mode 100644
index 00000000..17f6fb08
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala
@@ -0,0 +1,74 @@
+package kamon.metrics
+
+import kamon.system.native.SigarLoader
+import org.hyperic.sigar.{NetInterfaceStat, Swap}
+
+trait SigarExtensionProvider {
+ self: MetricsCollector =>
+
+ lazy val sigar = SigarLoader.init
+}
+
+trait MetricsCollector extends SigarExtensionProvider {
+ def collect: MetricsMeasurement
+}
+
+sealed trait MetricsMeasurement
+case class MemoryMetricsMeasurement(memUsage: Long, memSwapPageIn: Long, memSwapPageOut: Long) extends MetricsMeasurement
+case class NetworkMetricsMeasurement(tcpCurrEstab: Long,
+ tcpEstabResets: Long,
+ netRxBytesRate: Long,
+ netTxBytesRate: Long,
+ netRxErrors: Long,
+ netTxErrors: Long) extends MetricsMeasurement
+
+case class CpuMetricsMeasurement(cpuUser: Long, cpuSys: Long, cpuCombined: Long,
+ loadAverage1min: Long,
+ loadAverage5min: Long,
+ loadAverage15min: Long) extends MetricsMeasurement
+
+
+
+class CpuMetricsCollector extends MetricsCollector {
+ val loadAverage = sigar.getLoadAverage
+ val cpuPerc = sigar.getCpuPerc
+
+
+ def collect(): CpuMetricsMeasurement = {
+ println(s"ProcCPU->${sigar.getProcCpu(sigar.getPid)}")
+ val loadAverage1min = loadAverage(0).toLong
+ val loadAverage5min = loadAverage(1).toLong
+ val loadAverage15min = loadAverage(2).toLong
+
+ CpuMetricsMeasurement(cpuPerc.getUser.toLong, cpuPerc.getSys.toLong, cpuPerc.getCombined.toLong, loadAverage1min, loadAverage5min, loadAverage15min)
+ }
+}
+
+class MemoryMetricsCollector extends MetricsCollector {
+ val swap: Swap = sigar.getSwap
+
+ def collect(): MetricsMeasurement = MemoryMetricsMeasurement(sigar.getMem.getUsedPercent.toLong, swap.getPageIn, swap.getPageOut)
+}
+
+class NetWorkMetricsCollector extends MetricsCollector {
+ val interfaces = sigar.getNetInterfaceList.toSet
+ val tcp = sigar.getTcp
+
+ var netRxBytes = 0L
+ var netTxBytes = 0L
+ var netRxErrors = 0L
+ var netTxErrors = 0L
+
+ def collect(): MetricsMeasurement = {
+ for{
+ interface <- interfaces
+ net:NetInterfaceStat <- sigar.getNetInterfaceStat(interface)
+ }{
+ netRxBytes += net.getRxBytes
+ netTxBytes += net.getTxBytes
+ netRxErrors += net.getRxErrors
+ netTxErrors += net.getTxErrors
+ }
+ NetworkMetricsMeasurement(tcp.getCurrEstab, tcp.getEstabResets,netRxBytes, netTxBytes, netRxErrors, netTxErrors)
+ }
+} \ No newline at end of file
diff --git a/kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala b/kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala
new file mode 100644
index 00000000..fb3bfeb8
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala
@@ -0,0 +1,71 @@
+/*
+ * =========================================================================================
+ * 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.metrics
+
+import com.typesafe.config.Config
+import org.HdrHistogram.HdrRecorder
+
+case class JvmMetrics(name: String) extends MetricGroupIdentity {
+ val category = JvmMetrics
+}
+
+object JvmMetrics extends MetricGroupCategory {
+ val name = "system"
+
+ case object MaximumPoolSize extends MetricIdentity { val name, tag = "maximum-pool-size" }
+ case object RunningThreadCount extends MetricIdentity { val name, tag = "running-thread-count" }
+ case object QueueTaskCount extends MetricIdentity { val name, tag = "queued-task-count" }
+ case object PoolSize extends MetricIdentity { val name, tag = "pool-size" }
+
+ case class JvmMetricRecorder(maximumPoolSize: MetricRecorder, runningThreadCount: MetricRecorder, queueTaskCount: MetricRecorder, poolSize: MetricRecorder)
+ extends MetricGroupRecorder {
+
+ def collect: MetricGroupSnapshot = {
+ JvmMetricSnapshot(maximumPoolSize.collect(), runningThreadCount.collect(), queueTaskCount.collect(), poolSize.collect())
+ }
+ }
+
+ case class JvmMetricSnapshot(maximumPoolSize: MetricSnapshotLike, runningThreadCount: MetricSnapshotLike, queueTaskCount: MetricSnapshotLike, poolSize: MetricSnapshotLike)
+ extends MetricGroupSnapshot {
+
+ val metrics: Map[MetricIdentity, MetricSnapshotLike] = Map(
+ (MaximumPoolSize -> maximumPoolSize),
+ (RunningThreadCount -> runningThreadCount),
+ (QueueTaskCount -> queueTaskCount),
+ (PoolSize -> poolSize))
+ }
+
+ val Factory = new MetricGroupFactory {
+ type GroupRecorder = JvmMetricRecorder
+
+ def create(config: Config): JvmMetricRecorder = {
+ val settings = config.getConfig("precision.jvm")
+
+ val threadCountConfig = extractPrecisionConfig(settings.getConfig("maximum-pool-size"))
+ val RunningThreadCountConfig = extractPrecisionConfig(settings.getConfig("running-thread-count"))
+ val QueueTaskCountConfig = extractPrecisionConfig(settings.getConfig("queued-task-count"))
+ val PoolSizeConfig = extractPrecisionConfig(settings.getConfig("pool-size"))
+
+ new JvmMetricRecorder(
+ HdrRecorder(threadCountConfig.highestTrackableValue, threadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(RunningThreadCountConfig.highestTrackableValue, RunningThreadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(QueueTaskCountConfig.highestTrackableValue, QueueTaskCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(PoolSizeConfig.highestTrackableValue, PoolSizeConfig.significantValueDigits, Scale.Unit))
+ }
+ }
+}
+
diff --git a/kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala b/kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala
new file mode 100644
index 00000000..9bcd8917
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala
@@ -0,0 +1,71 @@
+/*
+ * =========================================================================================
+ * 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.metrics
+
+import com.typesafe.config.Config
+import org.HdrHistogram.HdrRecorder
+
+case class SystemMetrics(name: String) extends MetricGroupIdentity {
+ val category = JvmMetrics
+}
+
+object SystemMetrics extends MetricGroupCategory {
+ val name = "system"
+
+ case object MaximumPoolSize extends MetricIdentity { val name, tag = "maximum-pool-size" }
+ case object RunningThreadCount extends MetricIdentity { val name, tag = "running-thread-count" }
+ case object QueueTaskCount extends MetricIdentity { val name, tag = "queued-task-count" }
+ case object PoolSize extends MetricIdentity { val name, tag = "pool-size" }
+
+ case class SystemMetricRecorder(maximumPoolSize: MetricRecorder, runningThreadCount: MetricRecorder, queueTaskCount: MetricRecorder, poolSize: MetricRecorder)
+ extends MetricGroupRecorder {
+
+ def collect: MetricGroupSnapshot = {
+ SystemMetricSnapshot(maximumPoolSize.collect(), runningThreadCount.collect(), queueTaskCount.collect(), poolSize.collect())
+ }
+ }
+
+ case class SystemMetricSnapshot(maximumPoolSize: MetricSnapshotLike, runningThreadCount: MetricSnapshotLike, queueTaskCount: MetricSnapshotLike, poolSize: MetricSnapshotLike)
+ extends MetricGroupSnapshot {
+
+ val metrics: Map[MetricIdentity, MetricSnapshotLike] = Map(
+ (MaximumPoolSize -> maximumPoolSize),
+ (RunningThreadCount -> runningThreadCount),
+ (QueueTaskCount -> queueTaskCount),
+ (PoolSize -> poolSize))
+ }
+
+ val Factory = new MetricGroupFactory {
+ type GroupRecorder = SystemMetricRecorder
+
+ def create(config: Config): SystemMetricRecorder = {
+ val settings = config.getConfig("precision.system")
+
+ val threadCountConfig = extractPrecisionConfig(settings.getConfig("maximum-pool-size"))
+ val RunningThreadCountConfig = extractPrecisionConfig(settings.getConfig("running-thread-count"))
+ val QueueTaskCountConfig = extractPrecisionConfig(settings.getConfig("queued-task-count"))
+ val PoolSizeConfig = extractPrecisionConfig(settings.getConfig("pool-size"))
+
+ new SystemMetricRecorder(
+ HdrRecorder(threadCountConfig.highestTrackableValue, threadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(RunningThreadCountConfig.highestTrackableValue, RunningThreadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(QueueTaskCountConfig.highestTrackableValue, QueueTaskCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(PoolSizeConfig.highestTrackableValue, PoolSizeConfig.significantValueDigits, Scale.Unit))
+ }
+ }
+}
+
diff --git a/kamon-system/src/main/scala/kamon/system/System.scala b/kamon-system/src/main/scala/kamon/system/System.scala
new file mode 100644
index 00000000..a6c468ef
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/System.scala
@@ -0,0 +1,36 @@
+/*
+ * =========================================================================================
+ * 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 akka.actor.{ ExtendedActorSystem, Extension, ExtensionIdProvider, ExtensionId }
+import kamon.Kamon
+import akka.event.Logging
+
+object System extends ExtensionId[SystemExtension] with ExtensionIdProvider {
+ override def lookup(): ExtensionId[_ <: Extension] = System
+ override def createExtension(system: ExtendedActorSystem): SystemExtension = new SystemExtension(system)
+}
+
+class SystemExtension(private val system: ExtendedActorSystem) extends Kamon.Extension {
+ val log = Logging(system, classOf[SystemExtension])
+ log.info("Starting the Kamon(System) extension")
+
+ private val config = system.settings.config.getConfig("kamon.system")
+
+ val defaultDispatcher = system.dispatchers.lookup(config.getString("dispatcher"))
+}
+
diff --git a/kamon-system/src/main/scala/kamon/system/native/SigarLoader.scala b/kamon-system/src/main/scala/kamon/system/native/SigarLoader.scala
new file mode 100644
index 00000000..511a8ffc
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/SigarLoader.scala
@@ -0,0 +1,82 @@
+package kamon.system.native
+
+import org.hyperic.sigar.Sigar
+import org.hyperic.sigar.SigarProxy
+import java.io._
+import scalax.io.JavaConverters._
+import scalax.io._
+
+import Resource._
+
+import scalax.file.Path
+import java.util
+import scala.collection.JavaConversions._
+
+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"
+
+ def init: SigarProxy = init(new File(System.getProperty(TmpDir)))
+
+ private def init(baseTmp: File): SigarProxy = {
+ val tmpDir = createTmpDir(baseTmp)
+ for (lib ← loadIndex) copy(lib, tmpDir)
+
+ attachToLibraryPath(tmpDir)
+
+ try {
+ val sigar = new Sigar
+ sigar.getPid
+ sigar
+ } catch {
+ case t: Throwable ⇒
+ throw new RuntimeException("Failed to load sigar", t)
+ }
+ }
+
+ private val usrPathField = {
+ val usrPathField = classOf[ClassLoader].getDeclaredField(UsrPathField)
+ usrPathField.setAccessible(true)
+ usrPathField
+ }
+
+ private 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 def newLibraryPath(dirAbsolutePath: String): String = {
+ Option(System.getProperty(JavaLibraryPath)).fold(dirAbsolutePath)(oldValue ⇒ s"$dirAbsolutePath${File.pathSeparator}$oldValue")
+ }
+
+ private def copy(lib: String, tmpDir: File) {
+ val dest: Path = Path(new File(tmpDir, lib))
+ if (dest.exists) return
+ val currentFile = Resource.fromInputStream(classOf[Loader].getResourceAsStream("" + lib))
+ currentFile.acquireFor(current ⇒ dest.doCopyFrom(current.asInput))
+ }
+
+ private def createTmpDir(baseTmp: File): File = {
+ val path = Path(new File(baseTmp, s"sigar-$Version"))
+ path.createDirectory(failIfExists = false)
+ path.jfile
+ }
+
+ private def loadIndex: util.List[String] = {
+ val libs = new util.ArrayList[String]
+ val input = fromInputStream(classOf[Loader].getResourceAsStream(IndexFile))
+ input.lines().foreach(libs.add)
+ libs
+ }
+}
+
+class Loader \ No newline at end of file
diff --git a/kamon-system/src/main/scala/kamon/system/native/index b/kamon-system/src/main/scala/kamon/system/native/index
new file mode 100644
index 00000000..ebc7f952
--- /dev/null
+++ b/kamon-system/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/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so
new file mode 100644
index 00000000..3e94f0d2
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-freebsd-6.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-linux.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-linux.so
new file mode 100644
index 00000000..5a2e4c24
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-linux.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so
new file mode 100644
index 00000000..6396482a
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-amd64-solaris.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl b/kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl
new file mode 100644
index 00000000..d92ea4a9
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-hpux-11.sl
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-linux.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-linux.so
new file mode 100644
index 00000000..2bd2fc8e
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-ia64-linux.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl b/kamon-system/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl
new file mode 100644
index 00000000..0dfd8a11
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-pa-hpux-11.sl
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so
new file mode 100644
index 00000000..7d4b5199
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-aix-5.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-linux.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-linux.so
new file mode 100644
index 00000000..4394b1b0
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc-linux.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so
new file mode 100644
index 00000000..35fd8288
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-aix-5.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so
new file mode 100644
index 00000000..a1ba2529
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-ppc64-linux.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-s390x-linux.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-s390x-linux.so
new file mode 100644
index 00000000..c275f4ac
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-s390x-linux.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so
new file mode 100644
index 00000000..aa847d2b
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-sparc-solaris.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so
new file mode 100644
index 00000000..6c4fe809
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-sparc64-solaris.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib b/kamon-system/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib
new file mode 100644
index 00000000..27ab1071
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-universal-macosx.dylib
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib b/kamon-system/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib
new file mode 100644
index 00000000..0c721fec
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-universal64-macosx.dylib
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so
new file mode 100644
index 00000000..8c50c611
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-5.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so
new file mode 100644
index 00000000..f0800274
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-freebsd-6.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-linux.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-linux.so
new file mode 100644
index 00000000..a0b64edd
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-linux.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-solaris.so b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-solaris.so
new file mode 100644
index 00000000..c6452e56
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/libsigar-x86-solaris.so
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll b/kamon-system/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll
new file mode 100644
index 00000000..1ec8a035
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/sigar-amd64-winnt.dll
Binary files differ
diff --git a/kamon-system/src/main/scala/kamon/system/native/sigar-x86-winnt.dll b/kamon-system/src/main/scala/kamon/system/native/sigar-x86-winnt.dll
new file mode 100644
index 00000000..6afdc016
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/system/native/sigar-x86-winnt.dll
Binary files differ
diff --git a/project/Dependencies.scala b/project/Dependencies.scala
index 4a2f2276..78240abe 100644
--- a/project/Dependencies.scala
+++ b/project/Dependencies.scala
@@ -36,6 +36,9 @@ object Dependencies {
val slf4nop = "org.slf4j" % "slf4j-nop" % slf4jVersion
val jsr166 = "io.gatling" % "jsr166e" % "1.0"
val scalaCompiler = "org.scala-lang" % "scala-compiler" % Settings.ScalaVersion
+ val sigar = "org.fusesource" % "sigar" % "1.6.4"
+ val ioCore = "com.github.scala-incubator.io" %% "scala-io-core" % "0.4.3"
+ val ioFile = "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3"
def compile (deps: ModuleID*): Seq[ModuleID] = deps map (_ % "compile")
def provided (deps: ModuleID*): Seq[ModuleID] = deps map (_ % "provided")
diff --git a/project/Projects.scala b/project/Projects.scala
index 852bfc42..768ac6d8 100644
--- a/project/Projects.scala
+++ b/project/Projects.scala
@@ -85,7 +85,7 @@ object Projects extends Build {
.settings(formatSettings: _*)
.settings(libraryDependencies ++= compile(akkaActor) ++ test(scalatest, akkaTestKit, slf4Api, slf4nop))
.dependsOn(kamonCore)
-
+
lazy val kamonDatadog = Project("kamon-datadog", file("kamon-datadog"))
.settings(basicSettings: _*)
.settings(formatSettings: _*)