diff --git a/plugins/emc/emc_vnx_nfsv3_stats b/plugins/emc/emc_vnx_nfsv3_stats new file mode 100755 index 00000000..93e6af9a --- /dev/null +++ b/plugins/emc/emc_vnx_nfsv3_stats @@ -0,0 +1,266 @@ +#!/bin/bash +###################################################################################################################### +# Plugin to monitor NFS statistics of EMC VNX 5300 Unified Storage system # +###################################################################################################################### + +# Author: Evgeny Beysembaev + +##################################### +# Description # +##################################### + +# The plugin monitors NFS v3 statistics of EMC Unified Storage system. Probably it can also be compatible with +# other Isilon or Celerra systems. It uses SSH to connect to Control Stations, then remotely executes +# /nas/sbin/server_stats and fetches and parses data from it. It supports gathering data both from active/active +# and active/passive Datamover configurations, ignoring offline or standby Datamovers. If all Datamovers are +# offline or absent, the plugin returns error. +# This plugin also automatically chooses Primary Control Station from the list by calling /nasmcd/sbin/getreason and +# /nasmcd/sbin/t2slot. +# +# At the moment data is gathered from the following statistics sources: +# nfs.v3.op - Tons of timings about NFS RPC calls +# nfs.client - Here new Client addresses are rescanned and added automatically. +# +# It's quite easy to comment out unneeded data to make graphs less overloaded or to add new statistics sources. + +##################################### +# Configuration # +##################################### + +# The plugin uses SSH to connect to Control Stations. It's possible to use 'nasadmin' user, but it would be better +# if you create read-only global user by Unisphere Client. The user should have only Operator role. +# I created "operator" user but due to the fact that Control Stations already had one internal "operator" user, +# the new one was called "operator1". So be careful. +# +# On munin-node side choose a user which will be used to connect through SSH. Generally user "munin" is ok. Then, +# execute "sudo su munin -s /bin/bash", "ssh-keygen" and "ssh-copy-id" to both Control Stations with newly created +# user. +# +# Make a link from /usr/share/munin/plugins/emc_vnx_nfsv3_stats to /etc/munin/plugins/emc_vnx_nfsv3_stats_, +# where is any arbitrary name of your storage system. The plugin will return in its answer +# as "host_name" field. +# Assume your storage system is called "VNX5300". +# +# Make a configuration file at /etc/munin/plugin-conf.d/emc_vnx_nfsv3_stats_VNX5300 +# +# [emc_vnx_nfsv3_stats_vnx5300] +# user munin # SSH Client local user +# env.username operator1 # Remote user with Operator role +# env.cs_addr 192.168.1.1 192.168.1.2 # Control Stations addresses +# env.nas_servers server_2 server_3 # This is the default value and can be omitted + +##################################### +# History # +##################################### + +# 08.11.2016 - First Release + +###################################################################################################################### + +export LANG=C + +TARGET=$(echo "${0##*/}" | cut -d _ -f 5) +: ${nas_servers:="server_2 server_3"} +SSH_CHECK='ssh -q $username@$CS "/nasmcd/sbin/getreason | grep -w slot_\`/nasmcd/sbin/t2slot\` | cut -d- -f1"' + +if [ "$1" = "autoconf" ]; then + echo "yes" + exit 0 +fi + +if [ -z "$username" ]; then + echo "No username!" + exit 1 +fi + +if [ -z "$cs_addr" ]; then + echo "No control station addresses!" + exit 1 +fi + +#Choosing Cotrol Station. Code have to be "10" +for CS in $cs_addr; do + if [ "`eval $SSH_CHECK`" -eq "10" ]; then +# echo "$CS is Primary" + PRIMARY_CS=$CS + break + fi +done + +if [ -z "$PRIMARY_CS" ]; then + echo "No alive primary Control Station from list \"$cs_addr\""; + exit 1; +fi + +SSH="ssh -q $username@$PRIMARY_CS . /home/operator1/.bash_profile; " + +echo "host_name ${TARGET}" + +if [ "$1" = "config" ] ; then + for server in $nas_servers; do + $SSH nas_server -i $server | grep -q 'type *= nas' + if [ "$?" != 0 ] ; then continue; fi + nas_server_ok=TRUE +#nfs.v3.op data + member_elements=`$SSH server_stats $server -info nfs.v3.op | grep member_elements | sed -ne 's/^.*= //p'` + IFS=',' read -ra graphs <<< $member_elements + echo "multigraph vnx_emc_calls_s +graph_title EMC VNX 5300 NFS V3 Calls per second +graph_vlabel Calls +graph_category nfs +graph_args --base 1000" + for graph in "${graphs[@]}"; do + field=`echo "$graph" | cut -d '.' -f4 ` + echo "${server}_$field.label $server $field" + done + + echo " +multigraph vnx_emc_usec_call +graph_title EMC VNX 5300 NFS V3 uSeconds per call +graph_vlabel uSec / call +graph_category nfs +graph_args --base 1000" + for graph in "${graphs[@]}"; do + field=`echo "$graph" | cut -d '.' -f4 ` + echo "${server}_$field.label $server $field" + done + echo " +multigraph vnx_emc_op_percent +graph_title EMC VNX 5300 NFS V3 Op % +graph_vlabel % +graph_category nfs" + for graph in "${graphs[@]}"; do + field=`echo "$graph" | cut -d '.' -f4 ` + echo "${server}_$field.label $server $field" + echo "${server}_$field.min 0" + done + + +#nfs.client data +# Total Read Write Suspicious Total Read Write Avg +# Ops/s Ops/s Ops/s Ops diff KiB/s KiB/s KiB/s uSec/call + member_elements=`$SSH server_stats server_2 -monitor nfs.client -count 1 -terminationsummary no -titles never | sed -ne 's/^.*id=//p' | cut -d' ' -f1` + readarray graphs2 <<< $member_elements + echo " +multigraph vnx_emc_nfs_client_ops_s +graph_title EMC VNX 5300 NFS Client Ops/s +graph_vlabel Ops/s +graph_category nfs" + echo -n "graph_order " + for graph in "${graphs2[@]}"; do + field=`echo "$graph" | sed -ne 's/\./_/pg' ` + echo -n "${server}_${field}_r ${server}_${field}_w ${server}_${field}_t ${server}_${field}_s " + done + echo " " + for graph in "${graphs2[@]}"; do + field=`echo "$graph" | sed -ne 's/\./_/pg' ` + echo "${server}_${field}_r.label $server $field Read Ops/s" + echo "${server}_${field}_w.label $server $field Write Ops/s" + echo "${server}_${field}_w.draw STACK" + echo "${server}_${field}_t.label $server $field Total Ops/s" + echo "${server}_${field}_s.label $server $field Suspicious Ops diff" + done + + echo " +multigraph vnx_emc_nfs_client_kib_s +graph_title EMC VNX 5300 NFS Client KiB/s +graph_vlabel KiB/s +graph_category nfs" + echo -n "graph_order " + for graph in "${graphs2[@]}"; do + field=`echo "$graph" | sed -ne 's/\./_/pg' ` + echo -n "${server}_${field}_r ${server}_${field}_w ${server}_${field}_t " + done + echo " " + for graph in "${graphs2[@]}"; do + field=`echo "$graph" | sed -ne 's/\./_/pg' ` + echo "${server}_${field}_r.label $server $field Read KiB/s" + echo "${server}_${field}_w.label $server $field Write KiB/s" + echo "${server}_${field}_w.draw STACK" + echo "${server}_${field}_t.label $server $field Total KiB/s" + done + + echo " +multigraph vnx_emc_nfs_client_avg_usec +graph_title EMC VNX 5300 NFS Client Avg uSec/call +graph_vlabel uSec/call +graph_category nfs" + for graph in "${graphs2[@]}"; do + field=`echo "$graph" | sed -ne 's/\./_/pg' ` + echo "${server}_${field}.label $server $field Avg uSec/call" + done + done + if [ -z $nas_server_ok ]; then + echo "No active data movers!" + exit 1 + fi +exit 0 +fi + +#nfs.v3.op data +for server in $nas_servers; do + $SSH nas_server -i $server | grep -q 'type *= nas' + if [ "$?" != 0 ] ; then continue; fi + nas_server_ok=TRUE + member_elements=`$SSH server_stats $server -monitor nfs.v3.op -count 1 -terminationsummary no -titles never | sed -ne 's/^.*v3/v3/p'` + NUMCOL=5 + LINES=`wc -l <<< $member_elements` + while IFS=$'\n' read -ra graphs ; do + element+=( $graphs ) + done <<< $member_elements + + echo "multigraph vnx_emc_calls_s" + for ((i=0; i<$((LINES)); i++ )); do + echo "${server}_${element[i*$NUMCOL]}".value "${element[i*$NUMCOL+1]}" + done + + echo " +multigraph vnx_emc_usec_call" + for ((i=0; i<$((LINES)); i++ )); do + echo "${server}_${element[i*$NUMCOL]}".value "${element[i*$NUMCOL+3]}" + done + + echo " +multigraph vnx_emc_op_percent" + for ((i=0; i<$((LINES)); i++ )); do + echo "${server}_${element[i*$NUMCOL]}".value "${element[i*$NUMCOL+4]}" + done + + element=() +#nfs.client data + echo " +multigraph vnx_emc_nfs_client_ops_s" + member_elements=`$SSH server_stats server_2 -monitor nfs.client -count 1 -terminationsummary no -titles never | sed -ne 's/^.*id=//p'` + NUMCOL=9 + LINES=`wc -l <<< $member_elements` + while IFS=$'\n' read -ra graphs; do + element+=($graphs) + done <<< $member_elements + for (( i=0; i<$((LINES)); i++ )); do + client=` echo ${element[i*$NUMCOL]} | sed -ne 's/\./_/pg'` + echo "${server}_${client}_r".value "${element[$i*$NUMCOL+2]}" + echo "${server}_${client}_w".value "${element[$i*$NUMCOL+3]}" + echo "${server}_${client}_t".value "${element[$i*$NUMCOL+1]}" + echo "${server}_${client}_s".value "${element[$i*$NUMCOL+4]}" + done + echo " +multigraph vnx_emc_nfs_client_kib_s" + for (( i=0; i<$((LINES)); i++ )); do + client=` echo ${element[i*$NUMCOL]} | sed -ne 's/\./_/pg'` + echo "${server}_${client}_r".value "${element[$i*$NUMCOL+6]}" + echo "${server}_${client}_w".value "${element[$i*$NUMCOL+7]}" + echo "${server}_${client}_t".value "${element[$i*$NUMCOL+5]}" + done + echo " +multigraph vnx_emc_nfs_client_avg_usec" + for (( i=0; i<$((LINES)); i++ )); do + client=` echo ${element[i*$NUMCOL]} | sed -ne 's/\./_/pg'` + echo "${server}_${client}".value "${element[$i*$NUMCOL+8]}" + done +done +if [ -z $nas_server_ok ]; then + echo "No active data movers!" + exit 1 +fi +exit 0 +