Monitoriza tus aplicaciones sobre la JVM con CRaSH

0
4481

Conectarse contra la máquina virtual de java, monitorizar que pasa en su interior, lanzar comandos en la misma, todo esto es posible gracias a CRaSH!!

índice de contenidos

1. Introducción

A lo largo de este tutorial se verá en que consiste el proyecto, que funcionalidades nos brinda, y un ejemplo de uso sobre una aplicación web JSF que hace uso del framework Spring.

Haremos uso de la versión 1.3.2 de CRaSH, el proyecto está distribuido bajo licencia LGPL, y es compatible con Java a partir de la versión 6 y con Groovy a partir de la versión 1.7.

Entre las muchas ventajas que nos ofrece CRaSH podemos destacar las siguientes:

  • Permite crear de manera rápida y fácil nuevos comandos.
  • Permite la composición de comandos a través de tuberías (pipelines).
  • Conectores para realizar acceso tanto de manera local como remota.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro Retina 15′ (2.5 Ghz Intel Core I7, 16GB DDR3).
  • Sistema Operativo: Mac OS El Capitan 10.11.1.
  • Entorno de desarrollo: IntelliJ IDEA 14 CE.
  • Apache Maven 3.3.0.
  • JDK 1.8.0_71

3. Arquitectura

Su arquitectura modular separa el núcleo, mantenido por un pequeño grupo de desarrolladores, y los plugins y conectores. De esta manera podemos utilizar únicamente solo aquellos plugins o conectores que necesitemos.

Los plugins permiten mantener un núcleo pequeño y ligero, a la vez que permiten añadir funcionalidades sin por ello comprometer la estabilidad del núcleo.
Algunos ejemplos de los plugins existentes pueden ser:

  • Autenticación: simple ó jaas.
  • Lenguajes: Java ó Groovy.
  • Servicios: mail ó cron.

Los conectores definen las interacciones con la shell, a través de un diseño asíncrono. A modo de ejemplo, mostramos a continuación distintos tipos de implemntaciones de los conectores:

  • System.in/System.out
  • Telnet
  • SSH
  • Web
  • Attach

CRaSH nos ofrece distintas formas de ejecución:

  • Standalone: CRaSH sobre su propia JVM
  • Embebido: CRaSH sobre un entorno de ejecución concreto,
  • Sobre otra JVM

4. Comandos básicos

Algunos de los comandos que ofrece cubren los paquetes de la JVM:

  • system
  • jdbc
  • jndi
  • jmx
  • jul

También ofrece otras utilidades: filter, env, egrep, dashboard,…

5. Ejemplo práctico

Como se ha comentado en la introducción, vamos a ejemplificar el uso de CRaSH con una aplicación web JSF con Spring. A continuación se muestran paso a paso las distintas tareas que se tienen que realizar para poder hacer uso de esta shell y algunos ejemplos en el uso de funcionalidades.

5.1. Dependencias

Lo primero que deberemos hacer para poder utilizar CRaSH es añadir las dependencias de CRaSH a nuestro proyecto.

En nuestro caso estamos utilizando Apache Maven como gestor de dependencias, con lo cual agregaremos las dependencias en la sección correspondiente.

<dependencies>
    ...        
    <dependency>
    	<groupId>org.crashub</groupId>
    	<artifactId>crash.embed.spring</artifactId>
    	<version>1.3.2</version>
    </dependency>
    
    <dependency>
    	<groupId>org.crashub</groupId>
    	<artifactId>crash.connectors.ssh</artifactId>
    	<version>1.3.2</version>
    </dependency>
    ...
</dependencies>

5.2. Configuración

El siguiente punto a realizar consiste en configurar la conexión remota que se va a utilizar. Para ello, tendremos que crear un bean en nuestro contexto de spring estableciendo los parámetros que deseemos. Por ejemplo:

<bean class="org.crsh.spring.SpringWebBootstrap">
    <property name="cmdMountPointConfig" value="war:/WEB-INF/crash/commands/"/>
    <property name="confMountPointConfig" value="war:/WEB-INF/crash/"/>
    <property name="config">
        <props>
            <!-- SSH configuration -->
            <prop key="crash.ssh.port">2000</prop>

            <!-- Optional SSH timeouts -->
            <prop key="crash.ssh.auth_timeout">300000</prop>
            <prop key="crash.ssh.idle_timeout">300000</prop>

            <!-- Authentication configuration -->
            <prop key="crash.auth">simple</prop>
            <prop key="crash.auth.simple.username">admin</prop>
            <prop key="crash.auth.simple.password">admin</prop>
        </props>
    </property>
</bean>

5.3. Uso

Para conectarnos a través de ssh contra la JVM de nuestra aplicación, basta con lanzar el comando de conexión ssh con los datos correspondientes.

ssh -p 2000 -l admin localhost

Automáticamente nos solicitará la contraseña para poder conectarnos

Con el comando help, podemos ver las distintas funcionalidades que nos da la herramienta.

Podemos hacer uso de jul para escribir en el LOG del servidor

jul send -m "Hello World!" test

Con jndi find podemos encontrar los distintos recursos de los que dispone la aplicación a través de JNDI. Por ejemplo, los DataSource:

jndi find --datasources --emf --verbose

De esta manera podremos realizar tareas sobre la base de datos de la aplicación a través de la consola.

Otra funcionalidad interesante es el monitor para la jvm

dashboard

Como se puede ver en la imagen anterior, el monitor nos ofrece información con respecto a los hilos que se encuentran y su estado, el espacio de memoria, el entorno ó información sobre versiones de las que se están haciendo uso en la aplicación.

6. Conclusiones

Acceso recursos definidos mediante JNDI (como la base de datos), monitorización de hilos, impresión en logs, un sistema extensible de comandos con algunos ya predefinidos…, como hemos visto, todo esto esta al alcance de nuestra mano a través de unas pocas líneas de código, de manera rápida y sencilla.

CRaSH nos ofrece una suite de herramientas que nos permite monitorizar y analizar la situación de la JVM en un momento concreto, permitiéndonos así tener un mayor control del entorno sobre el que trabajamos.

7. Referencias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad