Byteman es un herramienta creada por la comunidad JBoss.org que nos ayuda a tracear, monitorizar y testar el comportamiento de una aplicción Java.
Para esto inyecta código Java en los métodos Java sin la necesidad de recompilar, reempaquetar o redesplegar la aplicación. La inyección puede hacerse en el arranque de la JVM o incluso mientras la aplicación está ejecutando. Además el código inyectado puede acceder a los datos y llamar a otros métodos (includo métodos privados).
Byteman funciona modificando el bytecode de las clases de la aplicación en runtime. A diferencia de otras librerías Byteman opera a nivel de Java, definiendo las reglas que especifican el código a modificar. Byteman es capaz de modificar el código de cualquier librería, incluso de las librerías del runtime de la JVM.
Dicho esto, seguro que le encontráis numerosos usos a Byteman, ¿verdad?
El uso más simple de Byteman es inyectar sentencias de log para lo que está haciendo la aplicación, mostrar el valor de ciertos datos,…de modo que se pueda monitorizar y debugear nuestras aplicaciones en ejecución. Además usar Byteman tiene la ventaja de no afectar al rendimiento al no tener que modificar el código para poner trazas.
Veamos cómo se usa
- Comenzaremos por descargar el binario de Byteman (Byteman 4.0.11) que es un ZIP y descomprimirlo en una carpeta.
- Luego establecemos una variable BYTEMAN_HOME apuntando a esta carpeta y la añadimos al %PATH% el %BYTEMAN_HOME%/bin
- Ya podemos probarlo, primero un ejemplo sencillo, escribimos una clase sencillita:
- La compilamos y la ejecutamos
- Ahora nos queda escribir la RULE Byteman, la llamaré BytemanFirstRule.btm y La dejaré en la misma carpeta
- La regla tendrá este aspecto (la pongo tabulada para que se lea mejor pero no es necesario):
Como se puede ver la regla tiene 2 reglas, una que se ejecuta a la entrada del método main y otra a la salida:
- Ahora ya puedo ejecutarla, simplemente añadiendo el javaagent y la ruta al script:
java -javaagent:%BYTEMAN_HOME%/lib/byteman.jar=script:BytemanFirstRule.btm BytemanFirstExample uno dos tres
Esto está bien, ¿pero es todo?
Nooooooo!!! Veamos un caso más complejo.
Primero la clase:
Y mi fichero btm
En este caso quiero inyectar código en la clase Thread así que la forma de lanzarlo es un poco más compleja:
java -javaagent:%BYTEMAN_HOME%libbyteman.jar=script:BytemanThreadRule.btm,boot:%BYTEMAN_HOME%libbyteman.jar -Dorg.jboss.byteman.transform.all BytemanThreadExample Hilo1 Hilo2 Hilo3
En el próximo post (este miércoles o jueves si el CoronaVirus no lo impide!!!) veremos cómo cargar y descargar Reglas sobre un programa en ejecución! 😉
Un pasito mas https://dzone.com/articles/testing-asynchronous-operations-in-spring-with-jun-1
[…] el primer post dedicado a Byteman (leer aquí) hoy nos toca ver algunos conceptos más […]
Reblogueó esto en Un poco de Java y +.