Issues (2963)

includes/polling/applications/nfs-server.inc.php (1 issue)

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
It seems like $nfsstats can also be of type false; however, parameter $string of explode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

230
$lines = explode("\n", /** @scrutinizer ignore-type */ $nfsstats);
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