MySQL Server Advanced Plugin

Monitorización de bases de datos MySQL sobre Unix.

Changelog

Date Author Change Version
12/03/12 Tomas First Version V1r1
01/07/2013 Mario Cambios en coódigo v1r2
25/04/2014 Mario Cambios en código v1r3
3/09/2022 Alex Cambios en el código v1r4

 

 





Introducción

Este documento tiene como objetivo la descripción de la monitorización de bases de datos MySQL sobre Unix. Se han elegido una serie de módulos “base” en base a nuestra experiencia en monitorización de sistemas y las necesidades de algunos de nuestros clientes. También se han añadido todas las especificaciones recogidas en diferentes entornos de producción real, tomando
especificaciones reales de administradores de bases de datos.

Para la extracción de la información se utiliza:

• Un fichero de configuración externo donde se define toda la parametrización del plugin. Este fichero de configuración puede hacer llamadas (includes) a otros ficheros.
• Se utiliza el software ya instalado en el sistema (MySQL, comandos del sistema, ficheros de alertas de MySQL, etc), para la monitorización realizada por el plugin sin tener que instalar librerías o utilidades de terceros.
• Se utiliza un parser de log existente (el de Pandora) para procesar los logs de alertas de MySQL. Este parser debe ser “automático” y se basará en el reporte de todos los mensajes de error críticos con la forma “ERROR *”.
• Se realizan una serie de chequeos básicos “por defecto”, aunque se pueden suprimir o personalizar.
• Se dispone de una interfaz “abierta” para especificar consultas SQL libres, permitiendo modelar todo tipo de consultas SQL que se realizan con otras herramientas o de forma manual por los administradores.
• El sistema se integra con el agente Unix y con la capacidad de distribuir colecciones de ficheros, de forma que se puede distribuir el plugin por un lado y las colecciones de ficheros de forma individual -por agente- y/o por política.

Cabe destacar que como el resto de monitorización con Pandora FMS, el plugin de monitorización
MySQL se puede usar para recoger información de tipo “cadena de texto” (para tratarlo como
eventos) o de tipo numérico (para hacer gestión del rendimiento).

Requisitos

Los requisitos para que funcione correctamente esta monitorización son los siguientes:
• Instalar el agente de Pandora FMS.
• Tener perl instalado.
• Tener una base de datos MySQL instalada en la máquina donde se va a monitorizar, con conectividad a dicha base de datos.
• Especificar el nombre, usuario, password y host de la base de datos MySQL.
• Es necesario que el usuario con el que se ejecuta el agente de Pandora FMS, que es el usuario que ejecutará el plugin, tenga acceso a los siguientes recursos de MySQL:
   ◦ Directorio MySQL homedir (directorio con la instalación de MySQL, típicamente
   /var/lib/mysql).
   ◦ Fichero de log de MySQL (típicamente /var/lib/mysql/mysql.log).
   ◦ Acceso y permisos de escritura a un directorio para ficheros temporales.


Documentacion que debe entregar el Área que requiere la monitorizacion
Para la correcta monitorización de MySQL es necesario que el Área técnica envíe cierta información que sera incluida en los ficheros de configuración. Esta información es la siguiente:
• Usuario, password, host con acceso a la base de datos MySQL. Dicho usuario debe tener
permiso para leer en todas las tablas de las que se quiera extraer información.
• Ficheros de log y directorio base de MySQL.
• Si desea monitorizar alguna cosa que no venga definida “por defecto” será necesario que
provea el código SQL para realizar esa monitorización, así como un ejemplo del dato desalida,
especificando si es numérico, o tipo cadena, etc).

Matriz de compatibilidad

Sistemas donde se ha probado • Ubuntu 10.04 con MySQL 5.0
• OpenSuse 11.2 con MySQL 5.5
Sistemas donde deberia funcionar • Resto de sistemas Unix con MySQL 5.0 o
superiores

Clasificación de módulos de agentes software generados

Hay que tener en cuenta que la mayoría de estos parámetros deben ser procesados como “delta” o
usando el tipo de datos “generic_data_inc” ya que son contadores.

Aborted_connects
Binlog_cache_disk_use
Binlog_cache_use
Binlog_stmt_cache_disk_use
Binlog_stmt_cache_use
Bytes_received
Bytes_sent
Com_admin_commands
Com_assign_to_keycache
Com_alter_db
Com_alter_db_upgrade
Com_alter_event
Com_alter_function
Com_alter_procedure
Com_alter_server
Com_alter_table
Com_alter_tablespace
Com_analyze
Com_begin
Com_binlog
Com_call_procedure
Com_change_db
Com_change_master
Com_check
Com_checksum
Com_commit
Com_create_db
Com_create_event
Com_create_function
Com_create_index
Com_create_procedure
Com_create_server
Com_create_table
Com_create_trigger
Com_create_udf
Com_create_user
Com_create_view
Com_dealloc_sql
Com_delete
Com_delete_multi
Com_do
Com_drop_db
Com_drop_event
Com_drop_function
Com_drop_index
Com_drop_procedure
Com_drop_server
Com_drop_table
Com_drop_trigger
Com_drop_user
Com_drop_view
Com_empty_query
Com_execute_sql
Com_flush
Com_grant
Com_ha_close
Com_ha_open
Com_ha_read
Com_help
Com_insert
Com_insert_select
Com_install_plugin
Com_kill
Com_load
Com_lock_tables
Com_optimize
Com_preload_keys
Com_prepare_sql
Com_purge
Com_purge_before_date
Com_release_savepoint
Com_rename_table
Com_rename_user
Com_repair
Com_replace
Com_replace_select
Com_reset
Com_resignal
Com_revoke
Com_revoke_all
Com_rollback
Com_rollback_to_savepoint
Com_savepoint
Com_select
Com_set_option
Com_signal
Com_show_authors
Com_show_binlog_events
Com_show_binlogs
Com_show_charsets
Com_show_collations
Com_show_contributors
Com_show_create_db
Com_show_create_event
Com_show_create_func
Com_show_create_proc
Com_show_create_table
Com_show_create_trigger
Com_show_databases
Com_show_engine_logs
Com_show_engine_mutex
Com_show_engine_status
Com_show_events
Com_show_errors
Com_show_fields
Com_show_function_status
Com_show_grants
Com_show_keys
Com_show_master_status
Com_show_open_tables
Com_show_plugins
Com_show_privileges
Com_show_procedure_status
Com_show_processlist
Com_show_profile
Com_show_profiles
Com_show_relaylog_events
Com_show_slave_hosts
Com_show_slave_status
Com_show_status
Com_show_storage_engines
Com_show_table_status
Com_show_tables
Com_show_triggers
Com_show_variables
Com_show_warnings
Com_slave_start
Com_slave_stop
Com_stmt_close
Com_stmt_execute
Com_stmt_fetch
Com_stmt_prepare
Com_stmt_reprepare
Com_stmt_reset
Com_stmt_send_long_data
Com_truncate
Com_uninstall_plugin
Com_unlock_tables
Com_update
Com_update_multi
Com_xa_commit
Com_xa_end
Com_xa_prepare
Com_xa_recover
Com_xa_rollback
Com_xa_start
Compression
Connections
Created_tmp_disk_tables
Created_tmp_files
Created_tmp_tables
Delayed_errors
Delayed_insert_threads
Delayed_writes
Flush_commands
Handler_commit
Handler_delete
Handler_discover
Handler_prepare
Handler_read_first
Handler_read_key
Handler_read_last
Handler_read_next
Handler_read_prev
Handler_read_rnd
Handler_read_rnd_next
Handler_rollback
Handler_savepoint
Handler_savepoint_rollback
Handler_update
Handler_write
Innodb_buffer_pool_pages_data
Innodb_buffer_pool_pages_dirty
Innodb_buffer_pool_pages_flushed
Innodb_buffer_pool_pages_free
Innodb_buffer_pool_pages_misc
Innodb_buffer_pool_pages_total
Innodb_buffer_pool_read_ahead_rnd
Innodb_buffer_pool_read_ahead
Innodb_buffer_pool_read_ahead_evicted
Innodb_buffer_pool_read_requests
Innodb_buffer_pool_reads
Innodb_buffer_pool_wait_free
Innodb_buffer_pool_write_requests
Innodb_data_fsyncs
Innodb_data_pending_fsyncs
Innodb_data_pending_reads
Innodb_data_pending_writes
Innodb_data_read
Innodb_data_reads
Innodb_data_writes
Innodb_data_written
Innodb_dblwr_pages_written
Innodb_dblwr_writes
Innodb_have_atomic_builtins
Innodb_log_waits
Innodb_log_write_requests
Innodb_log_writes
Innodb_os_log_fsyncs
Innodb_os_log_pending_fsyncs
Innodb_os_log_pending_writes
Innodb_os_log_written
Innodb_page_size
Innodb_pages_created
Innodb_pages_read
Innodb_pages_written
Innodb_row_lock_current_waits
Innodb_row_lock_time
Innodb_row_lock_time_avg
Innodb_row_lock_time_max
Innodb_row_lock_waits
Innodb_rows_deleted
Innodb_rows_inserted
Innodb_rows_read
Innodb_rows_updated
Innodb_truncated_status_writes
Key_blocks_not_flushed
Key_blocks_unused
Key_blocks_used
Key_read_requests
Key_reads
Key_write_requests
Key_writes
Last_query_cost
Max_used_connections
Not_flushed_delayed_rows
Open_files
Open_streams
Open_table_definitions
Open_tables
Opened_files
Opened_table_definitions
Opened_tables
Performance_schema_cond_classes_lost
Performance_schema_cond_instances_lost
Performance_schema_file_classes_lost
Performance_schema_file_handles_lost
Performance_schema_file_instances_lost
Performance_schema_locker_lost
Performance_schema_mutex_classes_lost
Performance_schema_mutex_instances_lost
Performance_schema_rwlock_classes_lost
Performance_schema_rwlock_instances_lost
Performance_schema_table_handles_lost
Performance_schema_table_instances_lost
Performance_schema_thread_classes_lost
Performance_schema_thread_instances_lost
Prepared_stmt_count
Qcache_free_blocks
Qcache_free_memory
Qcache_hits
Qcache_inserts
Qcache_lowmem_prunes
Qcache_not_cached
Qcache_queries_in_cache
Qcache_total_blocks
Queries
Questions
Rpl_status
Select_full_join
Select_full_range_join
Select_range
Select_range_check
Select_scan
Slave_heartbeat_period
Slave_open_temp_tables
Slave_received_heartbeats
Slave_retried_transactions
Slave_running
Slow_launch_threads
Slow_queries
Sort_merge_passes
Sort_range
Sort_rows
Sort_scan
Ssl_accept_renegotiates
Ssl_accepts
Ssl_callback_cache_hits
Ssl_cipher
Ssl_cipher_list
Ssl_client_connects
Ssl_connect_renegotiates
Ssl_ctx_verify_depth
Ssl_ctx_verify_mode
Ssl_default_timeout
Ssl_finished_accepts
Ssl_finished_connects
Ssl_session_cache_hits
Ssl_session_cache_misses
Ssl_session_cache_mode
Ssl_session_cache_overflows
Ssl_session_cache_size
Ssl_session_cache_timeouts
Ssl_sessions_reused
Ssl_used_session_cache_entries
Ssl_verify_depth
Ssl_verify_mode
Ssl_version
Table_locks_immediate
Table_locks_waited
Tc_log_max_pages_used
Tc_log_page_size
Tc_log_page_waits
Threads_cached
Threads_connected
Threads_created
Threads_running
Uptime
Uptime_since_flush_status

Instalación

Copiar el plugin al directorio de plugins del agente, o distribuirlo con file collections. Lo mismo con el archivo conf. La llamada desde el agente será similar a esta, pero usando los paths donde esté instalado el plugin y el conf.

module_plugin perl /etc/pandora/plugins/pandora_mysql.pl /etc/pandora/plugins/mysql.conf

Monitorización

El plugin monitoriza “por defecto” los siguientes puntos:

• Verificación del conectividad con la base de datos.
• Chequear si el proceso de mysql está activo .
• Chequeo de memoria del servidor (proceso) .
• Número de conexiones TIME_WAIT en el sistema .
• Chequeo de espacio en disco del servidor (generalmente /var/lib/mysql).
• Tamaño del fichero ibdata1 .
• Busqueda de errores en los logs de error de la base de datos (generalmente /var/lib/mysql/mysql.log).

Adicionalmente también monitoriza los siguientes parámetros de rendimiento:

• Número de conexiones activas MySQL.
• Tiempo de actividad del servidor (uptime).
• Número de conexiones abortadas por que el cliente no cerró correctamente la conexión.
• Número de bytes recibidos por los clientes.
• Información de estado del servidor (SHOW GLOBAL STATUS ó SHOW STATUS).
• Información de estado de InnoDB (SHOW INNODB STATUS) .
• Número de bytes enviados por los clientes.
• Número de inserciones en la base de datos.
• Número de bloqueos sobre tablas en la base de datos al realizar una transacción.
• Bloqueos activos sobre tablas y registros por cada sesión activa.
• Peticiones de I/0 pendientes.
• Tamaño total de datos en GB.

Todos esos módulos vienen parametrizados en el fichero “mysql.conf” que viene en el paquete del plugin. Esos módulos pueden ser eliminados o ampliados por un administrador de MySQL.

Parametrización del plugin

El plugin se utiliza previa configuración del fichero externo de configuración.

NOTA: Es extremadamente importante tener en cuenta que los archivos de configuración pensados para el plugin en UNIX deben estar editados y almacenados con retornos de carro tipo “UNIX” y que si se usan retornos de carro tipo “WINDOWS” el plugin no funcionará adecuadamente.

Existen tres bloques funcionales dentro del fichero de configuración:

Configuración de acceso a MySQL y datos generales

Para que el plugin monitorice la base de datos hay que proporcionarle las credenciales de acceso y algunos datos generales que luego se usarán en las comprobaciones:
Usuario, password y host de MySQL
Las credenciales de acceso se completarán de la siguiente forma:

conf_mysql_user mysql
conf_mysql_pass 1234
conf_mysql_host 127.0.0.1

Existe la posibilidad de que tengamos la contraseña en blanco del usuario mysql. En este caso
habria que comentar la linea ( # conf_mysql_pass)
Datos generales
Aquí se especificarán el directorio home de MySQL (generalmente /var/lib/mysql), el fichero de
log, un directorio para ficheros temporales y la ruta completa al plugin de parseo de logs de
Pandora:

conf_mysql_homedir /var/lib/mysql
conf_mysql_basedir /var/lib/mysql
conf_mysql_logfile /var/log/mysql.log
conf_temp /tmp
conf_logparser /etc/pandora/plugins/grep_log

Parámetros de sistema

A continuación se describen los módulos de comprobación específicos del sistema que se encuentran
configurados por defecto en el mysql.conf adjunto:
Bloque de chequeo de sistema
Un bloque de chequeo de sistema en el fichero de configuración es como se muestra a continuación:

check_begin
# Linea de comentario.
<token de chequeo de sistema>
check_end


A continuación se describen los chequeos del plugin:
Verificación del conectividad con la base de datos
Mediante este chequeo se comprobará si la base de datos tiene conectividad con otros elementos
software. Si este chequeo no es satisfactorio se abortará la monitorización:

check_begin
check_mysql_service
check_end


Chequear si el proceso de mysql está activo
Este chequeo comprueba que el proceso de MySQL este activo en el sistema:

check_begin
check_mysql_service
check_end


Chequeo de memoria del servidor (proceso)
Mediante este chequeo se comprueba el uso de memoria por el servidor MySQL.

check_begin
check_mysql_memory
check_end



Número de conexiones TIME_WAIT en el sistema
Muestra el número de conexiones en estado TIME_WAIT en el sistema:

check_begin
check_system_timewait
check_end


Chequeo de espacio en disco del servidor
Chequea el espacio es disco (en KB) por parte de la base de datos. Se comprobará el tamaño del
directorio MySQL homedir especificado en el apartado de Datos generales:

check_begin
check_system_diskusage
check_end


Tamaño del fichero ibdata1
Chequea el tamaño (en KB) del fichero ibdata1 que se encuentra en el directorio MySQL homedir:

check_begin
check_mysql_ibdata1
check_end


Búsqueda de errores en los logs de error de la base de datos
Buscará la cadena “ERROR” en el fichero de log indicado en la sección de Datos generales. Este modulo siempre devolverá el tipo de dato async_string y en caso de que la comprobación devuelva datos se ejecutará el comando asociado (explicado en la sección Ejecución de comandos bajo condición):

check_begin
check_mysql_logs
check_end

Parámetros de rendimiento

A continuación se describen los módulos de comprobación de rendimiento:
Bloque de chequeo de rendimiento
Similares a los de chequeos de sistema como se muestra a continuación:

check_begin
# Linea de comentario.
<token de chequeo de rendimiento>
check_end


A continuación se muestran los bloques de chequeo de rendimiento:
Número de conexiones activas MySQL
Devuelve el número de conexiones activas en la base de datos:

check_begin
mysql_status Full processlist
check_end


 Número de conexiones abortadas por que el cliente no cerró correctamente la conexión .

check_begin
mysql_status Aborted_connects
check_end


 Número de bytes recibidos por los clientes

check_begin
mysql_status Bytes_received
check_end



 Número de bytes enviados por los clientes

check_begin
mysql_status Bytes_sent
check_end



Información de estado del servidor (SHOW GLOBAL STATUS ó SHOW STATUS)
Estas consultas se basan en el comando SHOW GLOBAL STATUS de MySQL. Dentro de los datos
devueltos por este comando se podrá realizar la búsqueda de algún token y de su valor asociado:

check_begin
mysql_status <token to search>
check_end


Información de estado de InnoDB (SHOW INNODB STATUS)
Estas consultas se basan en el comando SHOW INNODB STATUS de MySQL. Dentro de los datos
devueltos por este comando se podrá realizar la búsqueda de algún token y de su valor asociado:

check_begin
mysql_status Com_insert
check_end


Número de inserciones en la base de datos

Número de transacciones de tipo INSERT hechas en la base de datos:

 

check_begin
check_name <check_name>
mysql_innodb <token to search in innodb status>
check_end

Número de bloqueos sobre tablas en la base de datos al realizar una transacción

check_begin
mysql_status Com_lock_tables
check_end


Bloqueos activos sobre tablas y registros por cada sesión activa

 

check_begin
# Number of locks over DB tables
mysql_status Table_locks_waited
check_end

check_begin
# Number of row locks
mysql_status Innodb_row_lock_waits
check_end



Peticiones de I/0 pendientes

check_begin
mysql_status Pending_io
check_end

Tamaño total de datos en GB

 

check_begin
mysql_status Total_size
check_end


Monitorización vía SQL
Una de las características mas potentes del plugin es la posibilidad de especificar su propia orden
SQL para obtener el valor. Veamos algún ejemplo:

check_begin
check_name num_tables
check_schema information_schema
check_sql SELECT COUNT(*) FROM tables
check_end
Check_name El nombre de la comprbación que se verá en la interfaz de Pandora. .
Check_sql La query que deberá devolver un dato simple (ya sea número o cadena)..
Check_schema El esquema de MySQL al que se conectará el plugin para realizar la query


Ejecución de comandos bajo condición
En todos los módulos se podrá especificar la ejecución de un comando si se cumple una condición.
Dichas condiciones podrán ser:
• == (igual a un valor)
• != (Diferente de un valor)
• < (menor de un valor dado)
• > (Mayor de un valor dado).
Si la condición se satisface entonces se ejecutará el comando configurado mediante el token post_execution. En el caso del chequeo check_mysql_logs se ejecutará el comando si devuelve algún dato esta comprobación.
Un ejemplo de esta configuración es la siguiente:

check_begin
check_mysql_cpu
post_condition > 95
post_execution snmptrap -v 1 -c public x.x.x.x 1.2.4.4.65.6.4.3 6 128
check_end


Parametrización del comando asociado a un chequeo
Como se comentó anteriormente en cada comprobación se puede configurar un comando a ejecutar si la condición se cumple. Además, se puede utilizar un token en el comando para que si este se ejecuta entonces se sustituya por el valor del chequeo. Por ejemplo, por medio de la macro _DATA_ en este ejemplo se guarda en el fichero /tmp/mysql_cpu_result el contenido del chequeo:

check_begin
check_mysql_cpu
post_condition > 95
post_execution echo _DATA_ >> /tmp/mysql_cpu_result
check_end


Estado del módulo
Complementariamente, los módulos devolverán un estado si se indica con el token de configuración:
post_status WARNING
O bien:
post_status CRITICAL

Tipo de dato
Por defecto todos los monitores devolverán generic_data, salvo que se indique el siguiente token de configuración.

module_type generic_data_inc
module_type async_string

(o cualquier otro válido)
La única excepción es el monitor check_mysql_service automáticamente un módulo de tipo generic_proc.

* En los módulos en los que usemos check_name, se puede usar check_type para elegir el tipo de dato del módulo.


Tratamiento de datos en comprobaciones de tipo de rendimiento
En comprobaciones de tipo de rendimiento y queries SQL se puede configurar para que se devuelva
el valor absoluto tal cual lo devuelve MySQL (data_absolute) o la diferencia entre el dato actual y el anterior (data_delta). En la primera ejecución de la comprobación configurada con data_delta no se devolverá dato alguno. A partir de la segunda ejecución se devolverá el incremento. Si se diera el caso que la diferencia entre el dato actual y el anterior fuera negativa, el valor de la comprobación se resetearia y la comprobación no devolverá dato alguno.

Por defecto las comprobaciones de tipo de rendimiento serán configuradas como data_absolute.
Por ejemplo esta comprobación devolverá el incremento de las sesiones activas en MySQL:

check_begin
mysql_status Full processlist
data_delta
check_end