Monitoreo de una aplicación java con mbeans. Un ejemplo con samtools/htsjdk.

“A MBean es un objeto Java que sigue la especificación JMX. Un MBean puede representar un dispositivo, una aplicación o cualquier recurso que deba administrarse. El Interfaz gráfica de usuario de JConsole es una herramienta de monitoreo que cumple con la especificación JMX”.. En este post voy a mostrar cómo he modificado las fuentes de la biblioteca htsjdk para monitorear el programa java leyendo un archivo VCF del servidor Exac. Ver mi compromiso en https://github.com/lindenb/htsjdk/commit/3c1ac1a18917aaa69f8dc49c70fd893a6a0542c3.

Primero, definimos una clase Java ProgresoLoggerMBean para decirle a Java sobre la información que se enviará a jconsole: la cantidad de registros procesados, el tiempo transcurrido, etc.

package htsjdk.samtools.util;
public interface ProgressLoggerMBean
    

La clase htsjdk ya existente htsjdk.samtools.util.ProgressLogger se modifica: ahora implementa ProgressLoggerMBean:

public class ProgressLogger
   implements ProgressLoggerInterface, Closeable, ProgressLoggerMBean

Los métodos se implementan:

(...)
     @Override
    public String getElapsedTime()
    
    @Override
    public String getLastRecord()

En el constructor intentamos conectarnos al servidor MBean que ha sido creado e inicializado por la plataforma. El ProgressLogger se envuelve en un ObjectName y se inserta en el servidor MBean:

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
/* defines an object name for the MBean instance that it will create */
this.objectMBean = new ObjectName("htsjdk.samtools.util:type="+noun);
mbs.registerMBean(this, this.objectMBean);

Se utiliza un método de ‘cerrar’ para anular el registro del objeto del servidor MBean:

@Override
public void close() {
    if(this.objectMBean!=null) 

Aquí hay un ejemplo. Este programa utiliza la biblioteca htsjdk para analizar un archivo VCF:

import htsjdk.variant.vcf.*;
import htsjdk.variant.variantcontext.*;
import htsjdk.tribble.readers.*;
import htsjdk.samtools.util.*;

public class TestProgress
 

Compilar y ejecutar para descargar exacto:

javac -cp dist/htsjdk-1.130.jar:dist/snappy-java-1.0.3-rc3.jar:dist/commons-jexl-2.1.1.jar:dist/commons-logging-1.1.1.jar TestProgress.java && 
curl -s  "ftp://ftp.broadinstitute.org/pub/ExAC_release/release0.3/ExAC.r0.3.sites.vep.vcf.gz" |
gunzip -c  |
java -cp dist/htsjdk-1.130.jar:dist/snappy-java-1.0.3-rc3.jar:dist/commons-jexl-2.1.1.jar:dist/commons-logging-1.1.1.jar:. TestProgress

(...)
INFO 2015-05-07 21:07:02 TestProgress Read VCF       675,000 records.  Elapsed time: 00:03:33s.  Time for last 1,000:    0s.  Last read position: 1:168,035,033
INFO 2015-05-07 21:07:03 TestProgress Read VCF       676,000 records.  Elapsed time: 00:03:33s.  Time for last 1,000:    0s.  Last read position: 1:168,216,140
INFO 2015-05-07 21:07:03 TestProgress Read VCF       677,000 records.  Elapsed time: 00:03:34s.  Time for last 1,000:    0s.  Last read position: 1:169,076,058
INFO 2015-05-07 21:07:03 TestProgress Read VCF       678,000 records.  Elapsed time: 00:03:34s.  Time for last 1,000:    0s.  Last read position: 1:169,366,434
INFO 2015-05-07 21:07:03 TestProgress Read VCF       679,000 records.  Elapsed time: 00:03:34s.  Time for last 1,000:    0s.  Last read position: 1:169,500,081
(...)

La progresión ahora puede ser monitoreada en el jconsole:

Eso es todo.
Pedro

Fuente del artículo

Deja un comentario