1 | <?php |
||
2 | /* |
||
3 | * This program is free software: you can redistribute it and/or modify it |
||
4 | * under the terms of the GNU General Public License as published by the |
||
5 | * Free Software Foundation, either version 3 of the License, or (at your |
||
6 | * option) any later version. Please see LICENSE.txt at the top level of |
||
7 | * the source code distribution for details. |
||
8 | * |
||
9 | * @package LibreNMS |
||
10 | * @subpackage nfs-server |
||
11 | * @link https://www.librenms.org |
||
12 | * @copyright 2017 LibreNMS |
||
13 | * @author SvennD <[email protected]> |
||
14 | */ |
||
15 | |||
16 | use LibreNMS\RRD\RrdDefinition; |
||
17 | |||
18 | $name = 'nfs-server'; |
||
19 | $oid = '.1.3.6.1.4.1.8072.1.3.2.3.1.2.10.110.102.115.45.115.101.114.118.101.114'; |
||
20 | |||
21 | echo ' ' . $name; |
||
22 | |||
23 | $nfsstats = snmp_get($device, $oid, '-Oqv'); |
||
24 | |||
25 | $app_id = $app['app_id']; |
||
26 | |||
27 | // rrd names |
||
28 | $rrd_name = []; |
||
29 | $rrd_name['default'] = ['app', 'nfs-server-default', $app_id]; |
||
30 | $rrd_name['proc2'] = ['app', 'nfs-server-proc2', $app_id]; |
||
31 | $rrd_name['proc3'] = ['app', 'nfs-server-proc3', $app_id]; |
||
32 | $rrd_name['proc4'] = ['app', 'nfs-server-proc4', $app_id]; |
||
33 | $rrd_name['proc4ops'] = ['app', 'nfs-server-proc4ops', $app_id]; |
||
34 | |||
35 | // rrd definitions |
||
36 | $rrd_def_array['default'] = RrdDefinition::make() |
||
37 | ->addDataset('rc_hits', 'COUNTER', 0, 125000000000) |
||
38 | ->addDataset('rc_misses', 'COUNTER', 0, 125000000000) |
||
39 | ->addDataset('rc_nocache', 'COUNTER', 0, 125000000000) |
||
40 | ->addDataset('fh_lookup', 'COUNTER', 0, 125000000000) |
||
41 | ->addDataset('fh_anon', 'COUNTER', 0, 125000000000) |
||
42 | ->addDataset('fh_ncachedir', 'COUNTER', 0, 125000000000) |
||
43 | ->addDataset('fh_ncachenondir', 'COUNTER', 0, 125000000000) |
||
44 | ->addDataset('fh_stale', 'COUNTER', 0, 125000000000) |
||
45 | ->addDataset('io_read', 'COUNTER', 0, 125000000000) |
||
46 | ->addDataset('io_write', 'COUNTER', 0, 125000000000) |
||
47 | ->addDataset('th_threads', 'COUNTER', 0, 125000000000) |
||
48 | ->addDataset('th_fullcnt', 'COUNTER', 0, 125000000000) |
||
49 | ->addDataset('th_range01', 'GAUGE', 0, 125000000000) |
||
50 | ->addDataset('th_range02', 'GAUGE', 0, 125000000000) |
||
51 | ->addDataset('th_range03', 'GAUGE', 0, 125000000000) |
||
52 | ->addDataset('th_range04', 'GAUGE', 0, 125000000000) |
||
53 | ->addDataset('th_range05', 'GAUGE', 0, 125000000000) |
||
54 | ->addDataset('th_range06', 'GAUGE', 0, 125000000000) |
||
55 | ->addDataset('th_range07', 'GAUGE', 0, 125000000000) |
||
56 | ->addDataset('th_range08', 'GAUGE', 0, 125000000000) |
||
57 | ->addDataset('th_range09', 'GAUGE', 0, 125000000000) |
||
58 | ->addDataset('th_range10', 'GAUGE', 0, 125000000000) |
||
59 | ->addDataset('ra_cachesize', 'GAUGE', 0, 125000000000) |
||
60 | ->addDataset('ra_range01', 'GAUGE', 0, 125000000000) |
||
61 | ->addDataset('ra_range02', 'GAUGE', 0, 125000000000) |
||
62 | ->addDataset('ra_range03', 'GAUGE', 0, 125000000000) |
||
63 | ->addDataset('ra_range04', 'GAUGE', 0, 125000000000) |
||
64 | ->addDataset('ra_range05', 'GAUGE', 0, 125000000000) |
||
65 | ->addDataset('ra_range06', 'GAUGE', 0, 125000000000) |
||
66 | ->addDataset('ra_range07', 'GAUGE', 0, 125000000000) |
||
67 | ->addDataset('ra_range08', 'GAUGE', 0, 125000000000) |
||
68 | ->addDataset('ra_range09', 'GAUGE', 0, 125000000000) |
||
69 | ->addDataset('ra_range10', 'GAUGE', 0, 125000000000) |
||
70 | ->addDataset('ra_notfound', 'GAUGE', 0, 125000000000) |
||
71 | ->addDataset('net_cnt', 'COUNTER', 0, 125000000000) |
||
72 | ->addDataset('net_udp', 'COUNTER', 0, 125000000000) |
||
73 | ->addDataset('net_tcp', 'COUNTER', 0, 125000000000) |
||
74 | ->addDataset('net_tcpconn', 'COUNTER', 0, 125000000000) |
||
75 | ->addDataset('rpc_calls', 'COUNTER', 0, 125000000000) |
||
76 | ->addDataset('rpc_badcount', 'COUNTER', 0, 125000000000) |
||
77 | ->addDataset('rpc_badfmt', 'COUNTER', 0, 125000000000) |
||
78 | ->addDataset('rpc_badauth', 'COUNTER', 0, 125000000000) |
||
79 | ->addDataset('rpc_badclnt', 'COUNTER', 0, 125000000000); |
||
80 | |||
81 | $rrd_def_array['proc2'] = RrdDefinition::make() |
||
82 | ->addDataset('proc2_null', 'COUNTER', 0, 125000000000) |
||
83 | ->addDataset('proc2_getattr', 'COUNTER', 0, 125000000000) |
||
84 | ->addDataset('proc2_setattr', 'COUNTER', 0, 125000000000) |
||
85 | ->addDataset('proc2_root', 'COUNTER', 0, 125000000000) |
||
86 | ->addDataset('proc2_lookup', 'COUNTER', 0, 125000000000) |
||
87 | ->addDataset('proc2_readlink', 'COUNTER', 0, 125000000000) |
||
88 | ->addDataset('proc2_read', 'COUNTER', 0, 125000000000) |
||
89 | ->addDataset('proc2_wrcache', 'COUNTER', 0, 125000000000) |
||
90 | ->addDataset('proc2_write', 'COUNTER', 0, 125000000000) |
||
91 | ->addDataset('proc2_create', 'COUNTER', 0, 125000000000) |
||
92 | ->addDataset('proc2_remove', 'COUNTER', 0, 125000000000) |
||
93 | ->addDataset('proc2_rename', 'COUNTER', 0, 125000000000) |
||
94 | ->addDataset('proc2_link', 'COUNTER', 0, 125000000000) |
||
95 | ->addDataset('proc2_symlink', 'COUNTER', 0, 125000000000) |
||
96 | ->addDataset('proc2_mkdir', 'COUNTER', 0, 125000000000) |
||
97 | ->addDataset('proc2_rmdir', 'COUNTER', 0, 125000000000) |
||
98 | ->addDataset('proc2_readdir', 'COUNTER', 0, 125000000000) |
||
99 | ->addDataset('proc2_fsstat', 'COUNTER', 0, 125000000000); |
||
100 | |||
101 | $rrd_def_array['proc3'] = RrdDefinition::make() |
||
102 | ->addDataset('proc3_null', 'COUNTER', 0, 125000000000) |
||
103 | ->addDataset('proc3_getattr', 'COUNTER', 0, 125000000000) |
||
104 | ->addDataset('proc3_setattr', 'COUNTER', 0, 125000000000) |
||
105 | ->addDataset('proc3_lookup', 'COUNTER', 0, 125000000000) |
||
106 | ->addDataset('proc3_access', 'COUNTER', 0, 125000000000) |
||
107 | ->addDataset('proc3_readlink', 'COUNTER', 0, 125000000000) |
||
108 | ->addDataset('proc3_read', 'COUNTER', 0, 125000000000) |
||
109 | ->addDataset('proc3_write', 'COUNTER', 0, 125000000000) |
||
110 | ->addDataset('proc3_create', 'COUNTER', 0, 125000000000) |
||
111 | ->addDataset('proc3_mkdir', 'COUNTER', 0, 125000000000) |
||
112 | ->addDataset('proc3_symlink', 'COUNTER', 0, 125000000000) |
||
113 | ->addDataset('proc3_mknod', 'COUNTER', 0, 125000000000) |
||
114 | ->addDataset('proc3_remove', 'COUNTER', 0, 125000000000) |
||
115 | ->addDataset('proc3_rmdir', 'COUNTER', 0, 125000000000) |
||
116 | ->addDataset('proc3_rename', 'COUNTER', 0, 125000000000) |
||
117 | ->addDataset('proc3_link', 'COUNTER', 0, 125000000000) |
||
118 | ->addDataset('proc3_readdir', 'COUNTER', 0, 125000000000) |
||
119 | ->addDataset('proc3_readdirplus', 'COUNTER', 0, 125000000000) |
||
120 | ->addDataset('proc3_fsstat', 'COUNTER', 0, 125000000000) |
||
121 | ->addDataset('proc3_fsinfo', 'COUNTER', 0, 125000000000) |
||
122 | ->addDataset('proc3_pathconf', 'COUNTER', 0, 125000000000) |
||
123 | ->addDataset('proc3_commit', 'COUNTER', 0, 125000000000); |
||
124 | |||
125 | $rrd_def_array['proc4'] = RrdDefinition::make() |
||
126 | ->addDataset('proc4_null', 'COUNTER', 0, 125000000000) |
||
127 | ->addDataset('proc4_compound', 'COUNTER', 0, 125000000000); |
||
128 | |||
129 | $rrd_def_array['proc4ops'] = RrdDefinition::make() |
||
130 | ->addDataset('v4_op0-unused', 'COUNTER', 0, 125000000000) |
||
131 | ->addDataset('v4_op1-unused', 'COUNTER', 0, 125000000000) |
||
132 | ->addDataset('v4_op2-future', 'COUNTER', 0, 125000000000) |
||
133 | ->addDataset('v4_access', 'COUNTER', 0, 125000000000) |
||
134 | ->addDataset('v4_close', 'COUNTER', 0, 125000000000) |
||
135 | ->addDataset('v4_commit', 'COUNTER', 0, 125000000000) |
||
136 | ->addDataset('v4_create', 'COUNTER', 0, 125000000000) |
||
137 | ->addDataset('v4_delegpurge', 'COUNTER', 0, 125000000000) |
||
138 | ->addDataset('v4_delegreturn', 'COUNTER', 0, 125000000000) |
||
139 | ->addDataset('v4_getattr', 'COUNTER', 0, 125000000000) |
||
140 | ->addDataset('v4_getfh', 'COUNTER', 0, 125000000000) |
||
141 | ->addDataset('v4_link', 'COUNTER', 0, 125000000000) |
||
142 | ->addDataset('v4_lock', 'COUNTER', 0, 125000000000) |
||
143 | ->addDataset('v4_lockt', 'COUNTER', 0, 125000000000) |
||
144 | ->addDataset('v4_locku', 'COUNTER', 0, 125000000000) |
||
145 | ->addDataset('v4_lookup', 'COUNTER', 0, 125000000000) |
||
146 | ->addDataset('v4_lookup_root', 'COUNTER', 0, 125000000000) |
||
147 | ->addDataset('v4_nverify', 'COUNTER', 0, 125000000000) |
||
148 | ->addDataset('v4_open', 'COUNTER', 0, 125000000000) |
||
149 | ->addDataset('v4_openattr', 'COUNTER', 0, 125000000000) |
||
150 | ->addDataset('v4_open_conf', 'COUNTER', 0, 125000000000) |
||
151 | ->addDataset('v4_open_dgrd', 'COUNTER', 0, 125000000000) |
||
152 | ->addDataset('v4_putfh', 'COUNTER', 0, 125000000000) |
||
153 | ->addDataset('v4_putpubfh', 'COUNTER', 0, 125000000000) |
||
154 | ->addDataset('v4_putrootfh', 'COUNTER', 0, 125000000000) |
||
155 | ->addDataset('v4_read', 'COUNTER', 0, 125000000000) |
||
156 | ->addDataset('v4_readdir', 'COUNTER', 0, 125000000000) |
||
157 | ->addDataset('v4_readlink', 'COUNTER', 0, 125000000000) |
||
158 | ->addDataset('v4_remove', 'COUNTER', 0, 125000000000) |
||
159 | ->addDataset('v4_rename', 'COUNTER', 0, 125000000000) |
||
160 | ->addDataset('v4_renew', 'COUNTER', 0, 125000000000) |
||
161 | ->addDataset('v4_restorefh', 'COUNTER', 0, 125000000000) |
||
162 | ->addDataset('v4_savefh', 'COUNTER', 0, 125000000000) |
||
163 | ->addDataset('v4_secinfo', 'COUNTER', 0, 125000000000) |
||
164 | ->addDataset('v4_setattr', 'COUNTER', 0, 125000000000) |
||
165 | ->addDataset('v4_setcltid', 'COUNTER', 0, 125000000000) |
||
166 | ->addDataset('v4_setcltidconf', 'COUNTER', 0, 125000000000) |
||
167 | ->addDataset('v4_verify', 'COUNTER', 0, 125000000000) |
||
168 | ->addDataset('v4_write', 'COUNTER', 0, 125000000000) |
||
169 | ->addDataset('v4_rellockowner', 'COUNTER', 0, 125000000000) |
||
170 | ->addDataset('v4_bc_ctl', 'COUNTER', 0, 125000000000) |
||
171 | ->addDataset('v4_bind_conn', 'COUNTER', 0, 125000000000) |
||
172 | ->addDataset('v4_exchange_id', 'COUNTER', 0, 125000000000) |
||
173 | ->addDataset('v4_create_ses', 'COUNTER', 0, 125000000000) |
||
174 | ->addDataset('v4_destroy_ses', 'COUNTER', 0, 125000000000) |
||
175 | ->addDataset('v4_free_stateid', 'COUNTER', 0, 125000000000) |
||
176 | ->addDataset('v4_getdirdeleg', 'COUNTER', 0, 125000000000) |
||
177 | ->addDataset('v4_getdevinfo', 'COUNTER', 0, 125000000000) |
||
178 | ->addDataset('v4_getdevlist', 'COUNTER', 0, 125000000000) |
||
179 | ->addDataset('v4_layoutcommit', 'COUNTER', 0, 125000000000) |
||
180 | ->addDataset('v4_layoutget', 'COUNTER', 0, 125000000000) |
||
181 | ->addDataset('v4_layoutreturn', 'COUNTER', 0, 125000000000) |
||
182 | ->addDataset('v4_secinfononam', 'COUNTER', 0, 125000000000) |
||
183 | ->addDataset('v4_sequence', 'COUNTER', 0, 125000000000) |
||
184 | ->addDataset('v4_set_ssv', 'COUNTER', 0, 125000000000) |
||
185 | ->addDataset('v4_test_stateid', 'COUNTER', 0, 125000000000) |
||
186 | ->addDataset('v4_want_deleg', 'COUNTER', 0, 125000000000) |
||
187 | ->addDataset('v4_destroy_clid', 'COUNTER', 0, 125000000000) |
||
188 | ->addDataset('v4_reclaim_comp', 'COUNTER', 0, 125000000000); |
||
189 | |||
190 | /* examples output : |
||
191 | rc 0 87795065 629022724 |
||
192 | fh 0 0 0 0 0 |
||
193 | io 35586909 1515531914 |
||
194 | th 16 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 |
||
195 | ra 32 229333249 0 0 0 0 0 0 0 0 0 4106423 |
||
196 | net 717504610 0 717216613 15750 |
||
197 | rpc 717521317 0 0 0 0 |
||
198 | proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||
199 | proc3 22 84 185701663 9587314 62436191 114380547 61635 233519348 60991846 8887178 203052 68539 0 5816369 163267 1946736 127750 35510 8641639 1060644 112 56 13833978 |
||
200 | proc4 2 1 404 |
||
201 | proc4ops 59 0 0 0 2 0 0 0 0 0 402 3 0 0 0 0 3 0 0 0 0 0 0 403 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
||
202 | */ |
||
203 | |||
204 | $keys_nfs_server = [ |
||
205 | 'rc' => ['rc_hits', 'rc_misses', 'rc_nocache'], |
||
206 | 'fh' => ['fh_lookup', 'fh_anon', 'fh_ncachedir', 'fh_ncachenondir', 'fh_stale'], |
||
207 | 'io' => ['io_read', 'io_write'], |
||
208 | 'th' => ['th_threads', 'th_fullcnt', 'th_range01', 'th_range02', 'th_range03', 'th_range04', 'th_range05', 'th_range06', 'th_range07', 'th_range08', 'th_range09', 'th_range10'], |
||
209 | 'ra' => ['ra_cachesize', 'ra_range01', 'ra_range02', 'ra_range03', 'ra_range04', 'ra_range05', 'ra_range06', 'ra_range07', 'ra_range08', 'ra_range09', 'ra_range10', 'ra_notfound'], |
||
210 | 'net' => ['net_cnt', 'net_udp', 'net_tcp', 'net_tcpconn'], |
||
211 | 'rpc' => ['rpc_calls', 'rpc_badcount', 'rpc_badfmt', 'rpc_badauth', 'rpc_badclnt'], |
||
212 | 'proc2' => ['proc2_null', 'proc2_getattr', 'proc2_setattr', 'proc2_root', 'proc2_lookup', 'proc2_readlink', 'proc2_read', 'proc2_wrcache', 'proc2_write', 'proc2_create', 'proc2_remove', 'proc2_rename', 'proc2_link', 'proc2_symlink', 'proc2_mkdir', 'proc2_rmdir', 'proc2_readdir', 'proc2_fsstat'], |
||
213 | 'proc3' => ['proc3_null', 'proc3_getattr', 'proc3_setattr', 'proc3_lookup', 'proc3_access', 'proc3_readlink', 'proc3_read', 'proc3_write', 'proc3_create', 'proc3_mkdir', 'proc3_symlink', 'proc3_mknod', 'proc3_remove', 'proc3_rmdir', 'proc3_rename', 'proc3_link', 'proc3_readdir', 'proc3_readdirplus', 'proc3_fsstat', 'proc3_fsinfo', 'proc3_pathconf', 'proc3_commit'], |
||
214 | 'proc4' => ['proc4_null', 'proc4_compound'], |
||
215 | 'proc4ops' => [ |
||
216 | 'v4_op0-unused', 'v4_op1-unused', 'v4_op2-future', 'v4_access', 'v4_close', |
||
217 | 'v4_commit', 'v4_create', 'v4_delegpurge', 'v4_delegreturn', 'v4_getattr', 'v4_getfh', |
||
218 | 'v4_link', 'v4_lock', 'v4_lockt', 'v4_locku', 'v4_lookup', 'v4_lookup_root', 'v4_nverify', |
||
219 | 'v4_open', 'v4_openattr', 'v4_open_conf', 'v4_open_dgrd', 'v4_putfh', 'v4_putpubfh', 'v4_putrootfh', |
||
220 | 'v4_read', 'v4_readdir', 'v4_readlink', 'v4_remove', 'v4_rename', 'v4_renew', 'v4_restorefh', 'v4_savefh', |
||
221 | 'v4_secinfo', 'v4_setattr', 'v4_setcltid', 'v4_setcltidconf', 'v4_verify', 'v4_write', 'v4_rellockowner', |
||
222 | 'v4_bc_ctl', 'v4_bind_conn', 'v4_exchange_id', 'v4_create_ses', 'v4_destroy_ses', 'v4_free_stateid', |
||
223 | 'v4_getdirdeleg', 'v4_getdevinfo', 'v4_getdevlist', 'v4_layoutcommit', 'v4_layoutget', 'v4_layoutreturn', |
||
224 | 'v4_secinfononam', 'v4_sequence', 'v4_set_ssv', 'v4_test_stateid', 'v4_want_deleg', 'v4_destroy_clid', |
||
225 | 'v4_reclaim_comp', ], |
||
226 | ]; |
||
227 | |||
228 | // parse each output line, by the id |
||
229 | // then 'map' the values to the arrays from $keys_nfs_server |
||
230 | $lines = explode("\n", $nfsstats); |
||
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||
231 | $default_fields = []; |
||
232 | $metrics = []; |
||
233 | |||
234 | foreach ($lines as $line) { |
||
235 | $line_values = explode(' ', $line); |
||
236 | $line_id = array_shift($line_values); |
||
237 | |||
238 | switch ($line_id) { |
||
239 | case 'rc': |
||
240 | case 'fh': |
||
241 | case 'io': |
||
242 | case 'th': |
||
243 | case 'ra': |
||
244 | case 'net': |
||
245 | case 'rpc': |
||
246 | // combine keys + values, and then merge it in $fields array |
||
247 | $default_fields = array_merge($default_fields, array_combine($keys_nfs_server[$line_id], $line_values)); |
||
248 | break; |
||
249 | case 'proc2': |
||
250 | case 'proc3': |
||
251 | case 'proc4': |
||
252 | case 'proc4ops': |
||
253 | // note : proc2 is dropped for kernels 3.10.0+ (centos 7+) |
||
254 | // note : proc4ops has changed a few times, and getting the keys is difficult |
||
255 | // I only use the version which reports 59 value's (centos 6) |
||
256 | |||
257 | // the first value of the proc* is the amount of fields that will follow; |
||
258 | // we check this, and if its incorrect, do not polute the chart with wrong values |
||
259 | $value_count = array_shift($line_values); |
||
260 | |||
261 | if ($value_count == count($keys_nfs_server[$line_id])) { |
||
262 | $fields = array_combine($keys_nfs_server[$line_id], $line_values); |
||
263 | |||
264 | // create or push data to rrd |
||
265 | $tags = ['name' => $name, 'app_id' => $app['app_id'], 'rrd_name' => $rrd_name[$line_id], 'rrd_def' => $rrd_def_array[$line_id]]; |
||
266 | $metrics[$line_id] = $fields; |
||
267 | data_update($device, 'app', $tags, $fields); |
||
268 | } |
||
269 | break; |
||
270 | } |
||
271 | } |
||
272 | $metrics['none'] = $default_fields; |
||
273 | |||
274 | // push the default nfs server data to rrd |
||
275 | $tags = ['name' => $name, 'app_id' => $app['app_id'], 'rrd_name' => $rrd_name['default'], 'rrd_def' => $rrd_def_array['default']]; |
||
276 | data_update($device, 'app', $tags, $default_fields); |
||
277 | update_application($app, $nfsstats, $metrics); |
||
278 | |||
279 | // clean up scope |
||
280 | unset($nfsstats, $rrd_name, $rrd_def_array, $default_fields, $fields, $tags); |
||
281 |