2012-06-11 33 views
0

我正在开发一个项目,需要显示CPU使用率以及远程机器的其他系统信息。 人们建议使用SIGAR来实现这一点,但我不知道如何使用它。源代码对我来说不太合理。 基本上,我的问题是:当提供主机IP和JMX端口时,如何将SIGAR提供的MBean注册到服务器,以及如何从其他计算机获取系统信息。 如果我错了JMX的工作方式,请纠正我。提前致谢。如何使用SIGAR远程获取另一台机器的系统信息?

回答

0

在我看来,您将不得不编写一些包装对象来将各种SIGAR输出作为JMX mbean属性公开。你如何做到这一点很大程度上取决于你使用什么来公开你的JMX bean。我会为每种不同类型的SIGAR输出写入一个包装对象:内存,磁盘,...

我写了一个SimpleJMX library,可能有所帮助。我将使用它的格式来提供一个可用于通过JMX公开信息的示例对象。您可以根据您使用的任何机制来发布JMX方法。我对SIGAR不熟悉,不知道下面的我的sigar代码是否正确以获得ProcMem实例。

@JmxResource(description = "Show SIGAR Info", domainName = "foo") 
public class SigarProcMem { 

    private ProcMem procMem; 

    { 
     // sorry, I'm not up on sigar so I'm not sure if this works 
     Sigar sigar = new Sigar(); 
     procMem = sigar.getProcMem(sigar.getPid()); 
    } 

    @JmxAttributeMethod(description = "Resident memory") 
    public long residentMemory() { 
     return procMem.getResident(); 
    } 

    @JmxAttributeMethod(description = "Get the Total process virtual memory") 
    public long totalVirtualMemory() { 
     return procMem.getSize(); 
    } 
} 
+0

漂亮的图书馆。我在那里工作了一个类似的图书馆。好奇你为什么要粉碎JmxOperation注释中的参数信息,而不是为参数提供单独的注释? – jtahlborn

+0

@jtahlborn嘿。我只是讨厌那种复杂性。我总是要查找如何执行一系列注释字段或复制另一个实例。我没有足够的记忆。 :-) – Gray

+0

我想你误会了我。我指的是有一个单独的注释,你把方法参数(没有数组涉及到)。我认为这比JmxOperation中的值数组简单得多。 – jtahlborn

0

这些是在SIGAR内置的,你可以注册的MBean类的名称:

  • org.hyperic.sigar.jmx.SigarCpu
  • org.hyperic.sigar。 jmx.SigarCpuInfo
  • org.hyperic.sigar.jmx.SigarCpuPerc
  • org.hyperic.sigar.jmx.SigarLoadAverage
  • org.hyperic.sigar.jmx.SigarMem
  • org.hyperic.sigar.jmx.SigarProcess
  • org.hyperic.sigar.jmx.SigarRegistry
  • org.hyperic.sigar.jmx.SigarSwap

然而,这将是相当复杂因为Sigar依赖于本地库,所以在MBean加载时,它必须位于目标JVM的lib路径中。这意味着,您需要在要监视的每个目标主机上主动加载库和MBean。

你也许可以通过远程调用来破解目标JVM加载它的方法,但它不是微不足道的,并且需要绕过JVM中的任何安全设置,因为默认情况下,不应该这样做。

0

可以排序的破解系统的一部分,以获得一个简单的部署Sigjar:

private String before; 
private Sigar sigar; 

/** 
* Constructor - don't forget to call unload later! 
*/ 
public SetlogSigar() throws Exception { 
    before = System.getProperty("java.library.path"); 

    String path = ""; 

    String add = getJarFolder(); 

    if (before.contains(";")) 
     path = before + ";./;" + add; 
    else 
     path = before + ":./:" + add; 

    setSystemPath(path); 

    sigar = new Sigar(); 

} 

/** 
* This is needed to dynamically update the JAVA Path environment in order to load the needed native library 
* Yes -rather an ugly hack... 
*/ 
private String getJarFolder() { 
    // get name and path 
    String path = SetlogSigar.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
    String decodedPath = path; 
    try { 
     decodedPath = URLDecoder.decode(path, "UTF-8"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     return null; 
    }  

    File f = new File(decodedPath); 
    String absolutePath = f.getParentFile().getParentFile().getParentFile().getParent()+"/lib"; 

    return absolutePath; 
} 

/** 
* Unloads the JNI bindings 
*/ 
public void unload() { 
    this.sigar.close(); 
    setSystemPath(before); 
} 

这种动态破解地方添加sigjar.jar位于环境变量的文件夹。只需将所有本地库放置在那里,部署变得更简单。

相关问题