JMeter (InfluxDB + Grafana)

title

¿ Qué es InfluxDB ?

InfluxDB es un servicio de base de datos para series de tiempo, el cual es ideal para guardar medidas numéricas y/o resultados en tiempo real. Parte del éxito de InfuxDB es que se encuentra escrito en GoLanguage, esta particularidad es lo hace desempeñarse mucho mejor al resto de bases de datos basadas en series de tiempo (time series DBMS). Podríamos implementar la solución de este artículo también con Graphite pero creo que solo sería recomendable si tuvieran que sobreponer resultados para fines comparativos o de "benchmarking".

La administración, escritura y/o lectura de datos en InfluxDB se pueden realizar por medio de su servicio API, el cual recibe las peticiones en protocolo HTTP y ejecuta las operaciones en el lenguaje InfluxQL (similar a SQL) en nuestra base de datos. La ingesta puede ser unitaria o por bloques, esto quiere decir que puede mandar una petición HTTP con una o varias mediciones simultáneamente. También se podría realizar ingesta tipo "Bulk" o de datos crudos en formato CSV, pero eso estaría fuera de nuestro alcance. Te recomiendo visitar este artículo para que puedas jugar un poco con InfluxDB. Por último, pero no menos importante InfluxDB es proyecto open source.

¿ Qué es Grafana ?

Grafana es una herramienta para la visualización de tableros y gráficos, que se alimentan de datos métricos de bases de datos en series de tiempo. Esto delimitado a un lapso implícito o ventana de tiempo, en otras palabras solo podemos acotar el tablero a una ventana de tiempo especifica. Grafana al igual que InfluxDB también está escrita en GoLanguage y también es un proyecto open source.

Esta herramienta nos puede ayudar a entender y/o analizar comportamientos o patrones, gracias a la sencillez para modificar las ventanas de tiempo, al realizar cambios los valores se calculan nuevamente sobre la nueva ventana. Ejemplo podemos de manera sencilla ver el comportamiento histórico del CPU o Memoria de uno o varios servidores por día, semana, mes o año. Con esta información podemos entender los hábitos de consumo actuales y/o pronosticar futuras conductas.

¿ Cómo se funciona la integración InfluxDB y Grafana con JMeter ?

La integración es bastante sencilla y popular. Tan popular que existe un componente nativo en JMeter para dicha integración el Backend Listener, este componente receptor envía a InfluxDB mediante peticiones HTTP asíncronas, los resultados obtenidos por JMeter por medio de bloques. Una vez almacenados en InfluxDB estos resultados pueden ser leídos o graficados en un tablero de Grafana para su visualización.

design

El receptor enviará a InfluxDB 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 enviados a InfluxDB en un máximo de hasta 5000 renglones, cada renglón puede contener múltiples mediciones. Por cierto, eso no significaría mucho esfuerzo para InfluxDB. Los datos se transmiten en peticiones HTTP en método POST hacía el API de InfluxDB, un buen punto sería contar con un usuario para escribir y otro para leer (por seguridad). Una vez que hayas podido validar que los datos están ingresando correctamente, podemos construir un tablero 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 Grafana.

¿ Que necesitamos ?

1.- Necesitamos una base de datos en InfluxDB, InfluxData te otorga 15 días de periodo de prueba con una instancia de hasta 4 vCpus y 16 GB de RAM, la cual es más que suficiente para esta prueba. También puedes descargar e instalar InfluxDB 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 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.

3.- Crear una base de datos en InfluxDB y un usuario para lectura y otro para escritura (puede ser el mismo usuario para ambas tareas).

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

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

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 InfluxDB, como podrás ver en las imágenes, obtenemos una URL en donde estará nuestro servicio API https://hillvalley-1cf3ad8f.influxcloud.net:8086. Al lanzar Chronograf, seleccionamos la opción de administración de InfluxDB para generar nuestra base de datos, la cual llamaremos InfluxDataBase, así mismo también creamos el usuario listener y su contraseña. Para simplificar la interacción este usuario puede leer y escribir datos, con la finalidad de poder ser utilizado por JMeter y Grafana.

influxdb-1

influxdb-2

influxdb-3

influxdb-4

influxdb-5

Paso 2

Debemos agregar y configurar el Backend listener con los datos del paso #1, como ya lo habíamos mencionado la URL es https://hillvalley-1cf3ad8f.influxcloud.net:8086, pero también debemos especificar la base de datos a la cual deseamos escribir los resultados y también autenticar al usuario y la contraseña con la que vamos a interactuar. Por fortuna estos valores se puede mandar como parámetros de la petición de la siguiente manera: https://hillvalley-1cf3ad8f.influxcloud.net:8086/write?**db=InfluxDataBase**&**u=listener**&**p=password**, en donde db es la base de datos InfluxDataBase, u es el usuario listener y p es la contraseña password. Después de configurar esto, hagamos una pequeña prueba de algunos poco usuarios concurrentes.

influxdb-jmeter

Paso 3

Validaremos por medio de peticiones HTTP con el comando CURL que la información está siendo depositada correctamente en nuestr base de datos:

1.- curl -G 'https://hillvalley-1cf3ad8f.influxcloud.net:8086/query?db=InfluxDataBase&u=listener&p=password&pretty=true' --data-urlencode "q=SHOW MEASUREMENTS"

influxdb-curl1

2.- curl -G 'https://hillvalley-1cf3ad8f.influxcloud.net:8086/query?db=InfluxDataBase&u=listener&p=password&pretty=true' --data-urlencode "q=SELECT * from jmeter limit 2"

influxdb-curl2

Paso 4

Se debe construir el tablero en Grafana para poder graficar los datos que fueron enviados a InfluxDB, 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 #5496, el cual solo debemos copiar su número e introducirlo en Grafana. Pero antes debemos configurar la conexión del data source entre Grafana e InfluxDB.

grafana-1

grafana-2

grafana-3

grafana-4

grafana-5

grafana-6

grafana-7

grafana-8

Conclusión

Para este artículo me basé en parte de una publicación que realicé en el año 2018 y la puedes consultar aquí. La publicación está en inglés y utiliza 2 receptores JSR223 con lenguaje de programación Groovy con una lógica muy similar a la utilizado por el Backend Listener, sin embargo tiene algunas diferencias en cuanto al formato y los datos que se envían a InfluxDB. Así mismo los tableros de Grafana los construí especialmente diseñados para ese formato, por lo que no son compatibles con este artículo. No cubrí ese material porque mi intención es proveer una solución simple. Cuando te sientas más avanzado te invito a utilizar y/o modificar el código de dicho publicación.

Esta solución me ha funcionado para miles de usuarios concurrentes, dado que es muy sencillo escalar horizontalmente InfluxDB, mientras que Grafana aun con la instancia Cloud es suficiente. En cuanto tengan más experiencia te invito a crear sus propios tableros en Grafana y/o modificar los existentes, es bastante sencillo y de mucha utilidad. Porque también se puede enviar de forma paralela los contadores de CPU, Memoria, Disco y Ancho de Banda de sus generadores de carga o servidores objetivo utilizando telegraf o la solución que nos compartió Delvis en esta publicación, esto con la finalidad de cuantificar y correlacionar niveles de carga con niveles de consumo, de esta manera podríamos medir el desempeño de los servidores involucrados.

Bienvenidos al monitoreo en tiempo real de tus resultados y niveles de consumo. Recuerden que esta información se encuentra también disponible en el sitio oficial de JMeter en la siguiente liga. Les deseo mucha suerte.

-Antonio