aboutsummaryrefslogtreecommitdiff
path: root/kamon-system-metrics
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2014-07-22 16:45:42 -0300
committerDiego <diegolparra@gmail.com>2014-07-22 16:45:42 -0300
commitf1d995350013ff8ba5e4f4f09bcb023fae347610 (patch)
treeee490101701e136fddbbcc6c116282cd9a5526e2 /kamon-system-metrics
parent5c141733ad39cf2730cf34dc8f3f4a82f0c1b516 (diff)
downloadKamon-f1d995350013ff8ba5e4f4f09bcb023fae347610.tar.gz
Kamon-f1d995350013ff8ba5e4f4f09bcb023fae347610.tar.bz2
Kamon-f1d995350013ff8ba5e4f4f09bcb023fae347610.zip
= kamon-system-metrics: SynchronizedSigar in order to share the same instance
Diffstat (limited to 'kamon-system-metrics')
-rw-r--r--kamon-system-metrics/src/main/java/kamon/system/SynchronizedSigar.java429
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala4
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala1
-rw-r--r--kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala7
4 files changed, 436 insertions, 5 deletions
diff --git a/kamon-system-metrics/src/main/java/kamon/system/SynchronizedSigar.java b/kamon-system-metrics/src/main/java/kamon/system/SynchronizedSigar.java
new file mode 100644
index 00000000..20453d43
--- /dev/null
+++ b/kamon-system-metrics/src/main/java/kamon/system/SynchronizedSigar.java
@@ -0,0 +1,429 @@
+/*
+ * =========================================================================================
+ * 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 org.hyperic.sigar.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Safely share a single Sigar instance between multiple threads.
+ * The Sigar object is thread-safe given that each thread has its
+ * own Sigar instance. In order to share a single Sigar instance
+ * the methods implemented here are synchronized. All data returned
+ * by the Sigar methods is read-only and hence thread-safe.
+ */
+public class SynchronizedSigar implements SigarProxy {
+
+ private Sigar sigar;
+
+ public SynchronizedSigar() {
+ this.sigar = new Sigar();
+ }
+
+ public synchronized long getPid()
+ {
+ return this.sigar.getPid();
+ }
+
+ public synchronized long getServicePid(String name) throws SigarException {
+ return this.sigar.getServicePid(name);
+ }
+
+ public synchronized Mem getMem()
+ throws SigarException
+ {
+ return this.sigar.getMem();
+ }
+
+ public synchronized Swap getSwap()
+ throws SigarException
+ {
+ return this.sigar.getSwap();
+ }
+
+ public synchronized Cpu getCpu()
+ throws SigarException
+ {
+ return this.sigar.getCpu();
+ }
+
+ public synchronized CpuPerc getCpuPerc()
+ throws SigarException
+ {
+ return this.sigar.getCpuPerc();
+ }
+
+ public synchronized Uptime getUptime()
+ throws SigarException
+ {
+ return this.sigar.getUptime();
+ }
+
+
+ public ResourceLimit getResourceLimit() throws SigarException {
+ return null;
+ }
+
+ public synchronized double[] getLoadAverage()
+ throws SigarException
+ {
+ return this.sigar.getLoadAverage();
+ }
+
+ public synchronized long[] getProcList()
+ throws SigarException
+ {
+ return this.sigar.getProcList();
+ }
+
+ public synchronized ProcStat getProcStat()
+ throws SigarException
+ {
+ return this.sigar.getProcStat();
+ }
+
+ public synchronized ProcMem getProcMem(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcMem(pid);
+ }
+
+ public synchronized ProcMem getProcMem(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcMem(pid);
+ }
+
+
+ public ProcMem getMultiProcMem(String s) throws SigarException {
+ return null;
+ }
+
+ public synchronized ProcState getProcState(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcState(pid);
+ }
+
+ public synchronized ProcState getProcState(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcState(pid);
+ }
+
+ public synchronized ProcTime getProcTime(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcTime(pid);
+ }
+
+ public synchronized ProcTime getProcTime(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcTime(pid);
+ }
+
+ public synchronized ProcCpu getProcCpu(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcCpu(pid);
+ }
+
+ public synchronized ProcCpu getProcCpu(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcCpu(pid);
+ }
+
+
+ public MultiProcCpu getMultiProcCpu(String s) throws SigarException {
+ return null;
+ }
+
+ public synchronized ProcCred getProcCred(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcCred(pid);
+ }
+
+ public synchronized ProcCred getProcCred(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcCred(pid);
+ }
+
+ public synchronized ProcCredName getProcCredName(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcCredName(pid);
+ }
+
+ public synchronized ProcCredName getProcCredName(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcCredName(pid);
+ }
+
+ public synchronized ProcFd getProcFd(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcFd(pid);
+ }
+
+ public synchronized ProcFd getProcFd(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcFd(pid);
+ }
+
+ public synchronized ProcExe getProcExe(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcExe(pid);
+ }
+
+ public synchronized ProcExe getProcExe(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcExe(pid);
+ }
+
+ public synchronized String[] getProcArgs(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcArgs(pid);
+ }
+
+ public synchronized String[] getProcArgs(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcArgs(pid);
+ }
+
+ public synchronized Map getProcEnv(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcEnv(pid);
+ }
+
+ public synchronized Map getProcEnv(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcEnv(pid);
+ }
+
+ public synchronized String getProcEnv(long pid, String key)
+ throws SigarException
+ {
+ return this.sigar.getProcEnv(pid, key);
+ }
+
+ public synchronized String getProcEnv(String pid, String key)
+ throws SigarException
+ {
+ return this.sigar.getProcEnv(pid, key);
+ }
+
+ public synchronized List getProcModules(long pid)
+ throws SigarException
+ {
+ return this.sigar.getProcModules(pid);
+ }
+
+ public synchronized List getProcModules(String pid)
+ throws SigarException
+ {
+ return this.sigar.getProcModules(pid);
+ }
+
+
+ public long getProcPort(int i, long l) throws SigarException {
+ return 0;
+ }
+
+
+ public long getProcPort(String s, String s2) throws SigarException {
+ return 0;
+ }
+
+ public synchronized FileSystem[] getFileSystemList()
+ throws SigarException
+ {
+ return this.sigar.getFileSystemList();
+ }
+
+ public synchronized FileSystemMap getFileSystemMap()
+ throws SigarException
+ {
+ return this.sigar.getFileSystemMap();
+ }
+
+ public synchronized FileSystemUsage getMountedFileSystemUsage(String name)
+ throws SigarException
+ {
+ return this.sigar.getMountedFileSystemUsage(name);
+ }
+
+ public synchronized FileSystemUsage getFileSystemUsage(String name)
+ throws SigarException
+ {
+ return this.sigar.getFileSystemUsage(name);
+ }
+
+
+ public DiskUsage getDiskUsage(String s) throws SigarException {
+ return null;
+ }
+
+ public synchronized FileInfo getFileInfo(String name)
+ throws SigarException
+ {
+ return this.sigar.getFileInfo(name);
+ }
+
+ public synchronized FileInfo getLinkInfo(String name)
+ throws SigarException
+ {
+ return this.sigar.getLinkInfo(name);
+ }
+
+ public synchronized DirStat getDirStat(String name)
+ throws SigarException
+ {
+ return this.sigar.getDirStat(name);
+ }
+
+
+ public DirUsage getDirUsage(String s) throws SigarException {
+ return null;
+ }
+
+ public synchronized CpuInfo[] getCpuInfoList()
+ throws SigarException
+ {
+ return this.sigar.getCpuInfoList();
+ }
+
+ public synchronized Cpu[] getCpuList()
+ throws SigarException
+ {
+ return this.sigar.getCpuList();
+ }
+
+ public synchronized CpuPerc[] getCpuPercList()
+ throws SigarException
+ {
+ return this.sigar.getCpuPercList();
+ }
+
+ public synchronized NetRoute[] getNetRouteList()
+ throws SigarException
+ {
+ return this.sigar.getNetRouteList();
+ }
+
+ public synchronized NetInterfaceConfig getNetInterfaceConfig(String name)
+ throws SigarException
+ {
+ return this.sigar.getNetInterfaceConfig(name);
+ }
+
+
+ public synchronized NetInterfaceConfig getNetInterfaceConfig() throws SigarException {
+ return null;
+ }
+
+ public synchronized NetInterfaceStat getNetInterfaceStat(String name)
+ throws SigarException
+ {
+ return this.sigar.getNetInterfaceStat(name);
+ }
+
+ public synchronized String[] getNetInterfaceList()
+ throws SigarException
+ {
+ return this.sigar.getNetInterfaceList();
+ }
+
+
+ public synchronized NetConnection[] getNetConnectionList(int i) throws SigarException {
+ return this.sigar.getNetConnectionList(i);
+ }
+
+
+ public synchronized String getNetListenAddress(long l) throws SigarException {
+ return this.sigar.getNetListenAddress(l);
+ }
+
+
+ public synchronized String getNetListenAddress(String s) throws SigarException {
+ return this.sigar.getNetListenAddress(s);
+ }
+
+
+ public synchronized NetStat getNetStat() throws SigarException {
+ return this.sigar.getNetStat();
+ }
+
+
+ public synchronized String getNetServicesName(int i, long l) {
+ return this.sigar.getNetServicesName(i,l);
+ }
+
+
+ public synchronized Who[] getWhoList() throws SigarException {
+ return this.sigar.getWhoList();
+ }
+
+
+ public synchronized Tcp getTcp() throws SigarException {
+ return this.sigar.getTcp();
+ }
+
+
+ public synchronized NfsClientV2 getNfsClientV2() throws SigarException {
+ return this.sigar.getNfsClientV2();
+ }
+
+
+ public synchronized NfsServerV2 getNfsServerV2() throws SigarException {
+ return this.sigar.getNfsServerV2();
+ }
+
+
+ public synchronized NfsClientV3 getNfsClientV3() throws SigarException {
+ return this.sigar.getNfsClientV3();
+ }
+
+
+ public synchronized NfsServerV3 getNfsServerV3() throws SigarException {
+ return this.sigar.getNfsServerV3();
+ }
+
+
+ public synchronized NetInfo getNetInfo() throws SigarException {
+ return this.sigar.getNetInfo();
+ }
+
+ public synchronized String getFQDN()
+ throws SigarException
+ {
+ return this.sigar.getFQDN();
+ }
+} \ No newline at end of file
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 c098d1e5..a45896ac 100644
--- a/kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala
+++ b/kamon-system-metrics/src/main/scala/kamon/metrics/CPUMetrics.scala
@@ -17,10 +17,9 @@ package kamon.metrics
import akka.actor.ActorSystem
import com.typesafe.config.Config
-import kamon.metric.instrument.{ Gauge, Histogram }
import kamon.metric._
+import kamon.metric.instrument.{Gauge, Histogram}
import kamon.system.SigarExtensionProvider
-import org.hyperic.sigar.SigarProxy
case class CPUMetrics(name: String) extends MetricGroupIdentity {
val category = CPUMetrics
@@ -61,6 +60,7 @@ object CPUMetrics extends MetricGroupCategory {
}
val Factory = new MetricGroupFactory with SigarExtensionProvider {
+
def cpu = sigar.getCpu
type GroupRecorder = CPUMetricRecorder
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 e46fca24..a46d8e1f 100644
--- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala
+++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetrics.scala
@@ -62,3 +62,4 @@ object SystemMetricsExtension {
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
index 6af0a6d2..f1072f56 100644
--- a/kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala
+++ b/kamon-system-metrics/src/main/scala/kamon/system/native/SigarLoader.scala
@@ -21,7 +21,8 @@ import java.util
import java.util.logging.Logger
import java.util.{ ArrayList, List }
-import org.hyperic.sigar.{ SigarProxy, SigarProxyCache }
+import kamon.system.SynchronizedSigar
+import org.hyperic.sigar.SigarProxy
import scala.annotation.tailrec
import scala.collection.JavaConversions._
@@ -37,7 +38,7 @@ object SigarLoader {
private val log = Logger.getLogger("SigarLoader")
- def sigarProxy = init(new File(System.getProperty(TmpDir)))
+ lazy val sigarProxy = init(new File(System.getProperty(TmpDir)))
private[native] def init(baseTmp: File): SigarProxy = {
val tmpDir = createTmpDir(baseTmp)
@@ -46,7 +47,7 @@ object SigarLoader {
attachToLibraryPath(tmpDir)
try {
- val sigar = SigarProxyCache.newInstance()
+ val sigar = new SynchronizedSigar()
sigar.getPid
sigar
} catch {