diff --git a/doc/Extensions/Applications.md b/doc/Extensions/Applications.md index dfa119a9c8db..f71bcb943766 100644 --- a/doc/Extensions/Applications.md +++ b/doc/Extensions/Applications.md @@ -18,6 +18,7 @@ Different applications support a variety of ways collect data: by direct connect 1. [Munin](#munin) - Agent 1. [MySQL](#mysql) - SNMP extend, Agent 1. [NGINX](#nginx) - Agent +1. [NFS-server](#nfs-server) - SNMP extend 1. [NTP Client](#ntp-client) - SNMP extend 1. [NTP Server](#ntp-server) - SNMP extend 1. [Nvidia GPU](#nvidia-gpu) - SNMP extend @@ -36,7 +37,6 @@ Different applications support a variety of ways collect data: by direct connect 1. [UPS-nut](#ups-nut) - SNMP extend 1. [UPS-apcups](#ups-apcups) - SNMP extend - ### Apache Either use SNMP extend or use the agent. ##### SNMP Extend @@ -333,6 +333,17 @@ extend nginx /etc/snmp/nginx-stats ##### Agent [Install the agent](Agent-Setup.md) on this device if it isn't already and copy the `nginx` script to `/usr/lib/check_mk_agent/local/` +##### NFS-server +Export the NFS stats from as server. + +##### SNMP Extend +1. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add : +``` +extend nfs-server /bin/cat /proc/net/rpc/nfsd +``` +note : find out where cat is located using : `which cat` + +2. reload snmpd service to activate the configuration ### NTP Client A shell script that gets stats from ntp client. diff --git a/html/includes/functions.inc.php b/html/includes/functions.inc.php index 4cf133d48b52..0a30592a06ad 100644 --- a/html/includes/functions.inc.php +++ b/html/includes/functions.inc.php @@ -72,6 +72,9 @@ function nicecase($item) case 'nfs-v3-stats': return 'NFS v3 Stats'; + + case 'nfs-server': + return 'NFS Server'; case 'ntp': return 'NTP'; diff --git a/html/includes/graphs/application/nfs-server_fh.inc.php b/html/includes/graphs/application/nfs-server_fh.inc.php new file mode 100644 index 000000000000..5c256fafc106 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_fh.inc.php @@ -0,0 +1,52 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'File Handle Stats'; +$unitlen = 15; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +$array = array( + 'fh_lookup' => array('descr' => 'fh_lookup'), + 'fh_anon' => array('descr' => 'fh_anon'), + 'fh_ncachedir' => array('descr' => 'fh_ncachedir'), + 'fh_ncachenondir' => array('descr' => 'fh_ncachenondir'), + 'fh_stale' => array('descr' => 'fh_stale'), // only var that should show something +); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $config['graph_colours'][$colours][$i]; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_io.inc.php b/html/includes/graphs/application/nfs-server_io.inc.php new file mode 100644 index 000000000000..4e59a9723317 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_io.inc.php @@ -0,0 +1,64 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'Operations'; +$unitlen = 10; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +$array = array( + 'io_read' => array('descr' => 'read','colour' => '2B9220',), + 'io_write' => array('descr' => 'write','colour' => 'B0262D',), +); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $var['colour']; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; + + +/* +This would create a graph with reads above and write belows; +I can't find out how to adapt the legend. If you wish to swap graphs, +uncomment all the above untill +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'net stats packets'; +$unitlen = 15; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +$array = array( + 'net_udp' => array('descr' => 'udp','colour' => 'AA3F39',), + 'net_tcp' => array('descr' => 'tcp','colour' => '2C8437',), +); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $var['colour']; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_net_tcp_conns.inc.php b/html/includes/graphs/application/nfs-server_net_tcp_conns.inc.php new file mode 100644 index 000000000000..5a7d9ed34019 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_net_tcp_conns.inc.php @@ -0,0 +1,28 @@ + +*/ + +require 'includes/graphs/common.inc.php'; + +$scale_min = 0; +$ds = 'net_tcpconn'; +$colour_area = '9DDA52'; +$colour_line = '2EAC6D'; +$colour_area_max = 'FFEE99'; +$graph_max = 10000; +$unit_text = 'net tcp connections'; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +require 'includes/graphs/generic_simplex.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_ra.inc.php b/html/includes/graphs/application/nfs-server_ra.inc.php new file mode 100644 index 000000000000..53b979782222 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_ra.inc.php @@ -0,0 +1,58 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'cache depth'; +$unitlen = 15; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +$array = array( + 'ra_range01' => array('descr' => '0%-10%'), + 'ra_range02' => array('descr' => '10%-20%'), + 'ra_range03' => array('descr' => '20%-30%'), + 'ra_range04' => array('descr' => '30%-40%'), + 'ra_range05' => array('descr' => '40%-50%'), + 'ra_range06' => array('descr' => '50%-60%'), + 'ra_range07' => array('descr' => '60%-70%'), + 'ra_range08' => array('descr' => '70%-80%'), + 'ra_range09' => array('descr' => '80%-90%'), + 'ra_range10' => array('descr' => '90%-100%'), + 'ra_notfound' => array('descr' => 'not found'), +); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $config['graph_colours'][$colours][$i]; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_rc.inc.php b/html/includes/graphs/application/nfs-server_rc.inc.php new file mode 100644 index 000000000000..3e2510744182 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_rc.inc.php @@ -0,0 +1,49 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$unit_text = 'Reply cache'; +$unitlen = 15; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +$array = array( + 'rc_hits' => array('descr' => 'hits','colour' => 'B0262D'), // this is bad : retransmitting (red) + 'rc_misses' => array('descr' => 'misses','colour' => 'B36326'), // requires caching + 'rc_nocache' => array('descr' => 'nocache','colour' => '2B9220'), // no caching needed +); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $var['colour']; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_rpc.inc.php b/html/includes/graphs/application/nfs-server_rpc.inc.php new file mode 100644 index 000000000000..2aba5fbe1ba6 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_rpc.inc.php @@ -0,0 +1,52 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'RPC Stats'; +$unitlen = 15; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-default', $app['app_id'])); + +$array = array( + 'rpc_calls' => array('descr' => 'calls','colour' => '2C8437',), // green : good + //'rpc_badcalls' => array('descr' => 'bad calls','colour' => '600604',), # this is a sum of nbadfmt, badauth and badclnt + 'rpc_badfmt' => array('descr' => 'bad fmt','colour' => 'E6A4A5',), // pink + 'rpc_badauth' => array('descr' => 'bad auth','colour' => 'B2C8D9',), // blue + 'rpc_badclnt' => array('descr' => 'bad clnt','colour' => 'BEA37A',), // brown +); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $var['colour']; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_stats.inc.php b/html/includes/graphs/application/nfs-server_stats.inc.php new file mode 100644 index 000000000000..6e3a6d9efdbd --- /dev/null +++ b/html/includes/graphs/application/nfs-server_stats.inc.php @@ -0,0 +1,69 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'NFS v3 Operations'; +$unitlen = 10; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-proc3', $app['app_id'])); + +$array = array( + 'proc3_null' => array('descr' => 'Null'), + 'proc3_getattr' => array('descr' => 'Get attributes'), + 'proc3_setattr' => array('descr' => 'Set attributes'), + 'proc3_lookup' => array('descr' => 'Lookup'), + 'proc3_access' => array('descr' => 'Access'), + 'proc3_read' => array('descr' => 'Read'), + 'proc3_write' => array('descr' => 'Write'), + 'proc3_create' => array('descr' => 'Create'), + 'proc3_mkdir' => array('descr' => 'Make dir'), + 'proc3_mknod' => array('descr' => 'Make nod'), + 'proc3_link' => array('descr' => 'Link'), + 'proc3_remove' => array('descr' => 'Remove'), + 'proc3_rmdir' => array('descr' => 'Remove dir'), + 'proc3_rename' => array('descr' => 'Rename'), + 'proc3_readlink' => array('descr' => 'Read link'), + 'proc3_readdir' => array('descr' => 'Read dir'), + 'proc3_symlink' => array('descr' => 'Symlink'), + 'proc3_readdirplus' => array('descr' => 'Read dir plus'), + 'proc3_fsstat' => array('descr' => 'FS stat'), + 'proc3_fsinfo' => array('descr' => 'FS info'), + 'proc3_pathconf' => array('descr' => 'Pathconf'), + 'proc3_commit' => array('descr' => 'Commit'), + ); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $config['graph_colours'][$colours][$i]; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_stats_v2.inc.php b/html/includes/graphs/application/nfs-server_stats_v2.inc.php new file mode 100644 index 000000000000..dbf4d45a97ca --- /dev/null +++ b/html/includes/graphs/application/nfs-server_stats_v2.inc.php @@ -0,0 +1,65 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'NFS v2 Operations'; +$unitlen = 10; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-proc2', $app['app_id'])); + +$array = array( + 'proc2_null' => array('descr' => 'Null'), + 'proc2_getattr' => array('descr' => 'Get attributes'), + 'proc2_setattr' => array('descr' => 'Set attributes'), + 'proc2_root' => array('descr' => 'Root'), + 'proc2_lookup' => array('descr' => 'Lookup'), + 'proc2_readlink' => array('descr' => 'ReadLink'), + 'proc2_read' => array('descr' => 'Read'), + 'proc2_wrcache' => array('descr' => 'Wrcache'), + 'proc2_write' => array('descr' => 'Write'), + 'proc2_create' => array('descr' => 'Create'), + 'proc2_remove' => array('descr' => 'Remove'), + 'proc2_rename' => array('descr' => 'Rename'), + 'proc2_link' => array('descr' => 'Link'), + 'proc2_symlink' => array('descr' => 'Symlink'), + 'proc2_mkdir' => array('descr' => 'Mkdir'), + 'proc2_rmdir' => array('descr' => 'Rmdir'), + 'proc2_readdir' => array('descr' => 'Readdir'), + 'proc2_fsstat' => array('descr' => 'fsstat') + ); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $config['graph_colours']['default'][$i]; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_stats_v4.inc.php b/html/includes/graphs/application/nfs-server_stats_v4.inc.php new file mode 100644 index 000000000000..1daa03d8288e --- /dev/null +++ b/html/includes/graphs/application/nfs-server_stats_v4.inc.php @@ -0,0 +1,49 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'NFS v4 Stats'; +$unitlen = 10; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-proc4', $app['app_id'])); + +$array = array( + 'proc4_null' => array('descr' => 'Null','colour' => '630606'), // these should be very low + 'proc4_compound' => array('descr' => 'Compound','colour' => '50C150') // basically this are 1 or more ops + ); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $var['colour']; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/includes/graphs/application/nfs-server_v4ops.inc.php b/html/includes/graphs/application/nfs-server_v4ops.inc.php new file mode 100644 index 000000000000..658fffc55247 --- /dev/null +++ b/html/includes/graphs/application/nfs-server_v4ops.inc.php @@ -0,0 +1,106 @@ + +*/ + +require 'includes/graphs/common.inc.php'; +$scale_min = 0; +$colours = 'mixed'; +$unit_text = 'NFS v4 Operations'; +$unitlen = 10; +$bigdescrlen = 15; +$smalldescrlen = 15; +$dostack = 0; +$printtotal = 0; +$addarea = 1; +$transparency = 33; + +$rrd_filename = rrd_name($device['hostname'], array('app', 'nfs-server-proc4ops', $app['app_id'])); + +$array = array( + // 'v4_op0-unused' => array('descr' => 'v4_op0-unused'), + // 'v4_op1-unused' => array('descr' => 'v4_op1-unused'), + // 'v4_op2-future' => array('descr' => 'v4_op2-future'), + 'v4_access' => array('descr' => 'v4_access'), + 'v4_close' => array('descr' => 'v4_close'), + 'v4_commit' => array('descr' => 'v4_commit'), + 'v4_create' => array('descr' => 'v4_create'), + 'v4_delegpurge' => array('descr' => 'v4_delegpurge'), + 'v4_delegreturn' => array('descr' => 'v4_delegreturn'), + 'v4_getattr' => array('descr' => 'v4_getattr'), + 'v4_getfh' => array('descr' => 'v4_getfh'), + 'v4_link' => array('descr' => 'v4_link'), + 'v4_lock' => array('descr' => 'v4_lock'), + 'v4_lockt' => array('descr' => 'v4_lockt'), + 'v4_locku' => array('descr' => 'v4_locku'), + 'v4_lookup' => array('descr' => 'v4_lookup'), + 'v4_lookup_root' => array('descr' => 'v4_lookup_root'), + 'v4_nverify' => array('descr' => 'v4_nverify'), + 'v4_open' => array('descr' => 'v4_open'), + 'v4_openattr' => array('descr' => 'v4_openattr'), + 'v4_open_conf' => array('descr' => 'v4_open_conf'), + 'v4_open_dgrd' => array('descr' => 'v4_open_dgrd'), + 'v4_putfh' => array('descr' => 'v4_putfh'), + 'v4_putpubfh' => array('descr' => 'v4_putpubfh'), + 'v4_putrootfh' => array('descr' => 'v4_putrootfh'), + 'v4_read' => array('descr' => 'v4_read'), + 'v4_readdir' => array('descr' => 'v4_readdir'), + 'v4_readlink' => array('descr' => 'v4_readlink'), + 'v4_remove' => array('descr' => 'v4_remove'), + 'v4_rename' => array('descr' => 'v4_rename'), + 'v4_renew' => array('descr' => 'v4_renew'), + 'v4_restorefh' => array('descr' => 'v4_restorefh'), + 'v4_savefh' => array('descr' => 'v4_savefh'), + 'v4_secinfo' => array('descr' => 'v4_secinfo'), + 'v4_setattr' => array('descr' => 'v4_setattr'), + 'v4_setcltid' => array('descr' => 'v4_setcltid'), + 'v4_setcltidconf' => array('descr' => 'v4_setcltidconf'), + 'v4_verify' => array('descr' => 'v4_verify'), + 'v4_write' => array('descr' => 'v4_write'), + 'v4_rellockowner' => array('descr' => 'v4_rellockowner'), + 'v4_bc_ctl' => array('descr' => 'v4_bc_ctl'), + 'v4_bind_conn' => array('descr' => 'v4_bind_conn'), + 'v4_exchange_id' => array('descr' => 'v4_exchange_id'), + 'v4_create_ses' => array('descr' => 'v4_create_ses'), + 'v4_destroy_ses' => array('descr' => 'v4_destroy_ses'), + 'v4_free_stateid' => array('descr' => 'v4_free_stateid'), + 'v4_getdirdeleg' => array('descr' => 'v4_getdirdeleg'), + 'v4_getdevinfo' => array('descr' => 'v4_getdevinfo'), + 'v4_getdevlist' => array('descr' => 'v4_getdevlist'), + 'v4_layoutcommit' => array('descr' => 'v4_layoutcommit'), + 'v4_layoutget' => array('descr' => 'v4_layoutget'), + 'v4_layoutreturn' => array('descr' => 'v4_layoutreturn'), + 'v4_secinfononam' => array('descr' => 'v4_secinfononam'), + 'v4_sequence' => array('descr' => 'v4_sequence'), + 'v4_set_ssv' => array('descr' => 'v4_set_ssv'), + 'v4_test_stateid' => array('descr' => 'v4_test_stateid'), + 'v4_want_deleg' => array('descr' => 'v4_want_deleg'), + 'v4_destroy_clid' => array('descr' => 'v4_destroy_clid'), + 'v4_reclaim_comp' => array('descr' => 'v4_reclaim_comp'), + ); + +$i = 0; + +if (rrdtool_check_rrd_exists($rrd_filename)) { + foreach ($array as $ds => $var) { + $rrd_list[$i]['filename'] = $rrd_filename; + $rrd_list[$i]['descr'] = $var['descr']; + $rrd_list[$i]['ds'] = $ds; + $rrd_list[$i]['colour'] = $config['graph_colours']['manycolours'][$i]; + $i++; + } +} else { + echo "file missing: $rrd_filename"; +} + +require 'includes/graphs/generic_v3_multiline.inc.php'; diff --git a/html/pages/apps.inc.php b/html/pages/apps.inc.php index b08754cde904..ba2a0a0250aa 100644 --- a/html/pages/apps.inc.php +++ b/html/pages/apps.inc.php @@ -109,6 +109,20 @@ 'rpc', ); +$graphs['nfs-server'] = array( + 'stats_v2', + 'stats', + 'stats_v4', + 'v4ops', + 'io', + 'fh', + 'rc', + 'ra', + 'net', + 'net_tcp_conns', + 'rpc', +); + $graphs['os-updates'] = array( 'packages', ); diff --git a/html/pages/device/apps/nfs-server.inc.php b/html/pages/device/apps/nfs-server.inc.php new file mode 100644 index 000000000000..bfc1a1dc1ebc --- /dev/null +++ b/html/pages/device/apps/nfs-server.inc.php @@ -0,0 +1,106 @@ + +*/ +global $config; + +print_optionbar_start(); + +echo "".nicecase($app['app_type']).' » '; + +$app_sections = array( + 'default' => 'NFS', + 'proc2' => 'NFS v2', + 'proc3' => 'NFS v3', + 'proc4' => 'NFS v4', +); + +unset($sep); + +foreach ($app_sections as $app_section => $app_section_text) { + // remove entries that have no rrd associated + // commonly proc2 will be invisible + $var_rrd = rrd_name($device['hostname'], 'app-nfs-server-'. $app_section . '-'. $app['app_id']); + if (!rrdtool_check_rrd_exists($var_rrd)) { + continue; + } + + echo $sep; + + if (!$vars['app_section']) { + $vars['app_section'] = $app_section; + } + + if ($vars['app_section'] == $app_section) { + echo ""; + } + + echo generate_link($app_section_text, $vars, array('app_section' => $app_section)); + if ($vars['app_section'] == $app_section) { + echo ''; + } + + $sep = ' | '; +} + +print_optionbar_end(); + +unset($graphs); + +// stat => array(text, rrd) +$graphs['default'] = array( + 'nfs-server_net' => array('Network stats', 'default'), + 'nfs-server_rpc' => array('RPC Stats', 'default'), + 'nfs-server_io' => array('IO', 'default'), + 'nfs-server_fh' => array('File handler', 'default') , + 'nfs-server_rc' => array('Reply cache', 'default'), + 'nfs-server_ra' => array('Read ahead cache', 'default') +); + +$graphs['proc2'] = array( + 'nfs-server_stats_v2' => array('NFS v2 Statistics', 'proc2') +); + +$graphs['proc3'] = array( + 'nfs-server_stats' => array('NFS v3 Statistics', 'proc3') +); + +$graphs['proc4'] = array( + 'nfs-server_stats_v4' => array('NFS v4 Statistics', 'proc4'), + 'nfs-server_v4ops' => array('NFS v4ops Statistics', 'proc4ops') +); + +foreach ($graphs[$vars['app_section']] as $key => $info) { + // check if they exist + if (!rrdtool_check_rrd_exists(rrd_name($device['hostname'], 'app-nfs-server-'. $info[1] . '-'. $app['app_id']))) { + continue; + } + + $graph_type = $key; + $graph_array['height'] = '100'; + $graph_array['width'] = '215'; + $graph_array['to'] = $config['time']['now']; + $graph_array['id'] = $app['app_id']; + $graph_array['type'] = 'application_'.$key; + + echo '
+
+

' . $info[0] . '

+
+
+
'; + include 'includes/print-graphrow.inc.php'; + echo '
'; + echo '
'; + echo '
'; +} diff --git a/includes/polling/applications/nfs-server.inc.php b/includes/polling/applications/nfs-server.inc.php new file mode 100644 index 000000000000..a92f545e036f --- /dev/null +++ b/includes/polling/applications/nfs-server.inc.php @@ -0,0 +1,281 @@ + +*/ + +use LibreNMS\RRD\RrdDefinition; + +$name = 'nfs-server'; +$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'; + +echo ' ' . $name; + +$nfsstats = snmp_get($device, $oid, '-Oqv'); + +update_application($app, $nfsstats); + +$app_id = $app['app_id']; + +// rrd names +$rrd_name = array(); +$rrd_name['default'] = array('app', 'nfs-server-default', $app_id); +$rrd_name['proc2'] = array('app', 'nfs-server-proc2', $app_id); +$rrd_name['proc3'] = array('app', 'nfs-server-proc3', $app_id); +$rrd_name['proc4'] = array('app', 'nfs-server-proc4', $app_id); +$rrd_name['proc4ops'] = array('app', 'nfs-server-proc4ops', $app_id); + + +// rrd definitions +$rrd_def_array['default'] = RrdDefinition::make() + ->addDataset('rc_hits', 'COUNTER', 0, 125000000000) + ->addDataset('rc_misses', 'COUNTER', 0, 125000000000) + ->addDataset('rc_nocache', 'COUNTER', 0, 125000000000) + ->addDataset('fh_lookup', 'COUNTER', 0, 125000000000) + ->addDataset('fh_anon', 'COUNTER', 0, 125000000000) + ->addDataset('fh_ncachedir', 'COUNTER', 0, 125000000000) + ->addDataset('fh_ncachenondir', 'COUNTER', 0, 125000000000) + ->addDataset('fh_stale', 'COUNTER', 0, 125000000000) + ->addDataset('io_read', 'COUNTER', 0, 125000000000) + ->addDataset('io_write', 'COUNTER', 0, 125000000000) + ->addDataset('th_threads', 'COUNTER', 0, 125000000000) + ->addDataset('th_fullcnt', 'COUNTER', 0, 125000000000) + ->addDataset('th_range01', 'GAUGE', 0, 125000000000) + ->addDataset('th_range02', 'GAUGE', 0, 125000000000) + ->addDataset('th_range03', 'GAUGE', 0, 125000000000) + ->addDataset('th_range04', 'GAUGE', 0, 125000000000) + ->addDataset('th_range05', 'GAUGE', 0, 125000000000) + ->addDataset('th_range06', 'GAUGE', 0, 125000000000) + ->addDataset('th_range07', 'GAUGE', 0, 125000000000) + ->addDataset('th_range08', 'GAUGE', 0, 125000000000) + ->addDataset('th_range09', 'GAUGE', 0, 125000000000) + ->addDataset('th_range10', 'GAUGE', 0, 125000000000) + ->addDataset('ra_cachesize', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range01', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range02', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range03', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range04', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range05', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range06', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range07', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range08', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range09', 'GAUGE', 0, 125000000000) + ->addDataset('ra_range10', 'GAUGE', 0, 125000000000) + ->addDataset('ra_notfound', 'GAUGE', 0, 125000000000) + ->addDataset('net_cnt', 'COUNTER', 0, 125000000000) + ->addDataset('net_udp', 'COUNTER', 0, 125000000000) + ->addDataset('net_tcp', 'COUNTER', 0, 125000000000) + ->addDataset('net_tcpconn', 'COUNTER', 0, 125000000000) + ->addDataset('rpc_calls', 'COUNTER', 0, 125000000000) + ->addDataset('rpc_badcount', 'COUNTER', 0, 125000000000) + ->addDataset('rpc_badfmt', 'COUNTER', 0, 125000000000) + ->addDataset('rpc_badauth', 'COUNTER', 0, 125000000000) + ->addDataset('rpc_badclnt', 'COUNTER', 0, 125000000000); + +$rrd_def_array['proc2'] = RrdDefinition::make() + ->addDataset('proc2_null', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_getattr', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_setattr', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_root', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_lookup', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_readlink', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_read', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_wrcache', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_write', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_create', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_remove', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_rename', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_link', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_symlink', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_mkdir', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_rmdir', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_readdir', 'COUNTER', 0, 125000000000) + ->addDataset('proc2_fsstat', 'COUNTER', 0, 125000000000); + +$rrd_def_array['proc3'] = RrdDefinition::make() + ->addDataset('proc3_null', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_getattr', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_setattr', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_lookup', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_access', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_readlink', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_read', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_write', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_create', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_mkdir', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_symlink', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_mknod', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_remove', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_rmdir', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_rename', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_link', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_readdir', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_readdirplus', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_fsstat', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_fsinfo', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_pathconf', 'COUNTER', 0, 125000000000) + ->addDataset('proc3_commit', 'COUNTER', 0, 125000000000); + +$rrd_def_array['proc4'] = RrdDefinition::make() + ->addDataset('proc4_null', 'COUNTER', 0, 125000000000) + ->addDataset('proc4_compound', 'COUNTER', 0, 125000000000); + +$rrd_def_array['proc4ops'] = RrdDefinition::make() + ->addDataset('v4_op0-unused', 'COUNTER', 0, 125000000000) + ->addDataset('v4_op1-unused', 'COUNTER', 0, 125000000000) + ->addDataset('v4_op2-future', 'COUNTER', 0, 125000000000) + ->addDataset('v4_access', 'COUNTER', 0, 125000000000) + ->addDataset('v4_close', 'COUNTER', 0, 125000000000) + ->addDataset('v4_commit', 'COUNTER', 0, 125000000000) + ->addDataset('v4_create', 'COUNTER', 0, 125000000000) + ->addDataset('v4_delegpurge', 'COUNTER', 0, 125000000000) + ->addDataset('v4_delegreturn', 'COUNTER', 0, 125000000000) + ->addDataset('v4_getattr', 'COUNTER', 0, 125000000000) + ->addDataset('v4_getfh', 'COUNTER', 0, 125000000000) + ->addDataset('v4_link', 'COUNTER', 0, 125000000000) + ->addDataset('v4_lock', 'COUNTER', 0, 125000000000) + ->addDataset('v4_lockt', 'COUNTER', 0, 125000000000) + ->addDataset('v4_locku', 'COUNTER', 0, 125000000000) + ->addDataset('v4_lookup', 'COUNTER', 0, 125000000000) + ->addDataset('v4_lookup_root', 'COUNTER', 0, 125000000000) + ->addDataset('v4_nverify', 'COUNTER', 0, 125000000000) + ->addDataset('v4_open', 'COUNTER', 0, 125000000000) + ->addDataset('v4_openattr', 'COUNTER', 0, 125000000000) + ->addDataset('v4_open_conf', 'COUNTER', 0, 125000000000) + ->addDataset('v4_open_dgrd', 'COUNTER', 0, 125000000000) + ->addDataset('v4_putfh', 'COUNTER', 0, 125000000000) + ->addDataset('v4_putpubfh', 'COUNTER', 0, 125000000000) + ->addDataset('v4_putrootfh', 'COUNTER', 0, 125000000000) + ->addDataset('v4_read', 'COUNTER', 0, 125000000000) + ->addDataset('v4_readdir', 'COUNTER', 0, 125000000000) + ->addDataset('v4_readlink', 'COUNTER', 0, 125000000000) + ->addDataset('v4_remove', 'COUNTER', 0, 125000000000) + ->addDataset('v4_rename', 'COUNTER', 0, 125000000000) + ->addDataset('v4_renew', 'COUNTER', 0, 125000000000) + ->addDataset('v4_restorefh', 'COUNTER', 0, 125000000000) + ->addDataset('v4_savefh', 'COUNTER', 0, 125000000000) + ->addDataset('v4_secinfo', 'COUNTER', 0, 125000000000) + ->addDataset('v4_setattr', 'COUNTER', 0, 125000000000) + ->addDataset('v4_setcltid', 'COUNTER', 0, 125000000000) + ->addDataset('v4_setcltidconf', 'COUNTER', 0, 125000000000) + ->addDataset('v4_verify', 'COUNTER', 0, 125000000000) + ->addDataset('v4_write', 'COUNTER', 0, 125000000000) + ->addDataset('v4_rellockowner', 'COUNTER', 0, 125000000000) + ->addDataset('v4_bc_ctl', 'COUNTER', 0, 125000000000) + ->addDataset('v4_bind_conn', 'COUNTER', 0, 125000000000) + ->addDataset('v4_exchange_id', 'COUNTER', 0, 125000000000) + ->addDataset('v4_create_ses', 'COUNTER', 0, 125000000000) + ->addDataset('v4_destroy_ses', 'COUNTER', 0, 125000000000) + ->addDataset('v4_free_stateid', 'COUNTER', 0, 125000000000) + ->addDataset('v4_getdirdeleg', 'COUNTER', 0, 125000000000) + ->addDataset('v4_getdevinfo', 'COUNTER', 0, 125000000000) + ->addDataset('v4_getdevlist', 'COUNTER', 0, 125000000000) + ->addDataset('v4_layoutcommit', 'COUNTER', 0, 125000000000) + ->addDataset('v4_layoutget', 'COUNTER', 0, 125000000000) + ->addDataset('v4_layoutreturn', 'COUNTER', 0, 125000000000) + ->addDataset('v4_secinfononam', 'COUNTER', 0, 125000000000) + ->addDataset('v4_sequence', 'COUNTER', 0, 125000000000) + ->addDataset('v4_set_ssv', 'COUNTER', 0, 125000000000) + ->addDataset('v4_test_stateid', 'COUNTER', 0, 125000000000) + ->addDataset('v4_want_deleg', 'COUNTER', 0, 125000000000) + ->addDataset('v4_destroy_clid', 'COUNTER', 0, 125000000000) + ->addDataset('v4_reclaim_comp', 'COUNTER', 0, 125000000000); + +/* examples output : +rc 0 87795065 629022724 +fh 0 0 0 0 0 +io 35586909 1515531914 +th 16 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 32 229333249 0 0 0 0 0 0 0 0 0 4106423 +net 717504610 0 717216613 15750 +rpc 717521317 0 0 0 0 +proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +proc3 22 84 185701663 9587314 62436191 114380547 61635 233519348 60991846 8887178 203052 68539 0 5816369 163267 1946736 127750 35510 8641639 1060644 112 56 13833978 +proc4 2 1 404 +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 +*/ + +$keys_nfs_server = array( + 'rc' => array('th_hits', 'th_misses', 'th_nocache'), + 'fh' => array('fh_lookup', 'fh_anon', 'fh_ncachedir', 'fh_ncachenondir', 'fh_stale'), + 'io' => array('io_read', 'io_write'), + 'th' => array('th_threads', 'th_fullcnt', 'th_range01', 'th_range02', 'th_range03', 'th_range04', 'th_range05', 'th_range06', 'th_range07', 'th_range08', 'th_range09', 'th_range10'), + 'ra' => array('ra_cachesize', 'ra_range01', 'ra_range02', 'ra_range03', 'ra_range04', 'ra_range05', 'ra_range06', 'ra_range07', 'ra_range08', 'ra_range09', 'ra_range10', 'ra_notfound'), + 'net' => array('net_cnt', 'net_udp', 'net_tcp', 'net_tcpconn'), + 'rpc' => array('rpc_calls', 'rpc_badcount', 'rpc_badfmt', 'rpc_badauth', 'rpc_badclnt'), + 'proc2' => array('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'), + 'proc3' => array('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'), + 'proc4' => array('proc4_null', 'proc4_compound'), + 'proc4ops' => array( + 'v4_op0-unused','v4_op1-unused','v4_op2-future','v4_access','v4_close', + 'v4_commit','v4_create','v4_delegpurge','v4_delegreturn','v4_getattr','v4_getfh', + 'v4_link','v4_lock','v4_lockt','v4_locku','v4_lookup','v4_lookup_root','v4_nverify', + 'v4_open','v4_openattr','v4_open_conf','v4_open_dgrd','v4_putfh','v4_putpubfh','v4_putrootfh', + 'v4_read','v4_readdir','v4_readlink','v4_remove','v4_rename','v4_renew','v4_restorefh','v4_savefh', + 'v4_secinfo','v4_setattr','v4_setcltid','v4_setcltidconf','v4_verify','v4_write','v4_rellockowner', + 'v4_bc_ctl','v4_bind_conn','v4_exchange_id','v4_create_ses','v4_destroy_ses','v4_free_stateid', + 'v4_getdirdeleg','v4_getdevinfo','v4_getdevlist','v4_layoutcommit','v4_layoutget','v4_layoutreturn', + 'v4_secinfononam','v4_sequence','v4_set_ssv','v4_test_stateid','v4_want_deleg','v4_destroy_clid', + 'v4_reclaim_comp') + ); + + +// parse each output line, by the id +// then 'map' the values to the arrays from $keys_nfs_server +$lines = explode("\n", $nfsstats); +$default_fields = array(); + +foreach ($lines as $line) { + $line_values = explode(" ", $line); + $line_id = array_shift($line_values); + + switch ($line_id) { + case 'rc': + case 'fh': + case 'io': + case 'th': + case 'ra': + case 'net': + case 'rpc': + // combine keys + values, and then merge it in $fields array + $default_fields = array_merge($default_fields, array_combine($keys_nfs_server[$line_id], $line_values)); + break; + case 'proc2': + case 'proc3': + case 'proc4': + case 'proc4ops': + // note : proc2 is dropped for kernels 3.10.0+ (centos 7+) + // note : proc4ops has changed a few times, and getting the keys is difficult + // I only use the version which reports 59 value's (centos 6) + + // the first value of the proc* is the amount of fields that will follow; + // we check this, and if its incorrect, do not polute the chart with wrong values + $value_count = array_shift($line_values); + + if ($value_count == count($keys_nfs_server[$line_id])) { + $fields = array_combine($keys_nfs_server[$line_id], $line_values); + + // create or push data to rrd + $tags = array('name' => $name, 'app_id' => $app['app_id'], 'rrd_name' => $rrd_name[$line_id], 'rrd_def' => $rrd_def_array[$line_id]); + + data_update($device, 'app', $tags, $fields); + } + break; + } +} + +// push the default nfs server data to rrd +$tags = array('name' => $name, 'app_id' => $app['app_id'], 'rrd_name' => $rrd_name['default'], 'rrd_def' => $rrd_def_array['default']); +data_update($device, 'app', $tags, $default_fields); + +// clean up scope +unset($nfsstats, $rrd_name, $rrd_def_array, $default_fields, $fields, $tags);