Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / emc / emc_vnx_nfsv3_stats @ 6506690a

Historique | Voir | Annoter | Télécharger (9,87 ko)

1
#!/bin/bash
2
######################################################################################################################
3
#                 Plugin to monitor NFS statistics of EMC VNX 5300 Unified Storage system                            #
4
######################################################################################################################
5

    
6
# Author: Evgeny Beysembaev <megabotva@gmail.com>
7

    
8
#####################################
9
#         Description               #
10
#####################################
11

    
12
# The plugin monitors NFS v3 statistics of EMC Unified Storage system. Probably it can also be compatible with 
13
# other Isilon or Celerra systems. It uses SSH to connect to Control Stations, then remotely executes 
14
# /nas/sbin/server_stats and fetches and parses data from it. It supports gathering data both from active/active 
15
# and active/passive Datamover configurations, ignoring offline or standby Datamovers. If all Datamovers are 
16
# offline or absent, the plugin returns error.
17
# This plugin also automatically chooses Primary Control Station from the list by calling /nasmcd/sbin/getreason and 
18
# /nasmcd/sbin/t2slot.
19
# 
20
# At the moment data is gathered from the following statistics sources:
21
# nfs.v3.op - Tons of timings about NFS RPC calls
22
# nfs.client - Here new Client addresses are rescanned and added automatically.
23
# 
24
# It's quite easy to comment out unneeded data to make graphs less overloaded or to add new statistics sources.
25
 
26
#####################################
27
#        Configuration              #
28
#####################################
29

    
30
# The plugin uses SSH to connect to Control Stations. It's possible to use 'nasadmin' user, but it would be better
31
# if you create read-only global user by Unisphere Client. The user should have only Operator role.
32
# I created "operator" user but due to the fact that Control Stations already had one internal "operator" user,
33
# the new one was called "operator1". So be careful.
34
# 
35
# On munin-node side choose a user which will be used to connect through SSH. Generally user "munin" is ok. Then,
36
# execute "sudo su munin -s /bin/bash", "ssh-keygen" and "ssh-copy-id" to both Control Stations with newly created 
37
# user.
38
# 
39
# Make a link from /usr/share/munin/plugins/emc_vnx_nfsv3_stats to /etc/munin/plugins/emc_vnx_nfsv3_stats_<NAME>,
40
# where <NAME> is any arbitrary name of your storage system. The plugin will return <NAME> in its answer 
41
# as "host_name" field.
42
# Assume your storage system is called "VNX5300".
43
# 
44
# Make a configuration file at /etc/munin/plugin-conf.d/emc_vnx_nfsv3_stats_VNX5300
45
# 
46
# [emc_vnx_nfsv3_stats_vnx5300]
47
# user munin							# SSH Client local user
48
# env.username operator1					# Remote user with Operator role
49
# env.cs_addr 192.168.1.1 192.168.1.2				# Control Stations addresses
50
# env.nas_servers server_2 server_3				# This is the default value and can be omitted
51

    
52
#####################################
53
#           History                 #
54
#####################################
55

    
56
# 08.11.2016 - First Release
57

    
58
######################################################################################################################
59

    
60
export LANG=C
61

    
62
TARGET=$(echo "${0##*/}" | cut -d _ -f 5)
63
: ${nas_servers:="server_2 server_3"}
64
SSH_CHECK='ssh -q $username@$CS "/nasmcd/sbin/getreason | grep -w slot_\`/nasmcd/sbin/t2slot\` | cut -d- -f1"'
65

    
66
if [ "$1" = "autoconf" ]; then
67
	echo "yes"
68
	exit 0
69
fi
70

    
71
if [ -z "$username" ]; then
72
	echo "No username!"
73
	exit 1
74
fi
75

    
76
if [ -z "$cs_addr" ]; then
77
	echo "No control station addresses!"
78
	exit 1
79
fi
80

    
81
#Choosing Cotrol Station. Code have to be "10"
82
for CS in $cs_addr; do
83
	if [ "`eval $SSH_CHECK`" -eq "10" ]; then
84
#		echo "$CS is Primary"
85
		PRIMARY_CS=$CS
86
		break
87
	fi
88
done
89

    
90
if [ -z "$PRIMARY_CS" ]; then
91
	echo "No alive primary Control Station from list \"$cs_addr\"";
92
	exit 1;
93
fi
94

    
95
SSH="ssh -q $username@$PRIMARY_CS . /home/operator1/.bash_profile; "
96

    
97
echo "host_name ${TARGET}"
98

    
99
if [ "$1" = "config" ] ; then
100
	for server in $nas_servers; do
101
		$SSH nas_server -i $server | grep -q 'type *= nas'
102
		if [ "$?" != 0 ]  ; then continue; fi
103
		nas_server_ok=TRUE
104
#nfs.v3.op data
105
		member_elements=`$SSH server_stats $server -info nfs.v3.op | grep member_elements | sed -ne 's/^.*= //p'`
106
		IFS=',' read -ra graphs <<< $member_elements
107
		echo "multigraph vnx_emc_calls_s
108
graph_title EMC VNX 5300 NFS V3 Calls per second
109
graph_vlabel Calls
110
graph_category nfs
111
graph_args --base 1000"
112
		for graph in "${graphs[@]}"; do
113
        	        field=`echo "$graph" | cut -d '.' -f4 `
114
			echo "${server}_$field.label $server $field"
115
        	done
116

    
117
		echo "
118
multigraph vnx_emc_usec_call
119
graph_title EMC VNX 5300 NFS V3 uSeconds per call
120
graph_vlabel uSec / call
121
graph_category nfs
122
graph_args --base 1000"
123
		for graph in "${graphs[@]}"; do
124
                	field=`echo "$graph" | cut -d '.' -f4 `
125
			echo "${server}_$field.label $server $field"
126
        	done
127
		echo "
128
multigraph vnx_emc_op_percent
129
graph_title EMC VNX 5300 NFS V3 Op %
130
graph_vlabel %
131
graph_category nfs"
132
		for graph in "${graphs[@]}"; do
133
                	field=`echo "$graph" | cut -d '.' -f4 `
134
			echo "${server}_$field.label $server $field"
135
			echo "${server}_$field.min 0"
136
        	done
137

    
138

    
139
#nfs.client data
140
#							 Total    Read     Write   Suspicious   Total    Read     Write      Avg   
141
#                                                      Ops/s    Ops/s    Ops/s    Ops diff    KiB/s    KiB/s    KiB/s   uSec/call
142
		member_elements=`$SSH server_stats server_2 -monitor nfs.client -count 1 -terminationsummary no -titles never | sed -ne 's/^.*id=//p' | cut -d' ' -f1`
143
		readarray graphs2 <<< $member_elements
144
		echo "
145
multigraph vnx_emc_nfs_client_ops_s
146
graph_title EMC VNX 5300 NFS Client Ops/s
147
graph_vlabel Ops/s
148
graph_category nfs"
149
		echo -n "graph_order "
150
		for graph in "${graphs2[@]}"; do
151
                        field=`echo "$graph" | sed -ne 's/\./_/pg' `
152
			echo -n "${server}_${field}_r ${server}_${field}_w ${server}_${field}_t ${server}_${field}_s "
153
		done
154
		echo " "
155
		for graph in "${graphs2[@]}"; do
156
                        field=`echo "$graph" | sed -ne 's/\./_/pg' `
157
                        echo "${server}_${field}_r.label $server $field Read Ops/s"
158
                        echo "${server}_${field}_w.label $server $field Write Ops/s"
159
                        echo "${server}_${field}_w.draw STACK"
160
                        echo "${server}_${field}_t.label $server $field Total Ops/s"
161
			echo "${server}_${field}_s.label $server $field Suspicious Ops diff"
162
                done
163

    
164
		echo "
165
multigraph vnx_emc_nfs_client_kib_s
166
graph_title EMC VNX 5300 NFS Client KiB/s
167
graph_vlabel KiB/s
168
graph_category nfs"
169
		echo -n "graph_order "
170
		for graph in "${graphs2[@]}"; do
171
                        field=`echo "$graph" | sed -ne 's/\./_/pg' `
172
			echo -n "${server}_${field}_r ${server}_${field}_w ${server}_${field}_t "
173
		done
174
		echo " "
175
		for graph in "${graphs2[@]}"; do
176
                        field=`echo "$graph" | sed -ne 's/\./_/pg' `
177
                        echo "${server}_${field}_r.label $server $field Read KiB/s"
178
                        echo "${server}_${field}_w.label $server $field Write KiB/s"
179
                        echo "${server}_${field}_w.draw STACK"
180
                        echo "${server}_${field}_t.label $server $field Total KiB/s"
181
                done
182

    
183
		echo "
184
multigraph vnx_emc_nfs_client_avg_usec
185
graph_title EMC VNX 5300 NFS Client Avg uSec/call
186
graph_vlabel uSec/call
187
graph_category nfs"
188
		for graph in "${graphs2[@]}"; do
189
                        field=`echo "$graph" | sed -ne 's/\./_/pg' `
190
                        echo "${server}_${field}.label $server $field Avg uSec/call"
191
                done
192
	done
193
	if [ -z $nas_server_ok ]; then
194
		echo "No active data movers!"
195
		exit 1
196
	fi
197
exit 0
198
fi
199

    
200
#nfs.v3.op data
201
for server in $nas_servers; do
202
	$SSH nas_server -i $server | grep -q 'type *= nas'
203
	if [ "$?" != 0 ]  ; then continue; fi
204
	nas_server_ok=TRUE
205
	member_elements=`$SSH server_stats $server -monitor nfs.v3.op -count 1 -terminationsummary no -titles never | sed -ne 's/^.*v3/v3/p'`
206
	NUMCOL=5
207
	LINES=`wc -l <<< $member_elements`
208
	while IFS=$'\n' read -ra graphs ; do
209
		element+=( $graphs )
210
	done <<< $member_elements
211

    
212
	echo "multigraph vnx_emc_calls_s"
213
	for ((i=0; i<$((LINES)); i++ )); do
214
		echo "${server}_${element[i*$NUMCOL]}".value "${element[i*$NUMCOL+1]}"
215
	done
216

    
217
	echo "
218
multigraph vnx_emc_usec_call"
219
	for ((i=0; i<$((LINES)); i++ )); do
220
		echo "${server}_${element[i*$NUMCOL]}".value "${element[i*$NUMCOL+3]}"
221
	done
222

    
223
	echo "
224
multigraph vnx_emc_op_percent"
225
	for ((i=0; i<$((LINES)); i++ )); do
226
		echo "${server}_${element[i*$NUMCOL]}".value "${element[i*$NUMCOL+4]}"
227
	done
228

    
229
	element=()
230
#nfs.client data
231
	echo "
232
multigraph vnx_emc_nfs_client_ops_s"
233
        member_elements=`$SSH server_stats server_2 -monitor nfs.client -count 1 -terminationsummary no -titles never | sed -ne 's/^.*id=//p'`
234
	NUMCOL=9
235
        LINES=`wc -l <<< $member_elements`
236
	while IFS=$'\n' read -ra graphs; do
237
		element+=($graphs)
238
	done  <<< $member_elements
239
	for (( i=0; i<$((LINES)); i++ )); do
240
		client=` echo ${element[i*$NUMCOL]} | sed -ne 's/\./_/pg'`
241
               echo "${server}_${client}_r".value "${element[$i*$NUMCOL+2]}"
242
               echo "${server}_${client}_w".value "${element[$i*$NUMCOL+3]}"
243
               echo "${server}_${client}_t".value "${element[$i*$NUMCOL+1]}"
244
               echo "${server}_${client}_s".value "${element[$i*$NUMCOL+4]}"
245
        done
246
	echo "
247
multigraph vnx_emc_nfs_client_kib_s"
248
	for (( i=0; i<$((LINES)); i++ )); do
249
		client=` echo ${element[i*$NUMCOL]} | sed -ne 's/\./_/pg'`
250
               echo "${server}_${client}_r".value "${element[$i*$NUMCOL+6]}"
251
               echo "${server}_${client}_w".value "${element[$i*$NUMCOL+7]}"
252
               echo "${server}_${client}_t".value "${element[$i*$NUMCOL+5]}"
253
        done
254
	echo "
255
multigraph vnx_emc_nfs_client_avg_usec"
256
	for (( i=0; i<$((LINES)); i++ )); do
257
		client=` echo ${element[i*$NUMCOL]} | sed -ne 's/\./_/pg'`
258
		echo "${server}_${client}".value "${element[$i*$NUMCOL+8]}"
259
	done
260
done
261
if [ -z $nas_server_ok ]; then
262
	echo "No active data movers!"
263
	exit 1
264
fi
265
exit 0
266