diff --git a/src/core/mysql b/src/core/mysql index 3a2def8..eeb0162 100644 --- a/src/core/mysql +++ b/src/core/mysql @@ -20,10 +20,10 @@ # Print the output of "mysqladmin status" to the mysql file print_mysql() { - log INFO "Starting 'mysql status' report - ${LOGFILE##*/}" local LOGFILE="$1" local MYCNF="$2" local PLESK_FILE="/etc/psa/.psa.shadow" + log INFO "Starting 'mysql status' report - ${LOGFILE##*/}" if [[ -r "${PLESK_FILE}" ]]; then echo "MySQL (plesk) status" >> "${LOGFILE}" mysqladmin \ @@ -44,10 +44,10 @@ print_mysql() { # Print the non-truncated innodb status to the mysql file print_mysql_innodb_status() { - log INFO "Starting 'mysql innodb' report - ${LOGFILE##*/}" local LOGFILE="$1" local MYCNF="$2" local mysql_cmd='' + log INFO "Starting 'mysql innodb' report - ${LOGFILE##*/}" unset MYVALS PID_FILE TMPDIR if [[ -r "${PLESK_FILE}" ]]; then @@ -91,10 +91,55 @@ print_mysql_innodb_status() { # Print the output of "mysqladmin processlist" to the mysql file print_mysql_procs() { + local LOGFILE="$1" + local MYCNF="$2" + local PLESK_FILE="/etc/psa/.psa.shadow" log INFO "Starting 'mysql processlist' report - ${LOGFILE##*/}" + if [[ -r "${PLESK_FILE}" ]]; then + echo "MySQL (plesk) processes" >> "${LOGFILE}" + if [[ ${MYSQL_PROCESS_LIST,,} == "table" ]]; then + mysqladmin \ + -uadmin \ + -p$( cat "${PLESK_FILE}" ) \ + -v processlist \ + --connect-timeout=5 \ + >> "${LOGFILE}" + fi + if [[ ${MYSQL_PROCESS_LIST,,} == "vertical" ]]; then + mysql \ + -uadmin \ + -p$( cat "${PLESK_FILE}" ) \ + --connect-timeout=5 \ + -e "show full processlist\G" \ + >> "${LOGFILE}" + fi + else + echo "MySQL (${MYCNF}) processes" >> "${LOGFILE}" + if [[ ${MYSQL_PROCESS_LIST} == "table" ]]; then + mysqladmin \ + --defaults-file="${MYCNF}" \ + -v processlist \ + --connect-timeout=5 \ + >> "${LOGFILE}" + elif [[ ${MYSQL_PROCESS_LIST,,} == "vertical" ]]; then + mysql \ + --defaults-file="${MYCNF}" \ + --connect-timeout=5 \ + -e "show full processlist\G" \ + >> "${LOGFILE}" + fi + fi + print_blankline "${LOGFILE}" + log INFO "Ended 'mysql processlist' report" +} + +# Pipe the output of "mysqladmin processlist" through head and append to the mysql file +print_mysql_procs_max_bytes() { local LOGFILE="$1" local MYCNF="$2" + local MYSQL_PROCESS_LIST_MAX_BYTES="$3" local PLESK_FILE="/etc/psa/.psa.shadow" + log INFO "Starting 'mysql processlist' report with max bytes ${MYSQL_PROCESS_LIST_MAX_BYTES} - ${LOGFILE##*/}" if [[ -r "${PLESK_FILE}" ]]; then echo "MySQL (plesk) processes" >> "${LOGFILE}" if [[ ${MYSQL_PROCESS_LIST,,} == "table" ]]; then @@ -103,7 +148,10 @@ print_mysql_procs() { -p$( cat "${PLESK_FILE}" ) \ -v processlist \ --connect-timeout=5 \ + | stdbuf -oL head -c ${MYSQL_PROCESS_LIST_MAX_BYTES} \ >> "${LOGFILE}" + print_blankline "${LOGFILE}" + echo "-- WARNING POTENTIALLY TRUCATED PROCESSLIST OUTPUT" >> "${LOGFILE}" fi if [[ ${MYSQL_PROCESS_LIST,,} == "vertical" ]]; then mysql \ @@ -111,7 +159,10 @@ print_mysql_procs() { -p$( cat "${PLESK_FILE}" ) \ --connect-timeout=5 \ -e "show full processlist\G" \ + | stdbuf -oL head -c ${MYSQL_PROCESS_LIST_MAX_BYTES} \ >> "${LOGFILE}" + print_blankline "${LOGFILE}" + echo "-- WARNING POTENTIALLY TRUCATED PROCESSLIST OUTPUT" >> "${LOGFILE}" fi else echo "MySQL (${MYCNF}) processes" >> "${LOGFILE}" @@ -120,13 +171,19 @@ print_mysql_procs() { --defaults-file="${MYCNF}" \ -v processlist \ --connect-timeout=5 \ + | stdbuf -oL head -c ${MYSQL_PROCESS_LIST_MAX_BYTES} \ >> "${LOGFILE}" + print_blankline "${LOGFILE}" + echo "-- WARNING POTENTIALLY TRUCATED PROCESSLIST OUTPUT" >> "${LOGFILE}" elif [[ ${MYSQL_PROCESS_LIST,,} == "vertical" ]]; then mysql \ --defaults-file="${MYCNF}" \ --connect-timeout=5 \ -e "show full processlist\G" \ + | stdbuf -oL head -c ${MYSQL_PROCESS_LIST_MAX_BYTES} \ >> "${LOGFILE}" + print_blankline "${LOGFILE}" + echo "-- WARNING POTENTIALLY TRUCATED PROCESSLIST OUTPUT" >> "${LOGFILE}" fi fi print_blankline "${LOGFILE}" diff --git a/src/recap b/src/recap index 9bc449d..b23741a 100755 --- a/src/recap +++ b/src/recap @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/bash # # Copyright (C) 2017 Rackspace, Inc. # @@ -32,7 +32,7 @@ declare -r _VERSION='2.1.0' declare -r DATE=$( date +%F_%T ) declare -r LOCKFILE="/var/lock/recap.lock" declare -r LOG_SUFFIX=$( date +%Y%m%d-%H%M%S ) -declare -r LIBDIR="/usr/local/lib/recap" +declare -r LIBDIR="/usr/lib/recap" declare -r COREDIR="${LIBDIR}/core" declare -r PLUGIN_A_DIR="${LIBDIR}/plugins-available" declare -r PLUGIN_E_DIR="${LIBDIR}/plugins-enabled" @@ -91,10 +91,12 @@ USEMYSQL="${default_USEMYSQL}" # These depend on USEMYSQL to be enabled("yes") declare -r default_DOTMYDOTCNF="/root/.my.cnf" declare -r default_MYSQL_PROCESS_LIST="table" +declare -r default_MYSQL_PROCESS_LIST_MAX_BYTES=0 declare -r default_USEINNODB="no" declare -r default_USEMYSQLPROCESSLIST="no" DOTMYDOTCNF="${default_DOTMYDOTCNF}" MYSQL_PROCESS_LIST="${default_MYSQL_PROCESS_LIST}" +MYSQL_PROCESS_LIST_MAX_BYTES="${default_MYSQL_PROCESS_LIST_MAX_BYTES}" USEINNODB="${default_USEINNODB}" USEMYSQLPROCESSLIST="${default_USEMYSQLPROCESSLIST}" @@ -395,8 +397,13 @@ run_mysql_report() { # check to see if the optional mysql process list should be generated if [[ "${USEMYSQLPROCESSLIST,,}" == "yes" ]]; then - print_blankline "${ITEM_FILE}" - print_mysql_procs "${ITEM_FILE}" "${MYCNF}" + if [[ "${MYSQL_PROCESS_LIST_MAX_BYTES}" -gt 0 ]]; then + print_blankline "${ITEM_FILE}" + print_mysql_procs_max_bytes "${ITEM_FILE}" "${MYCNF}" "${MYSQL_PROCESS_LIST_MAX_BYTES}" + else + print_blankline "${ITEM_FILE}" + print_mysql_procs "${ITEM_FILE}" "${MYCNF}" + fi fi if [[ "${USEINNODB,,}" == "yes" ]]; then # send df -h output to output file diff --git a/src/recap.conf b/src/recap.conf index 4e629c7..29f9dfa 100644 --- a/src/recap.conf +++ b/src/recap.conf @@ -69,6 +69,12 @@ # Example, to enable: USEMYSQLPROCESSLIST="yes" #USEMYSQLPROCESSLIST="no" +# MYSQL_PROCESS_LIST_MAX_BYTES - Limit byte length of logs from "mysqladmin processlist" +# Makes use of DOTMYDOTCNF and MYSQL_PROCESS_LIST +# requires: USEMYSQL +# Example, set larger than 0 to enable: MYSQL_PROCESS_LIST_MAX_BYTES=104857600 +#MYSQL_PROCESS_LIST_MAX_BYTES=0 + # USEINNODB - Generates logs from "mysql show engine innodb status" # Makes use of DOTMYDOTCNF # requires: USEMYSQL