Artículos
Java

Guía Completa Javamelody: Monitoreo de aplicaciones web

Creado: 31/Jul/2012 Actualizado: 25/Ago/2021

Javamelody es una herramienta destinada a monitorear servidores de aplicación Java o Java EE en ambientes de QA y producción. Es importante tener en cuenta que no es una herramienta para simular pedidos de usuarios, sino que se debe utilizar para medir y calcular estadísticas que surgen de la operatoria de la aplicación por todos los usuarios.

Requisitos de Javamelody

Se requiere tener instaladas las siguientes versiones de Java:

  • 1.5 como mínimo
  • 1.6 o 1.7 para las siguientes funciones: heap dump, memory histogram, stack traces and system load average
  • JDK o JRE de Sun o JRockit de Oracle/BEA o J9 de IBM

Versiones de Servidor:

  • JavaEE 1.4
  • Tomcat 5.5, 6 o 7
  • GlassFish v2 o v3
  • JBoss 4, 5, 6 o 7
  • Jonas 4 o 5
  • Jetty 6 o 7
  • WebLogic 9, 10, 11

Instalación de Javamelody

La instalación es realmente sencilla. Solamente basta copiar dos archivos en la carpeta WEB-INF/lib de la aplicación que deseamos monitorear. Luego debemos editar el archivo web.xml agregando algunas pocas líneas de código.

Instalación Paso a Paso

Los siguientes pasos son los básicos, donde elegimos a Tomcat como servidor de ejemplo.

Pasos:
a) Descargar el archivo javamelody-x.x.x.zip de la web del proyecto.
b) Descomprimir el archivo zip.
c) Copiar los archivos javamelody-x.x.x.jar y jrobin.x.x.x.jar al directorio WEB-INF/lib que está dentro del directorio webapps/nuestra-aplicación.
d) Agregamos las siguientes líneas en el archivo WEB-INF/web.xml de la aplicación.


  monitoring
  net.bull.javamelody.MonitoringFilter


  monitoring
  /*


  net.bull.javamelody.SessionListener

e) Si queremos tener informes en PDF debemos copiar a WEB-INF/lib el archivo itext-2.1.7.jar. Este paso es opcional.

Si necesitan más customizaciones pueden obtenerlos del sitio de google code donde se encuentra alojado todo el proyecto de Javamelody. Pueden visitarlo aquí.

Primeros resultados

Podemos acceder a nuestra herramienta a través de:

http://<host>/<my-context>/monitoring

  • <host> : nombre del servidor donde la aplicación web está instalada, seguido posiblemente por el puerto (por ejemplo localhost:8080).
  • <my-context>: Es el nombre del contexto de la aplicación web.

Seguridad

La página de monitoreo no tiene datos como usuario y password para ser usados como login. Por ello, antes de usar Javamelody en producción puede ser necesario que deseemos restringir el acceso a esta página. Esta tarea recae en nosotros mismos, donde una de las posibilidades es realizar un login customizado. Javamelody nos ayuda dándonos la posibilidad de restringir su acceso a través de una expresión regular tomando como parámetro la dirección IP del cliente. Esto podemos lograrlo a través de allowed-addr-pattern. Por ejemplo: “192\.168\..*|123\.123\.123\.123” para permitir las IP que se encuentren en el rango “192.168.*.*” mas cualquier pc que se encuentre detrás de una puerta de enlace 123.123.123.123.
Hay que tener en cuenta que si usamos un servidor proxy http como Apache, la dirección IP del cliente será la de Apache. Por ello, no debes usar allowed-addr-pattern en este caso o, si es ese el caso, no usar Apache para acceder a esta página, o  habilitar mod_proxy_ajp para que el servidor monitoreado sepa las direcciones IP de los clientes.

Ejemplo de httpd conf con ajp:


ProxyPass ajp://localhost:8080/webapp

Otra opción que tenemos es la utilización de roles. Si en nuestro archivo web.xml ya hemos definido roles, entonces podemos habilitarlos para que solo ellos puedan acceder a la página de monitoring.

Ejemplo utilizando roles:


  BASIC
  Monitoring


  monitoring


  
    Monitoring
    /monitoring
  
  
    monitoring
  
  

Los usuarios deben estar definidos en el servidor de aplicación y deben tener asignado el rol de monitoring para tener acceso a los reportes. Un ejemplo de cómo configurarlo sería del siguiente modo:



  
  

Activación consultas SQL

Si dentro de nuestra aplicación utilizamos Hibernate, entonces la siguiente línea de configuración puede ser utilizada para poder activar el rastreo de las consultas SQL realizadas.

Para ello buscamos el archivo hibernate.cfg.xml y agregamos la siguiente línea:

net.bull.javamelody.HibernateBatcherFactory

Esto habilita que Javamelody detecte cada consulta realizada y nos muestre el tiempo total de ejecución, la cantidad de veces que se ejecutó dicha consulta, el máximo tiempo de ejecución, desviación standard y el % de error del sistema.

Generación de reportes PDF

Para generar reportes en PDF como también en HTML, debemos agregar la librería iText v2.1.x. Para ello buscamos el archivo iText-2.x.x.jar, ubicado en src/test/test-webapp/WEB-INF/ lib dentro de javamelody.zip y copiarlo dentro del directorio WEB-INF/lib .

Suplementos en web.xml

Para evitar monitorear algunas url determinadas podemos usar url-pattern dentro del archivo web.xml.

Por ejemplo, usamos filter-mappings y url-patterns para monitorear solamente urls como /servlet1/* y /servlet2/* pero no otras como /static/*


  monitoring
  net.bull.javamelody.MonitoringFilter


  monitoring
  /servlet1/*


  monitoring
  /servlet2/*


  monitoring
  /monitoring


  net.bull.javamelody.SessionListener

Es importante tener en cuenta que url-pattern debe contener la url /monitoring para tener reportes.
Como alternativa, se puede usar un único /* url-pattern y un parámetro de filtro con una expresión regular antes del tag .

Por ejemplo:


  monitoring
  net.bull.javamelody.MonitoringFilter
  
    url-exclude-pattern
    /static/.*
  



  monitoring
  /*



  net.bull.javamelody.SessionListener

Esto ha sido todo sobre la instalación de JavaMelody. Esperamos que les sea útil a la hora de tener una guía completa para su instalación.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
HTML5

Crear un Path sobre un Canvas de HTML5

Creado: 30/Jul/2012 Actualizado: 09/Ene/2025

Un Path es un conjunto de movimientos o dibujos que realicemos dentro de un Canvas de HTML5. De esta manera, mediante código podemos trazar los dibujos y al final del Path decidir cómo los vamos a pintar o volcar sobre el Canvas. Este es el punto importante, lo especificado dentro de un Path solo se vuelca cuando damos por terminado el Path.

Siempre que estemos trabajando con un Canvas lo primero que haremos será crear el elemento Canvas de HTML5 y posteriormente obtener su referencia y contexto mediante Javascript.

<canvas id="micanvas" width="300px" height="300px">
Su navegador no soporta en elemento CANVAS</canvas>

<script>var canvas = document.getElementById("micanvas");
var ctx = canvas.getContext("2d");</script>

Para crear un Path lo primero que tendremos que hacer es utilizar el método .beginPath() el cual indica el principio del Path.

ctx.beginPath();

Una vez creado el Path podremos hacer movimientos sobre el Canvas con .moveTo(), podremos dibujar líneas con .lineTo(), arcos mediante .arc(),… Por ejemplo podríamos tener el siguiente código:

ctx.moveTo(0,0);
ctx.lineTo(100,100);
ctx.arc(150,100,100,(Math.PI/180)*180,0,true);

Lo siguiente será definir el color con el cual hemos realizado los movimientos sobre el Canvas. Para esto tenemos la propiedad .strokeStyle. Y lo último el ejecutar el dibujado del contenido sobre el Canvas. Esto lo conseguimos mediante el método .stroke().

ctx.strokeStyle = "#f00";
ctx.stroke();

Con estos tres sencillos pasos: inicio del Path, .beginPath(), realización de movimientos y volcado de contenido, .stroke() tenemos creado un Path sobre el Canvas en HTML5.

Vídeos sobre HTML5

Disfruta también de nuestros artículos sobre HTML5 en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test HTML5

¿Te atreves a probar tus habilidades y conocimiento en HTML5 con nuestro test?

Test HTML5
Artículos
Java

Comprobar conexión a Internet con Java

Creado: 14/Jul/2012 Actualizado: 29/Dic/2014

Hace algún tiempo necesitaba una aplicación que cada determinado tiempo compruebe el estado de la conexión, entonces desarrolle una aplicación en Java muy simple que cada cierto tiempo verifique el estado de conexión. Lo que voy a exponer aquí solo es la parte de código Java que se encarga de la comprobar la conexión, nada más. Luego podrá usted incluirlo en una aplicación más grande y con sus propios fines si le parece útil el pequeño código expuesto.

Para este sencillo programa Java vamos a utilizar la clase Socket, así que veamos lo necesario de ella para los fines de la aplicación. También es necesario trabajar con excepciones pero creo que a este tema le corresponde un post por sí solo.

Clase Socket de Java: Es un conector TCP/IP diseñado para conectarse a servidores e iniciar intercambios bajo protocolo. La creación de un objeto Socket establece implícitamente una conexión entre cliente y servidor. Ahora pasemos al código:

Antes que nada importamos el paquete java.net y ponemos los comentarios de documentación habituales:

import java.net.Socket;
/**
* @(#)ComprobarConexionJava.java
*
* ComprobarConexionJava application
*
* @author Christian G. Gimenez
* @version 1.00 2012/6/27
*/

Luego tenemos la signatura de la clase y del método main de Java, toda la acción va a estar dentro del método main:

public class ComprobarConexionJava {
 public static void main(String[] args) {

Lo siguiente que vamos a hacer es definir dos variables, de tipo String e int que contendrán una dirección web y un puerto respectivamente:

String dirWeb = "www.lineadecodigo.com";
int puerto = 80;

A continuación, viene algo fundamental para el funcionamiento de esta pequeña aplicación, cuando definimos una variable de tipo Socket y creamos el objeto de dicho tipo lo hacemos dentro de un bloque try, de no ser así vamos a tener problemas a la hora de compilar nuestra aplicación:

try{
  Socket s = new Socket(dirWeb, puerto);

Ahora utilizamos un if para llamar al método isConnected() de la clase Socket, este método devolverá un valor booleano, dependiendo de éste devolveremos un mensaje correspondiente al estado de la conexión:

if(s.isConnected()){
  System.out.println("Conexión establecida con la dirección: " +  dirWeb + " a travéz del puerto: " + puerto);
}

Por último vamos a escribir el bloque catch correspondiente al bloque catch que utilizamos arriba, a este bloque lo utilizamos para comunicar el fallo al conectarse en caso que exista tal fallo.

}catch(Exception e){
  System.err.println("No se pudo establecer conexión con: " + dirWeb + " a travez del puerto: " + puerto);
}

Eso es todo, como ven es muy simple. Espero lo encuentren útil en algún momento.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Groovy

Groovy: un vistazo a los closures

Creado: 12/Jul/2012

Inicio mis post en lineadecodigo con un pequeño vistazo a los closures.

Antes de empezar debemos de conocer dos conceptos. Por un lado Groovy, es un lenguaje de programación dinámico y fácil de aprender similar a Python y Ruby que va ganando terreno entre los desarrolladores Java.

Y un Closure, es la manera en como una función dentro de otra función contenedora puede hacer referencia a las variables después de que la función contenedora ha terminado de ejecutarse. Este término es algo dificil de entender, sin embargo pienso que con unos cuantos ejemplos entiendan el concepto.

Lo primero que haremos será crear un archivo (o fichero) y lo vamos a llamar «Closures.groovy». Veamos diferentes formas de codificar un clousure:

1. Creamos un closure muy simple.

//imprime el mensaje "Hola desde un closure"
def hola={
  println("Hola desde un closure")
}

//invocar closure "hola"
hola()

2. Ahora un closure con un parámetro.

// multiplica un número por 2
def doble={ n ->
  return n*2
}

//invocar closure "doble"
def numero=doble(5)
println("el doble de 5 es "+numero)
// también puede escribirse println "el doble de 5 es ${numero}"

3. Ahora un closure con dos parámetros.

def var="Bienvenido"
// imprime el valor de var y el parámetro que le envie el usuario
def msg1={it -> println "${var} ${it}"}
//invocamos el closure, debe salir el mensaje "Bienvenido mundo"
msg1("mundo")

4. Closure más complejo, recibe un método como parámetro.

//defino un closure con dos parámetros
def otro={metodo, parametro -> metodo(parametro)}
//ahora defino dos closure que reciben un solo parámetro
def inicio={it -> println "Hola ${it}"}
def fin={it -> println "Adios ${it}"}
//invoco el closure "otro"
otro(inicio,"Fernando")
otro(fin,"Fernando")

5. Mandamos una lista a un closure.

//defino una lista
def lista=["Andrea","Fernando","Antonio","Lucero","Veronica"]
//uso el closure "inicio"
println "\n"
lista.each inicio

6. Ejemplo con closures y diccionarios.

//defino el diccionario
def dicc=['Fernando':31,'Veronica':27,'María':43,'Yezmin':26,'Horacio':15]
def suma=0
//defino el closure
def edadTotal={ x ->
x.each{
suma+=it.value
// println("obtener valor: "+it.value+ " obtener llave o identificador: "+it.key)
}
println("Suma total de edades: "+suma)
}
//invoco el closure
edadTotal(dicc)

Para ejecutar este archivo pueden teclear desde la consola de comandos:

groovy Closures.groovy

También se puede probar el código mediante la consola groovy:

groovyconsole Closures.groovy

Si quieres puedes leer más información sobre los Closures de Groovy en http://groovy.codehaus.org/Closures

Artículos
HTML5

Insertar texto en un Canvas de HTML5

Creado: 11/Jul/2012 Actualizado: 25/Ago/2021

En varios ejemplos del uso del Canvas en HTML5 hemos ido viendo como insertar diferentes elementos gráficos: líneas, rectángulos,… Pero a la hora de utilizar el Canvas en HTML5 no nos vamos a limitar a realizar dibujos, si no que también podemos insertar texto. Así que vamos a ver qué código necesitamos para insertar texto en un Canvas de HTML5.

La creación y acceso al Canvas seguro que ya os la sabéis, pero por si acaso la volvemos a poner. Creamos el elemento Canvas:

<canvas height="300px" width="300px" id="micanvas">
Su navegador no soporta en elemento CANVAS
</canvas>

Y mediante Javascript accedemos a su contexto.

var canvas = document.getElementById("micanvas");
var ctx = canvas.getContext("2d");

Ahora que tenemos el contexto del canvas vamos a insertar el texto. Para insertar texto tenemos que conocer dos cosas. La primera es saber cómo podemos seleccionar la fuente, tamaño, efectos sobre el texto. Y es que aquí no podemos pensar en propiedades CSS, si no que será un atributo del Canvas con el que modifiquemos el tipo del texto. El atributo del canvas que nos permite dar formato al texto es .font. Eso sí, los valores de la propiedad son similares a los valores de CSS.

Si queremos utilizar una letra sans-serif de 22px y que esté en negrita pondremos lo siguiente:

ctx.font = "bold 22px sans-serif";

Ahora ya solo hay que conocer la segunda cosa. Cómo ponemos el texto. Esto lo hacemos con el método .fillText. Este método recibe tres parámetros: el primero será el texto que queremos insertar y los dos siguientes será la coordenada a partir de la cual queremos insertar el texto.

ctx.fillText("Texto en el Canvas",50,50);

Ya tenemos insertado nuestro texto en un Canvas con HTML5.

¿Cómo aplicarías efectos sobre este texto?

Código Fuente

Descárgate el código fuente de Insertar texto en un Canvas de HTML5
Y si te ha gustado nuestro código fuente puedes regalarnos una estrella Star

Vídeos sobre HTML5

Disfruta también de nuestros artículos sobre HTML5 en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test HTML5

¿Te atreves a probar tus habilidades y conocimiento en HTML5 con nuestro test?

Test HTML5