Подтвердить что ты не робот

Вызов метода JMX MBean из оболочки script

Существуют ли библиотеки, которые позволили бы мне вызвать метод MBean JMX из оболочки script. Мы предоставляем некоторые команды управления/администрирования через JMX, и мы могли бы использовать наших админов в JConsole или VisualVM, но некоторые задачи лучше всего оставлены для автоматизации. В этой автоматизации мы хотели бы иметь возможность называть JMX MBean-метод на нашем запущенном сервере, желательно из оболочки script.

4b9b3361

Ответ 1

Доступны следующие утилиты командной строки JMX:

  1. jmxterm - кажется, наиболее полнофункциональная утилита.
  2. cmdline-jmxclient - используемый в проекте WebArchive кажется очень скучным (и без разработки с 2006 года, похоже)
  3. Скрипт Groovy и JMX - предоставляет действительно мощную функциональность JMX, но требует настройки Groovy и других библиотек.
  4. Функциональность командной строки JManage - (недостатком является то, что для прокси-команд через него требуется работающий сервер JManage)

Groovy JMX Пример:

import java.lang.management.*
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory as JmxFactory
import javax.management.remote.JMXServiceURL as JmxUrl

def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:9003/jmxrmi'
String beanName = "com.webwars.gameplatform.data:type=udmdataloadsystem,id=0"
def server = JmxFactory.connect(new JmxUrl(serverUrl)).MBeanServerConnection
def dataSystem = new GroovyMBean(server, beanName)

println "Connected to:\n$dataSystem\n"

println "Executing jmxForceRefresh()"
dataSystem.jmxForceRefresh();

Пример cmdline-jmxclient:

Если у вас есть

  • MBean: com.company.data:type=datasystem,id=0

Операция называется:

  • jmxForceRefresh()

Затем вы можете написать простой скрипт bash (при условии, что вы загрузили cmdline-jmxclient-0.10.3.jar и поместили в тот же каталог, что и ваш скрипт):

#!/bin/bash

cmdLineJMXJar=./cmdline-jmxclient-0.10.3.jar
user=yourUser
password=yourPassword
jmxHost=localhost
port=9003

#No User and password so pass '-'
echo "Available Operations for com.company.data:type=datasystem,id=0"
java -jar ${cmdLineJMXJar} ${user}:${password} ${jmxHost}:${port} com.company.data:type=datasystem,id=0

echo "Executing XML update..."
java -jar ${cmdLineJMXJar} - ${jmxHost}:${port} com.company.data:type=datasystem,id=0 jmxForceRefresh

Ответ 2

Я разработал jmxfuse, который предоставляет JMX Mbeans в качестве файловой системы FUSE Linux с аналогичной функциональностью как /proc fs. Он полагается на Jolokia как мост к JMX. Атрибуты и операции отображаются для чтения и записи.

http://code.google.com/p/jmxfuse/

Например, чтобы прочитать атрибут:

[email protected]:jmx$ cd log4j/root/attributes
[email protected]:jmx$ cat priority

чтобы написать атрибут:

[email protected]:jmx$ echo "WARN" > priority

для вызова операции:

[email protected]:jmx$ cd Catalina/none/none/WebModule/localhost/helloworld/operations/addParameter
[email protected]:jmx$ echo "myParam myValue" > invoke

Ответ 3

Syabru Nagios JMX плагин предназначен для использования в Nagios, но не требует Nagios и очень удобен для использования в командной строке:

~$ ./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:1099/JMXConnector --username myuser --password mypass -O java.lang:type=Memory -A HeapMemoryUsage -K used 
JMX OK - HeapMemoryUsage.used = 445012360 | 'HeapMemoryUsage used'=445012360;;;;

Ответ 4

Потенциально проще всего написать это на Java

import javax.management.*;
import javax.management.remote.*;

public class JmxInvoke {

    public static void main(String... args) throws Exception {

        JMXConnectorFactory.connect(new JMXServiceURL(args[0]))
            .getMBeanServerConnection().invoke(new ObjectName(args[1]), args[2], new Object[]{}, new String[]{})


    }

}

Это скомпилирует в один .class и не требует никаких зависимостей от сервера или какой-либо сложной maven-упаковки.

позвони с помощью

javac JmxInvoke.java
java -cp . JmxInvoke [url] [beanName] [method]

Ответ 5

Немного рискованно, но вы можете запустить зависающую команду POST со значениями из формы с консоли JMX, ее URL-адресом и http-аутентификацией (если требуется):

curl -s -X POST --user 'myuser:mypass'
  --data "action=invokeOp&name=App:service=ThisServiceOp&methodIndex=3&arg0=value1&arg1=value1&submit=Invoke"
  http://yourhost.domain.com/jmx-console/HtmlAdaptor

Остерегайтесь: индекс метода может измениться с изменениями программного обеспечения. И реализация веб-формы может измениться.

Вышеуказанное основано на источнике служебной страницы JMX для операции, которую вы хотите выполнить:

http://yourhost.domain.com/jmx-console/HtmlAdaptor?action=inspectMBean&name=YourJMXServiceName

Источник формы:

form method="post" action="HtmlAdaptor">
   <input type="hidden" name="action" value="invokeOp">
   <input type="hidden" name="name" value="App:service=ThisServiceOp">
   <input type="hidden" name="methodIndex" value="3">
   <hr align='left' width='80'>
   <h4>void ThisOperation()</h4>
   <p>Operation exposed for management</p>
    <table cellspacing="2" cellpadding="2" border="1">
        <tr class="OperationHeader">
            <th>Param</th>
            <th>ParamType</th>
            <th>ParamValue</th>
            <th>ParamDescription</th>
        </tr>
        <tr>
            <td>p1</td>
           <td>java.lang.String</td>
         <td> 
            <input type="text" name="arg0">
         </td>
         <td>(no description)</td>
        </tr>
        <tr>
            <td>p2</td>
           <td>arg1Type</td>
         <td> 
            <input type="text" name="arg1">
         </td>
         <td>(no description)</td>
        </tr>
    </table>
    <input type="submit" value="Invoke">
</form>

Ответ 6

Взгляните на JManage. Он способен выполнять методы MBean и получать/устанавливать атрибуты из командной строки.

Ответ 7

Возможно, вам также стоит взглянуть на jmx4perl. Он предоставляет доступ без Java к удаленному MBeans сервера Java EE. Тем не менее, на целевой платформе должен быть установлен небольшой сервлет-агент, который обеспечивает надежный доступ JMX через HTTP с помощью полезной нагрузки JSON. (Версия 0.50 добавит режим без агента, реализуя прокси-сервер JSR-160).

Преимущества - это быстрое время запуска по сравнению с запуском локальной JVM Java и простотой использования. jmx4perl поставляется с полным набором модулей Perl, которые можно легко использовать в ваших собственных сценариях:

use JMX::Jmx4Perl;
use JMX::Jmx4Perl::Alias;   # Import certains aliases for MBeans

print "Memory Used: ",
      JMX::Jmx4Perl
          ->new(url => "http://localhost:8080/j4p")
          ->get_attribute(MEMORY_HEAP_USED);

Вы также можете использовать псевдоним для общих комбинаций MBean/Attribute/Operation (например, для большинства MXBeans). Для дополнительных функций (Nagios-Plugin, XPath-подобный доступ к сложным типам атрибутов...), пожалуйста, обратитесь к документации jmx4perl.

Ответ 8

Ответ @Dougnukem мне очень помог. Я принял Groovy подход (используя Groovy 2.3.3).

Я сделал некоторые изменения в коде Dougnukem. Это будет работать с Java 7 и будет выводить два атрибута на стандартный вывод каждые 10 секунд.

        package com.my.company.jmx
        import groovy.util.GroovyMBean;
        import javax.management.remote.JMXServiceURL
        import javax.management.remote.JMXConnectorFactory
        import java.lang.management.*

            class Monitor {
                static main(args) {
                    def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:5019/jmxrmi'
                    String beanName = "Catalina:type=DataSource,class=javax.sql.DataSource,name=\"jdbc/CommonDB\""
                    println  "numIdle,numActive"

                    while(1){
                        def server = JMXConnectorFactory.connect(new JMXServiceURL(serverUrl))
                       //make sure to reconnect in case the jvm was restrated 
                        server.connect()
                        GroovyMBean mbean = new GroovyMBean(server.MBeanServerConnection, beanName)
                        println  "${mbean.numIdle},${mbean.numActive}"
                        server.close()
                        sleep(10000)
                    }

                }
            }

Скомпилируйте этот код в jar с помощью maven-compiler-plugin, чтобы вам не требовалась установка groovy, а только groovy-all.jar. Ниже приведено соответствующее определение и зависимость плагина.

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerId>groovy-eclipse-compiler</compilerId>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-compiler</artifactId>
                        <version>2.8.0-01</version>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-batch</artifactId>
                        <version>2.3.4-01</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.3</version>
        </dependency>
    </dependencies>

Оберните его битой или оболочкой, и он напечатает данные на стандартный вывод.

Ответ 9

Я не уверен в среде bash -like. Вы можете попробовать несколько простых программ-оболочек в Java (с аргументами программы), которые вызывают ваши MBeans на удаленном сервере. Затем вы можете вызвать эти оболочки из оболочки script

Если вы можете использовать что-то вроде Python или Perl, вас может заинтересовать JSR-262, который позволяет вам показывать операции JMX через веб-интерфейс Сервисы. Это планируется включить в Java 7, но вы можете использовать кандидат на выпуск эталонная реализация