Monitoree una aplicación Java con Health Center API, Parte 1

Iniciar con Health Center API

El release 2.1 del Health Center contiene una API eficiente. La API permite a los desarrolladores Java™ incorporar al Health Center en sus aplicaciones y emplear su poder de monitoreo para la resolución de problemas. En la Parte 1 de este artículo de dos partes usted aprendió a usar Health Center API y a monitorear puntos muertos en una aplicación Java en ejecución. La Parte 2 usa la aplicación de detección de punto muerto que es desarrollada en este artículo y añade una visualización de elaboración de perfiles de métodos para mostrar dónde gasta la aplicación la mayoría de sus ciclos de CPU.

Toby Corbin, Software Engineer, IBM Japan

Toby CorbinToby Corbin es desarrollador principal de la herramienta de monitoreo Health Center; también desarrolla otras herramientas de consumo dentro del IBM Java Technology Centre. Se unió a IBM en el 2001 y por cuatro años desarrolló el soporte de lenguaje nacional y la globalización del Java Runtime Environment. Toby desarrolló las bibliotecas Swing y AWT por dos años.



27-05-2013

¿Alguna vez se ha colgado su servidor de aplicaciones sin ningún motivo aparente?, ¿o una aplicación Java no responde? ¿A su aplicación se le acaba la memoria o tiene un mal rendimiento? Con Health Center usted puede resolver ese tipo de problemas más fácilmente.

Monitoreo y diagnóstico de problemas con Health Center

El IBM® Monitoring and Diagnostics Tools para Java - Health Center (Health Center) es una herramienta de diagnóstico gratuita de baja sobrecarga y API para monitorear una aplicación que se ejecuta en una máquina virtual Java (JVM) de IBM. Con Health Center, usted puede acceder al estado de una aplicación Java en ejecución rápidamente al proporcionar informacion para identificar y resolver problemas. Puede:

  • Identificar si la memoria nativa o de almacenamiento dinámico se está fugando
  • Descubrir qué métodos toman el mayor tiempo para ejecutarse
  • Localizar cuellos de botella de E/S
  • Visualizar y ajustar recolección de basura
  • Ver cualquier conexión bloqueda
  • Analisar eventos de WebSphere® Real Time inusuales
  • Monitorear la actividad de hebras de su aplicación
  • Detectar condiciones de punto muerto
  • Recolectar datos de histograma de clase

El último release de Health Center es una nueva y eficiente API que usted puede usar para escribir su propia herramienta de monitoreo. Los días con problemas fastidiosos y difíciles de solucionar ahora están contados.

En este artículo, aprenda a escribir una herramienta de monitoreo que verifica una aplicación para detectar condiciones de punto muerto. Posteriormente, aplique estos principios para escribir herramientas más a profundidad, consulte cualquier cosa desde una actividad de recolección de basura hasta la elaboración de perfiles de método, y comprenda dónde gasta su aplicación sus ciclos de CPU.

Requisitos del sistema

El paquete Health Center API requiere un mínimo de Eclipse 3.4 o Eclipse 4.x.

Instalando el paquete API en Eclipse

Las herramientas IBM Monitoring and Diagnostics normalmente son instaladas en IBM Support Assistant (ISA). Para incorporar Health Center en su aplicación y codificar contra él usando la API, primero instálelo en su entorno Eclipse. Para hacer eso, siga estos pasos:

  1. Inicie el entorno de desarrollo Eclipse.
  2. Vaya a Help -> Install New Software.
  3. Añada el sitio actualizado ISA como el nuevo sitio.
    1. Haga clic en Add.
    2. Coloque el sitio ISA Update en el recuadro de nombre.
    3. Coloque este URL en el recuadro de ubicación: http://public.dhe.ibm.com/software/isa/isa410/production/. Esta acción inicia una búsqueda de todas las herramientas disponibles y toma unos minutos.
  4. Ingrese Health Center en el recuadro de búsqueda
  5. Seleccione el paquete Health Center Core Feature y haga clic en Next (ver Figura 1):
    Figura 1. Lista de software disponible para instalar
    Screen capture of available software to install
  6. Verifique los detalles de instalación y haga clic en Next.
  7. Lea y acepte los términos de licencia y posteriormente haga clic en Finish. Estos pasos sirven para la istalación del dispositivo Health Center Core en su Eclipse IDE. Usted está listo para codificar contra la API.
  8. Verifique los detalles de instalación y haga clic en Next.

Usando la API, escriba un simple rcp para detectar un punto muerto. Primero, cree un nuevo proyecto en Eclipse y añada Health Center API como una dependencia. Para hacer eso, siga estos pasos:

  1. Vaya a File -> New -> Project -> Plug-in Project.
  2. De un nombre al proyecto como HC_Deadlock. Haga clic en Next.
  3. Deseleccione la casilla de verificación Generate an activator . Cuando se le pregunte si desea crear una aplicación de cliente abundante, haga clic en Yes. Haga clic en Next (ver Figura 2):
    Figura 2. Opciones de proyecto plug-in
    Screen capture of plug-in project options
  4. Haga clic en Next. En la pantalla de plantilla, seleccione Headless Hello RCP. Haga clic en Finish.

Después añada el paquete de Health Center API como una dependencia del nuevo proyecto. Siga los siguientes pasos:

  1. Para añadir la importación API al manifiesto, abra el archivo MANIFEST.MF bajo META-INF en su nuevo proyecto (ver Figura 3):
    Figura 3. Plug-ins de Package Explorer
    Screen capture of Package Explorer plug-ins
  2. Seleccione la pestaña Dependencies y haga clic en Add. En el campo Select a Plug-in escriba healthcenter.api en la búsqueda. Seleccione el plug-in com.ibm.java.diagnostics.healthcenter.api—observe que el número de versión puede ser diferente (ver Figura 4):
    Figure 4. Selección de plug-in de Health Center API
    Screen capture of Health Center API plug-in selection
  3. Haga clic en OK. Repita el ejercicio desde el paso de la pestaña de Select the Dependencies . En esta ocasión, añada org.eclipse.ui—de nuevo. El número de la versión puede ser diferente (ver Figura 5):
    Figura 5. Selección de plug-in de org.eclipse.ui
    Screen capture of plug-in selection of org.eclipse.ui
  4. Haga clic en OK y posteriormente guarde al archivo.

El API plug-in ahora está incluido en su aplicación y usted puede iniciar a codificar contra él.


Pruebas contra una aplicación de punto muerto

Antes de que pueda escribir una herramienta de monitoreo, usted necesita algo para monitorear. El Listado 1 muestra el código fuente para una aplicación sencilla que obtiene un punto muerto:

Listado 1. Una aplicación sencilla con un punto muerto
public class GenerateDeadlock {
   AThread t1 = null;
   AThread t2 = null;
   AThread t3 = null;

   static class AThread extends Thread {
      Object hold;
      Object grab;

      AThread(String name, Object hold, Object grab) {
         super(name);
         this.hold = hold;
         this.grab = grab;
      }

      private void delay(long time) {
         try {
            Thread.sleep(time);
         } catch (InterruptedException e) {
         }
      }

      private void grabLocks() {
         System.out.println("Thread " + this + " about to hold " + hold);
         synchronized (hold) {
            System.out.println("  Thread " + this + " about to grab "
                  + grab);
            delay(5000);
            synchronized (grab) {
               System.out.println("    Thread " + this
                     + " got both monitors");
               delay(1000000);
            }
         }
      }

      public void run() {
         System.out.println("Thread " + this + " starting");
         for (int i = 0; i < 200000; i++) {
            grabLocks();
         }
         System.out.println("Thread " + this + " completed");
      }
   }

   private void createDeadlock() {
      System.out.println("Force 3 thread deadlock");
      String s1 = "obj 1";
      String s2 = "obj 2";
      String s3 = "obj 3";
      t1 = new AThread("Thread 1", s1, s2);
      t2 = new AThread("Thread 2", s2, s3);
      t3 = new AThread("Thread 3", s3, s1);
      t1.start();
      t2.start();
      t3.start();
   }

   public static void main(String[] args) {
      GenerateDeadlock d = new GenerateDeadlock();
      d.createDeadlock();
      try {
         Thread.sleep(1000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      System.out.println("Press a key to exit");
      try {
         System.in.read();
         System.exit(0);
      } catch (java.io.IOException e) {
      }
   }
}

Health Center tiene dos partes. La primera parte es el agente Health Center, que se carga con la aplicación que usted desea monitorear. El agente proporciona acceso a los datos en JVM, que es la segunda parte del Health Center—que el cliente— posteriormente usa. La API le brinda acceso a este cliente, que normalmente se inicia desde ISA. Incorpore el cliente en su aplicación para conectar una aplicación que fue iniciada con el agente Health Center y obtenga acceso a todos los datos que el cliente Health Center monitorea y muestra. La API no proporciona una GUI, en vez de eso pone a disposición todos los datos para su uso en su propia aplicación. La Figura 6 muestra una visión general de dónde se ubican el cliente y el agente Health Center cuando son instalados en ISA y en el JVM:

Figura 6. Ubicaciones del cliente y agente Health Center cuando se instalan en ISA y en JVM
Diagram of the locations of the Health Center client and agent in ISA and JVM

Inicie el programa en el Listado 1 con el agente Health Center adjunto a él. También requiere un mínimo de nivel IBM Java de Java 5 SR8, Java 6 SR1, o Java 7. Usted puede descargar IBM developer kits.

Para iniciar la aplicación con el agente usando Java 5 SR10 y posterior, Java 6 SR5 y posterior, y Java 7, use este comando (vea la Figura 7):

java - Xhealthcenter GenerateDeadlock

Para Java 5 SR9 y anterior, o Java 6 SR4 y anterior, use este comando:

java -agentlib:healthcenter -Xtrace:output=healthcenter.out GenerateDeadlock
Figura 7. Ejecute el programa GenerateDeadlock
Screen capture of command line window showing the GenerateDeadlock program

El agente es incluido automáticamente de Java 5 SR9 y Java 6 SR3. Para obtener las últimas versiones del agente e instrucciones de cómo actualizarlo, visite Health Center - Instalando el agente Heatlh Center.


Codificando la aplicación de monitoreo de punto muerto

Usted está listo para modificar la aplicación básica Hello RCP World y convertirla en una herramienta de detección de puntos muertos usando Health Center API. Abra el archivo que se llama Application.java (ver Figure 8):

Figura 8. Ubicación del código Application.java
Screen capture of the location of Application.java code

Configurando los detalles de conexión

Primero, obtenga un objeto ConnectionProperties , que tiene los detalles de la aplicación a la que desea conectarse. El objeto predeteminado es configurado para usar localhost y el puerto 1972, pero usted puede cambiar estos valores (y añadir seguridad) en los métodos de constructor y clase:

ConnectionProperties hcConn = new ConnectionProperties();

Cuando usted tenga el objeto ConnectionProperties , conéctese a la aplicación que desea monitorear, que ya ha iniciado con el agente Health Center. Efectúe un llamado al HealthCenterFactory.connect(hcConn, true) estático . Este llamado retorna un objeto HealthCenter , que es la conexión directa en Health Center y permite acceso a todos los datos que está monitoreando el Health Center. La llamada de conexión inicia de manera efectiva una instancia del Health Center en su aplicación e inicia a recolectar datos:

HealthCenter hcMon = HealthCenterFactory.connect(hcConn,true);

Llegando a los datos

Ahora que usted tiene el objeto HealthCenter , usted puede consultar los datos. La API es dispuesta similarmente a la GUI: el primer paso después de que adquiere un objeto HealthCenter es efectuar el llamado en los tipos de datos que le interesan a usted. Para este ejemplo, usted deseará verificar su existen puntos muertos, que son parte de la clase ThreadsData . Usted puede acceder con el método getThreadsData() en el objeto HealthCenter , como está a continuación:

ThreadsData hcThreadsData = HealthCenter.getThreadsData();

La clase ThreadsData tiene un método deadlockDetected() que retorna verdadero si se detecta un punto muerto. Al sondear este método, usted puede ser notificado si se presenta un punto muerto:

if(hcThreadsData.deadlockDetected()) {
      do something
}

Acceso al motor de recomendaciones y análisis

Health Center cuenta con un motor de recomendaciones incorporado que proporciona todos los análisis y retorna los descubrimientos. Usted normalmente ve estos resultados en el panel Analysis and Recommendations cuando ejecuta la versión completa de Health Center (ver Figura 9):

Figura 9. Panel de análisis y recomendaciones en Health Center
Screen capture of Health Center analysis and recommendations panel

Para consultar cualquiera de las recomendaciones existen varios métodos disponibles para usted. getAllRecommendations() retorna un array de todas las recomendaciones, pero usted puede consultar problemas típicos solo con el llamado getCriticalRecommendations() , que es el que se usa en el objeto ThreadsData:

String[] hcThreadsRec = hcThreadsData.getCriticalRecommendations()

Observación del código fuente completo

Los cinco llamados previos son necesarios para incorporar el Health Center en su aplicación y verificar si existen puntos muertos en la aplicación que desea monitorear. El Listado 2 muestra el código fuente completo con los llamados en uso:

Listado 2. El código fuente completo muestra cinco llamados en uso
package deadlockdemo;

import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

import com.ibm.java.diagnostics.healthcenter.api.ConnectionProperties;
import com.ibm.java.diagnostics.healthcenter.api.HealthCenter;
import com.ibm.java.diagnostics.healthcenter.api.factory.HealthCenterFactory;
import com.ibm.java.diagnostics.healthcenter.api.threads.ThreadsData;

/**
 * This class controls all aspects of the application's execution
 */
public class Application implements IApplication {
   HealthCenter hcMon;

   public Object start(IApplicationContext context) throws Exception {
      ConnectionProperties hcConn = new ConnectionProperties();
      hcMon = HealthCenterFactory.connect(hcConn, true);
      try {
         System.out
               .println("Waiting for 10 seconds to allow initial data to be
                        parsed from the connection");
         Thread.sleep(10000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      checkForDeadlock();
      return IApplication.EXIT_OK;
   }

   public void stop() {
      // nothing to do
   }

   public void checkForDeadlock() {
      while (!detectDeadlock()) {
         try {
            Thread.sleep(5000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }

   private boolean detectDeadlock() {
      ThreadsData hcthreadsData = hcMon.getThreadsData();
      if (hcthreadsData == null) {
         System.out.println("No threads yet");
      } else {
         if (hcthreadsData.deadlockDetected()) {
            Display display = new Display();
            Shell shell = new Shell(display);

            MessageBox mb = new MessageBox(shell);
            String deadlockMessage = new String();
            String[] hcThreadsRec = hcthreadsData
                  .getCriticalRecommendations();
            for (String rec : hcThreadsRec) {
               deadlockMessage = deadlockMessage + rec + "\n";
            }
            mb.setMessage(deadlockMessage);
            mb.setText("Deadlock detected");
            mb.open();
            display.dispose();
            return true;
         }
      }
      return false;
   }
}

Monitoreo para detectar puntos muertos

Ahora usted tiene una aplicación de monitoreo de punto muerto y el programa infectado con punto muerto ejecutándose en segundo plano. Los mensajes indican el punto muerto (ver Figura 10):

Figura 10. Panel de resultados de punto muerto detectado
Screen capture of deadlock detected results panel

Conclusión

Este artículo cubrió lo básico de cómo iniciar con Health Center API y después escribir una herramienta de monitoreo que verifica una aplicación para detectar condiciones de punto muerto. Usted puede aplicar estas técnicas para extraer cualquiera de los datos que están dentro de Health Center. En la Parte 2, usted puede desarrollar estos conceptos y añadir una visualización de elaboración de perfiles de método en la aplicación de detección de punto muerto para mostrar dónde gasta la aplicación la mayoría de sus ciclos de CPU.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=tecnologia Java
ArticleID=931502
ArticleTitle=Monitoree una aplicación Java con Health Center API, Parte 1
publish-date=05272013