# shellcheck shell=bash # no need for shebang - this file is loaded from charts.d.plugin # SPDX-License-Identifier: GPL-3.0-or-later # netdata # real-time performance and health monitoring, done right! # (C) 2016 Costa Tsaousis # # http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html # # https://dev.mysql.com/doc/refman/5.1/en/show-status.html # SHOW STATUS provides server status information (see Section 5.1.6, “Server Status Variables”). # This statement does not require any privilege. # It requires only the ability to connect to the server. mysql_update_every=2 mysql_priority=60000 declare -A mysql_cmds=() mysql_opts=() mysql_ids=() mysql_data=() mysql_get() { local arr local oIFS="${IFS}" mysql_data=() IFS=$'\t'$'\n' #arr=($(run "${@}" -e "SHOW GLOBAL STATUS WHERE value REGEXP '^[0-9]';" | egrep "^(Bytes|Slow_|Que|Handl|Table|Selec|Sort_|Creat|Conne|Abort|Binlo|Threa|Innod|Qcach|Key_|Open)" )) #arr=($(run "${@}" -N -e "SHOW GLOBAL STATUS;" | egrep "^(Bytes|Slow_|Que|Handl|Table|Selec|Sort_|Creat|Conne|Abort|Binlo|Threa|Innod|Qcach|Key_|Open)[^ ]+\s[0-9]" )) # shellcheck disable=SC2207 arr=($(run "${@}" -N -e "SHOW GLOBAL STATUS;" | grep -E "^(Bytes|Slow_|Que|Handl|Table|Selec|Sort_|Creat|Conne|Abort|Binlo|Threa|Innod|Qcach|Key_|Open)[^[:space:]]+[[:space:]]+[0-9]+")) IFS="${oIFS}" [ "${#arr[@]}" -lt 3 ] && return 1 local end=${#arr[@]} for ((i = 2; i < end; i += 2)); do mysql_data["${arr[$i]}"]=${arr[i + 1]} done [ -z "${mysql_data[Connections]}" ] && return 1 mysql_data[Thread_cache_misses]=0 [ $((mysql_data[Connections] + 1 - 1)) -gt 0 ] && mysql_data[Thread_cache_misses]=$((mysql_data[Threads_created] * 10000 / mysql_data[Connections])) return 0 } mysql_check() { # this should return: # - 0 to enable the chart # - 1 to disable the chart local x m mysql_cmd tryroot=0 unconfigured=0 if [ "${1}" = "tryroot" ]; then tryroot=1 shift fi # shellcheck disable=SC2230 [ -z "${mysql_cmd}" ] && mysql_cmd="$(which mysql 2>/dev/null || command -v mysql 2>/dev/null)" if [ ${#mysql_opts[@]} -eq 0 ]; then unconfigured=1 mysql_cmds[local]="$mysql_cmd" if [ $tryroot -eq 1 ]; then # the user has not configured us for mysql access # if the root user is passwordless in mysql, we can # attempt to connect to mysql as root mysql_opts[local]="-u root" else mysql_opts[local]= fi fi # check once if the url works for m in "${!mysql_opts[@]}"; do [ -z "${mysql_cmds[$m]}" ] && mysql_cmds[$m]="$mysql_cmd" if [ -z "${mysql_cmds[$m]}" ]; then # shellcheck disable=SC2154 error "cannot get mysql command for '${m}'. Please set mysql_cmds[$m]='/path/to/mysql', in $confd/mysql.conf" fi mysql_get "${mysql_cmds[$m]}" ${mysql_opts[$m]} # shellcheck disable=SC2181 if [ ! $? -eq 0 ]; then error "cannot get global status for '$m'. Please set mysql_opts[$m]='options' to whatever needed to get connected to the mysql server, in $confd/mysql.conf" unset "mysql_cmds[$m]" unset "mysql_opts[$m]" unset "mysql_ids[$m]" continue fi mysql_ids[$m]="$(fixid "$m")" done if [ ${#mysql_opts[@]} -eq 0 ]; then if [ ${unconfigured} -eq 1 ] && [ ${tryroot} -eq 0 ]; then mysql_check tryroot "${@}" return $? else error "no mysql servers found. Please set mysql_opts[name]='options' to whatever needed to get connected to the mysql server, in $confd/mysql.conf" return 1 fi fi return 0 } mysql_create() { local x # create the charts for x in "${mysql_ids[@]}"; do cat <