JMeter (ElasticSearch + Kibana)

title

¿Qué es Elasticsearch?

Elasticsearch es un motor de análisis y analítica distribuido y open source para todos los tipos de datos, incluidos textuales, numéricos, geoespaciales, estructurados y desestructurados. Elasticsearch está desarrollado en Apache Lucene y fue presentado por primera vez en 2010 por Elasticsearch N.V. (ahora conocido como Elastic). Conocido por sus API REST simples, naturaleza distribuida, velocidad y escalabilidad, Elasticsearch es el componente principal del Elastic Stack, un conjunto de herramientas open source para la ingesta, el enriquecimiento, el almacenamiento, el análisis y la visualización de datos. Comúnmente referido como el ELK Stack (por Elasticsearch, Logstash y Kibana), el Elastic Stack ahora incluye una gran colección de agentes de envío conocidos como Beats para enviar los datos a Elasticsearch. Texto extraído de aquí y te recomiendo visitarlo para informarte de todos los beneficios de ElasticSearch.

¿Qué es Kibana?

Kibana es una aplicación de frontend open source que se encuentra sobre el Elastic Stack y proporciona capacidades de visualización de datos y de búsqueda para los datos indexados en Elasticsearch. Comúnmente conocido como la herramienta de representación para el Elastic Stack (anteriormente llamado ELK Stack por Elasticsearch, Logstash y Kibana), Kibana también actúa como la interfaz de usuario para monitorear, administrar y asegurar un cluster del Elastic Stack; además de como concentrador centralizado de las soluciones integradas desarrolladas en el Elastic Stack. Desarrollado en 2013 en la comunidad de Elasticsearch, Kibana ha llegado a ser la ventana al propio Elastic Stack ofreciendo un portal para los usuarios y las empresas. Texto extraído de aquí y te recomiendo visitarlo para informarte de todos los beneficios de Kibana.

¿ Cómo se funciona la integración ElasticSearch y Kibana con JMeter ?

La integración es bastante sencilla, pero no muy popular. Al igual que la publicación anterior JMeter con InflluxDB y Grafana vamos a utilizar el Backend Listener pero modificado y adaptado para enviar los datos a ElasticSearch. El fichero JAR lo podemos descargar aquí, este Plug in fue creado por Anthony Gauthier basado en el código orignal del backend listener. Este componente receptor envía a ElasticSearch mediante peticiones HTTP asíncronas, los resultados obtenidos por JMeter por medio de bloques en formato JSON.

design

El receptor enviará a ElasticSearch todos los resultados descritos aquí, ya sea que lo coloques el backend listener a nivel del test plan o dentro de un grupo de hilos en particular. Los resultados serán transmitidos hacia ElasticSearch un máximo de hasta 5000 objetos, cada objeto puede contener múltiples mediciones o valores. Los datos son emitidos en peticiones HTTP en método POST hacía el API de ElasticSearch, una vez que validemos que los datos se encuentran sobre el índice que elegimos, podemos construir un tablero en Kibana o incluso también en Grafana para desplegar los resultados. No te preocupes si no sabes como hacerlo, ya existen muchos tableros predefinidos para visualizar los resultados de JMeter en la comunidad de Kibana y Grafana.

¿ Que necesitamos ?

1.- Necesitamos una instancia de ElasticSearch, te recomiendo utilizar la versión Cloud de prueba de Elastic que te otorga 14 días de periodo de prueba de un cluster que consta de (ElastiSearch, Kibana y Enterprise Search), la cual es más que suficiente para esta prueba. También puedes descargar e instalar ElasticSearch en tu equipo, o utilizar un servidor dedicado. Si no quieres instalarlo, puedes descargar y ejecutar la versión Docker.

2.- Necesitamos una instancia de Kibana, al aperturar la cuenta cloud, esta instancia viene incluida en el Stack. Aunque también puedes descargar e instalar Kibana en tu equipo, o utilizar el mismo servidor de InfluxDB. Si tampoco quieres instalarlo, de igual forma puedes optar por la versión Docker.

3.- Alternativamente necesitamos una instancia de Grafana, al aperturar tu cuenta en grafana.com, puedes generar una instancia de Grafana Cloud. Esta instancia sería suficiente para esta prueba. También puedes descargar e instalar Grafana en tu equipo, o utilizar el mismo servidor de InfluxDB. Si tampoco quieres instalarlo, de igual forma puedes optar por la versión Docker.

4.- Agregar el Backendlister a un script de JMeter y configurarlo con la información del punto #1.

5.- Validar que la información se encuentre disponible en ElasticSearch.

6.- Construir nuestros propios tableros o utilizar alguno existen para desplegar los gráficos de los resultados.

Receta de cocina

Paso 1

Vamos a utilizar la versión de prueba de Elastic, como podrás ver en las imágenes, obtenemos una URL en donde estará nuestro servicio API https://50e0522e55014a12ae25707525ba6e95.us-east-1.aws.found.io:9243**.

elastic-stack-1

elastic-stack-2

elastic-stack-3

elastic-stack-4

elastic-stack-5

elastic-stack-6

Damos click en el recuadro rojo para obtener la liga de ElasticSearch. Para este ejemplo es https://50e0522e55014a12ae25707525ba6e95.us-east-1.aws.found.io:9243

elastic-stack-7

Paso 2

Debemos copiar el fichero jmeter.backendlistener.elasticsearch-2.7.0.jar a nuestra carpeta /lib/ext y reiniciar JMeter. Después agregar y configurar el componente Backend listener con los datos del paso #1, como ya lo habíamos mencionado la URL es Elastic, y el usuario y contraseña se obtienen de la imágenes anteriores:

  • el protocolo o es.scheme = https
  • el nombre del servidor o es.host = 50e0522e55014a12ae25707525ba6e95.us-east-1.aws.found.io
  • el puerto o es.port = 9243
  • el indice o es.index = jmeter_metrics
  • el usuario de elastic o es.xpack.user = elastic
  • la contraseña del usuario o es.xpack.password = secret

elasticsearch-jmeter

Paso 3

Ejecutar una pequeña prueba y validaremos por medio del API Console que la información está siendo depositada correctamente en Elastisearch, aunque tambien podemos utilizar el commando CURL:

elasticsearch-api

curl --user elastic:secret 'https://50e0522e55014a12ae25707525ba6e95.us-east-1.aws.found.io:9243/test/_search?format=json&pretty'

elasticsearch-curl

Paso 4

Se puede construir un tablero en Kibana para poder graficar los datos que fueron enviados a ElasticSearch. Para este ejemplo vamos a utilizar el tablero JMeter Metrics Statistics Dashboard, el cual solo debemos copiar el JSON e importarlo en Kibana Objects. Pero antes también debemos configurar el índice de datos para que Kibana pueda extrarlos de ElasticSearch.

elasticsearch-kibana-1

elasticsearch-kibana-2

elasticsearch-kibana-3

elasticsearch-kibana-4

elasticsearch-kibana-5

elasticsearch-kibana-6

elasticsearch-kibana-7

elasticsearch-kibana-8

En caso de que tengas problemas con las estampas de tiempo, debemos editar el "dashboard" y después "editar la visualización" del componente, seleccionar el tab de "panel options" y en el campo "Time Field" seleccionar el valor "SampleStartTime". Salvar y disfrutar el Dashboard.

Paso 5 - Alterno utilizando Grafana

Se puede construir un tablero similar en Grafana para poder graficar los datos que fueron enviados a ElasticSearch, lo más sencillo es utilizar tableros predefinidos que algunos usuarios de la comunidad de Grafana ya crearon, estos se encuentran disponibles en la siguiente liga. Para este ejemplo vamos a utilizar el tablero Dashboard Grafana Main, el cual solo debemos copiar el JSON e importarlo en Grafana. Pero antes también debemos configurar la conexión del data source entre Grafana y ElasticSearch.

grafana-1

grafana-2

grafana-3

grafana-4

grafana-5

grafana-6

Conclusión

Esta solución me ha funcionado también para miles de usuarios concurrentes, dado que es muy sencillo escalar horizontalmente ElastiSearch, mientras que Kibana o Grafana aun con las instancias Cloud es suficiente. En cuanto se vuelvan más experimentados los invito a crear sus propios tableros en Kibana o Grafana y/o modificar los existentes, es bastante sencillo y de extrema utilidad. Porque también se puede enviar de forma paralela los contadores de CPU, Memoria, Disco y Ancho de Banda de los generadores de carga o servidores objetivo utilizando logstash.
Alternativamente podriamos enviar el contenido de nuestro archivo JTL por medio de logstash, lo que potencialmente podría librarnos de colectar los archivos JTL después de ejecutar las iteración, aunque este Listener a diferencia del articulo anterior de InfluxDB, nos permite guardar todos los campos los resultado, por lo tanto ya no sería necesario guardar el archivo JTL si fuera necesario reconstruir los resultados.

De igual forma al enviar métricas de los contadores a ElasticSearch podríamos correlacionar los niveles de carga con los contadores de CPU, Memoria e I/O para poder medir el rendimiento de los servidores objetivo. Por lo tanto apesar de que JMeter es una herramienta de carga se puede integrar facilmente con estos aditamentos para poder medirt el desempeño.

Para Finalizar, si gustas comparar tus resultados utilizando variables de entorno de CI/CD, Anthony Gauthier nos dejó un regalo aquí. Suerte!

-Antonio