Usar Application Insights con WebSphere

Una de las peticiones que me llegó esta semana era ver la viabilidad de instrumentar WebSphere con Application Insights de la misma forma que te mostré con IIS, es decir sin tener que tocar las aplicaciones que en él se aloja. En este artículo te muestro cómo conseguirlo.

Entorno con WebSphere

Para que puedas probar de una forma sencilla esta configuración voy a utilizar un WebSphere contenerizado 🙂 Para ello voy me voy a apoyar en la imagen websphere-traditional que hay disponible en Docker Hub. Para hacer todo en uno, voy a generar una nueva imagen con este Dockerfile:

FROM ibmcom/websphere-traditional:latest

ENV APPLICATIONINSIGHTS_CONNECTION_STRING="<APP_INSIGHTS_INSTRUMENTATION_KEY>"

COPY applicationinsights-agent-3.2.0.jar /app/applicationinsights-agent-3.2.0.jar

Como ves, estoy usando la imagen mencionada como base pero además estoy definiendo la variable de entornoAPPLICATIONINSIGHTS_CONNECTION_STRING, que es necesaria para poder configurar el recurso al que se hará la ingesta de la telemetría. El valor de esta puedes encontrarlo en el recurso en el apartado Overview:

Application Insights – Connection String

Además estoy copiando el archivo applicationinsights-agent-3.2.0.jar el cuál puedes descargar desde aquí. Este nos permitirá instalar el agente de java para este tipo de entorno, tal y como se detalla en la documentación oficial. Para crear y ejecutar este nuevo servidor solo te queda ejecutar estos dos comandos:

# My own image with App Insights in it
docker build -t websphere-traditional-with-app-insights .

# Run WebSphere on Docker
docker run --name websphere-traditional -h websphere-traditional \
-p 9043:9043 -p 9443:9443 -d \
-e APPLICATIONINSIGHTS_CONNECTION_STRING="<APP_INSIGHTS_INSTRUMENTATION_KEY>" \
websphere-traditional-with-app-insights

A partir de este momento ya tienes tu servidor ejecutándose, aunque suele tardar unos segundos en estar operativo. Para ver el progreso puedes usar el siguiente comando:

docker logs --tail=all -f $(docker ps -lq)

Una vez que finalice puedes acceder a esta URL: https://localhost:9043/ibm/console/login.do?action=secure Si todo ha ido bien deberías de ver una página como la siguiente:

Página de login de la consola de administración de WebSphere

Para recuperar la contraseña (el usuario es wsadmin) puedes hacerlo utilizando este comando:

docker exec websphere-traditional cat /tmp/PASSWORD

Configurar Application Insights en WebSphere

Ahora que ya tienes un servidor en el que probar, lo siguiente que vamos a hacer es configurar el servicio en este, ya que por ahora solo tenemos una variable de entorno y el .jar del agente en un directorio del servidor, pero no se está haciendo uso de ello. Una vez logado en la consola de administración debes ir a servers > WebSphere application servers:

Servers > WebSphere application servers

y selecciona el servidor que te aparece en la parte derecha (server1):

Servers > WebSphere application servers > server1

Ahora haz clic en la opción Java and Process Management y dentro de esta selecciona Process definition:

Java and Process Management > Process definition:

Por último accede al apartado Java Virtual Machine:

Application servers > server1 > Process definition > Java Virtual Machine

y ya habremos llegado 🙂 Lo único que tienes que añadir en este apartado es en el cuadro llamado Generic JVM arguments lo siguiente:

-javaagent:/app/applicationinsights-agent-3.2.0.jar

Como ves le tengo que indicar la ruta donde copie el .jar, cuando definí mi Dockerfile. Debería de quedar de la siguiente manera:

Añadir agente de App Insights a Generic JVM arguments

Aplica los cambios a través del botón Apply y haz clic en Save en el siguiente cuadro:

WebSphere – Save directly to the master configuration

El último paso es reiniciar el servidor. No tengo ni idea de WebSphere, y lo cambiaré cuando lo descubra, pero para hacerlo he reiniciado el contenedor de Docker:

#Restart the server
docker restart websphere-traditional

A partir de este momento ya tienes tu servidor enviado la telemetría a tu recurso de Application Insights.

Aplicación de prueba

Si además quieres probarlo con una aplicación de ejemplo puedes usar el petclinic.war que he subido como parte del ejemplo (Gracias David por generarme este war 😀 ). Esta se corresponde con una aplicación de ejemplo de Spring Boot, con alguna pequeña modificación para que pete de verdad 😛 Para desplegarla, solo tienes que hacer clic en el menú izquierdo en Applications > New Application > New Enterprise Application, seleccionar el .war de tu local y hacer Next x 8 🙂 hasta que finalice el asistente. Por último haz clic en Save directly to the master configuration. Ahora ves al apartado Applications > WebSphere enterprise applications selecciona la aplicación y haz clic en el botón Start.

Start WebSphere Application

Si todo ha ido bien deberías de ver la aplicación en el raíz de tu servidor, al cual puedes acceder desde aquí: https://localhost:9443/ y verás algo como lo siguiente:

Petclinic en WebSphere

Si navegas por ella verás que tu Application Insights va mostrando la telemetría que va ingestando.

Ingesta de datos en Application Insights desde WebSphere

El código de ejemplo lo tienes en mi GitHub.

¡Saludos!