Saltar al contenido

Mes: julio 2024

Tool: MySQL Profiler con Python

Hace ya algún tiempo que no hacia un post, tengo varios en el tintero y busco hacerme un tiempo en adelante para seguir actualizando el blog.

Dicho esto, en este post voy a presentar una herramienta sencilla que he realizado para suplir la necesidad de un «SQL Profiler» para MySQL. Como saben, en la suite de SQL Server, tenemos el IDE (management studio) y también un Profiler, es último nos sirve para poder monitorear que está ocurriendo en nuestra BD. Una herramienta extremadamente util, para distintos perfiles técnicos (DBAs, desarrolladores, etc).

SQL Profiler
SQL Profiler

Me encontraba revisando una aplicación que llego como un proyecto de fin de semana y me vi con la necesidad de usar una herramienta similar, pero que funcione en MySQL. Revisando un poco las herramientas opensource actuales, vi que ninguna me brindaba la información que necesitaba, por ahí vi que hay algunas herramientas que si cubrían esta necesidad, pero son de pago.

Teniendo esto en mente, la lógica detrás de una herramienta así, no se me hacía tan complicada, y ya antes había visto que uno puede habilitar que se genere un log de los queries que se ejecutan en el servidor.

Opción MySQL Logging en Windows
Cambiar configuración del Logging

Así que de pasada para poner practicar un poco de python, realice un script que nos permite monitorear los comando que ejecutamos.

Primero, debemos asegurarnos de tener habilitada la opción en nuestro MySQL, para que se registren los logs de los queries que se ejecutan (importante considerar que esta opción no es recomendado para servidores productivos, por lo que esta tool esta orientada a desarrolladores).

Ahora, un paso importante en esta configuración, es asegurarnos que esta información no la envie a una archivo de text (opción por default), sino que la mande a una tabla en base de datos. Esto lo conseguimos cambiando un atributo en nuestro archivo de configuración.

Configuración necesaria

Una vez que hemos hecho esto, corramos un script en nuestra base de datos para asegurarnos que se correctamente configurada nuestra tabla en la que se van a grabar todos los queries.

SET @old_log_state = @@global.general_log; 
SET GLOBAL general_log = 'OFF'; 
ALTER TABLE mysql.general_log ENGINE = MyISAM; 
ALTER TABLE mysql.general_log ADD INDEX (event_time); 
SET GLOBAL general_log = @old_log_state;

Con estos cambios, reiniciemos el servidor («services.msc» en windows y «systemctl restart mysql» en linux) y demosle una revisada a la tabla con un simple select, para asegurarnos que ya se están registrando valores.

Es recomendable que también creemos un usuario especifico para nuestra aplicación, esto nos va a servir mucho para poder filtrar solo los queries que pertenecen a nuestra aplicación.

Ahora si vamos a la parte de python. El código es sencillo, veamos un poco cuales han sido las funciones que hemos definido para conseguir nuestro cometido:

  • connect_to_database: Nos permite inicializar una conexión a la base de datos (cambién por la información que requieran para sus ambientes de desarrollo).
connect_to_database
  • fetch_general_log:
    • Realizamos la consulta a la base de datos, acá tenemos un query que permite obtener todas las consultas de un usuario en específico y sanitizando un poco la información que vamos a obtener, obviando consultas automáticas que no realiza nuestra aplicación. No hay mucha ciencia en el query, prefiltramos la data, para no traernos toda la información, dado que la idea de esta herramienta es ver las últimas consultas que se van realizando.
    • Hay una lógica para obtener la fecha del último query valido, esto nos sirve, sólo para mostrar los últimos registros.
    • Si los criterios se cumplen, pintamos en la consola el query realizado. Con la libreria antes instalada, podemos darle color a esto, para identificar cual es la marca de tiempo y cual es el contenido del query.
    • Finalmente, actualizamos cerramos el cursos y nuestra conexión a la base de datos.
fetch_general_log
  • main: Nuestra función inicial, acá inicializamos la fecha actual de nuestro sistema (esta la usaremos para asegurarnos de obtener sólo resultados, luego de esta fecha), indicamos el nombre del usuario por el que luego vamos a filtrar los registros en esta tabla y llamamos a nuestra función «fetch_general_log». Es importante tener en cuenta, que todo esto corre dentro de un bucle «while ‘true'», y se va a realizar cada 1 segundo. Tenemos un try/catch, para capturar algún error en la conexión a la BD y cuando cancelemos con un comando
main

Como ven, es un código sencillo, pero que nos brinda una utilidad importante al momento de desarrollar. Adiconalmente a esto, cree un script en bash, para poder llamarlo como un comando más del SO.

Les dejo una captura de como funciona la herramienta:

Profiler corriendo

Espero que les sirva, al menos para mi es una herramienta más cuando tengo que trabajar en poryecto que usa MySQL como base de datos. Finalmente, les comparto el repositorio donde he subido la herramienta.

REPO GITHUB

Saludos.

Deja un comentario