2012-06-11 3 views
0

Я работаю над проектом, который требует показать использование ЦП, а также другую системную информацию о удаленных машинах. Люди предлагают использовать SIGAR для достижения этого, но я не знаю, как его использовать. Исходный код для меня не имел никакого смысла. В основном, мой вопрос заключается в следующем: как я могу зарегистрировать MBeans, предоставляемые SIGAR, серверу, когда предоставляются IP-адрес хоста и JMX-порт, и как получить информацию о системе с другого компьютера. Пожалуйста, исправьте меня, если я ошибаюсь в работе JMX. Заранее спасибо.Как использовать SIGAR для удаленного получения информации о другой машине?

ответ

0

Мне кажется, что вам придется писать некоторые объекты обертывания, чтобы выставлять различные SIGAR-выходы в качестве атрибутов jMX mbean. Как вы это делаете, это сильно зависит от того, что вы используете, чтобы разоблачить ваши JMX-компоненты. Я бы написал один объект обертывания для каждого из различных типов вывода SIGAR: память, диск, ...

Я написал файл SimpleJMX library, который может помочь. Я буду использовать его формат, чтобы предоставить примерный объект, который вы можете использовать для отображения информации через JMX. Вы можете адаптировать его к любому механизму, который вы используете для публикации средств JMX. Я не знаком с 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

Это имена классов, которые являются Сигары построены в MBeans, что вы можете зарегистрироваться:

  • 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 зависит от собственной библиотеки, которая должна находиться в целевом JVM-lib-пути при загрузке MBeans. Это означает, что вам нужно будет активно загружать библиотеку и MBeans на каждом целевом хосте, который вы хотите контролировать.

Возможно, вы сможете взломать способ заставить целевые 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 находится в переменной окружения. Просто поместите все родные библиотеки там, и развертывание становится менее сложным.

Смежные вопросы