true remote mkyong management jmxremote example java sysadmin jmx

java - remote - port jmx tomcat



Llamar al método JMX MBean desde un script de shell (9)

Desarrollé jmxfuse que expone a JMX Mbeans como un sistema de archivos Linux FUSE con funcionalidades similares a / proc fs. Confía en Jolokia como el puente hacia JMX. Los atributos y operaciones están expuestos para lectura y escritura.

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

Por ejemplo, para leer un atributo:

me@oddjob:jmx$ cd log4j/root/attributes me@oddjob:jmx$ cat priority

para escribir un atributo:

me@oddjob:jmx$ echo "WARN" > priority

invocar una operación:

me@oddjob:jmx$ cd Catalina/none/none/WebModule/localhost/helloworld/operations/addParameter me@oddjob:jmx$ echo "myParam myValue" > invoke

¿Hay alguna biblioteca que me permita llamar a un método JMX MBean desde un script de shell? Exponemos algunos comandos de operaciones / administración a través de JMX, y podríamos hacer que nuestros administradores usen JConsole o VisualVM, pero algunas tareas se dejan mejor a la automatización. En esa automatización, nos gustaría poder llamar a un método JMX MBean en nuestro servidor en ejecución, preferiblemente desde un script de shell.


Eche un vistazo a JManage . Es capaz de ejecutar métodos MBean y obtener / establecer atributos desde la línea de comandos .


El plugin JMX de Syabru Nagios está destinado a ser utilizado desde Nagios, pero no requiere Nagios y es muy conveniente para el uso de la línea de comandos:

~$ ./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;;;;


La respuesta de @Dougnukem me ayudó mucho. He tomado el enfoque Groovy (demandando Groovy 2.3.3)

Hice algunos cambios en el código de Dougnukem. Esto funcionará con java 7 e imprimirá dos atributos para stdout evet 10 sec.

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) } } }

Compila este código en un contenedor utilizando maven-compiler-plugin para que no necesites una instalación genial solo groovy-all.jar A continuación encontrarás la definición y la dependencia del complemento correspondiente.

<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>

Envuélvalo con un murciélago o un caparazón e imprimirá los datos en stdout.


Las siguientes utilidades de línea de comando JMX están disponibles:

  1. jmxterm - parece ser la utilidad más completa.
  2. cmdline-jmxclient : utilizado en el proyecto WebArchive parece muy cmdline-jmxclient (y no parece haber desarrollo desde 2006)
  3. Groovy script y JMX : proporcionan algunas funciones JMX realmente potentes, pero requieren groovy y otras configuraciones de biblioteca.
  4. Funcionalidad de línea de comandos de JManage - (la desventaja es que requiere un servidor JManage en ejecución para ejecutar los comandos de proxy)

Ejemplo de Groovy JMX:

import java.lang.management.* import javax.management.ObjectName import javax.management.remote.JMXConnectorFactory as JmxFactory import javax.management.remote.JMXServiceURL as JmxUrl import groovy.swing.SwingBuilder import javax.swing.WindowConstants as WC 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();

Ejemplo de cmdline-jmxclient:

Si tienes un

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

Con una operación llamada:

  • jmxForceRefresh ()

Luego puede escribir un script bash simple (suponiendo que descargue cmdline-jmxclient-0.10.3.jar y lo coloque en el mismo directorio que su script):

#!/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


No estoy seguro sobre el ambiente tipo bash. Puede probar algunos programas simples de envoltura en Java (con argumentos de programa) que invocan sus MBeans en el servidor remoto. A continuación, puede llamar a estos contenedores desde el script de shell

Si puede usar algo como Python o Perl, es posible que le interese JSR-262 que le permite exponer operaciones JMX a través de servicios web. Está programado que se incluya en Java 7 pero es posible que pueda usar un candidato de lanzamiento de la implementación de referencia


Potencialmente es más fácil escribir esto en 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[]{}) } }

Esto se compilaría en una única clase .class y no necesita dependencias en el servidor ni en ningún otro paquete complicado.

llámalo con

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


También es posible que desee echar un vistazo a jmx4perl . Proporciona acceso sin java a los MBeans de un servidor Java EE remoto. Sin embargo, es necesario instalar un servlet de agente pequeño en la plataforma de destino, que proporciona un acceso JMX reparador a través de HTTP con una carga útil JSON. (La versión 0.50 agregará un modo sin agente mediante la implementación de un proxy JSR-160).

Las ventajas son los tiempos de inicio rápidos en comparación con el lanzamiento de una JVM Java local y la facilidad de uso. jmx4perl viene con un conjunto completo de módulos Perl que se pueden usar fácilmente en tus propios scripts:

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);

También puede usar un alias para combinaciones comunes de MBean / Atributo / Operación (por ejemplo, para la mayoría de los MXBeans). Para funciones adicionales (Nagios-Plugin, acceso tipo XPath a tipos de atributos complejos, ...), consulte la documentación de jmx4perl.


Un poco arriesgado, pero podría ejecutar un comando POST curvo con los valores del formulario de la consola JMX, su URL y autenticación HTTP (si es necesario):

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

Cuidado: el índice del método puede cambiar con los cambios en el software. Y la implementación del formulario web podría cambiar.

Lo anterior se basa en la fuente de la página de servicio JMX para la operación que desea realizar:

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

Fuente de la forma:

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>