From 55c05c78660dc4cfc45aa13cd8f7d416815b9180 Mon Sep 17 00:00:00 2001 From: Eldon Koyle Date: Tue, 24 Nov 2015 16:14:07 -0700 Subject: [PATCH] Allow users to keep more statistics in the db * Add $config['enable_extended_port_metrics'] to enable feature * Add a new table to store stuff in * Update data from the poller --- includes/defaults.inc.php | 1 + includes/polling/ports.inc.php | 59 ++++++++++++++++++++++++++++++---- sql-schema/079.sql | 42 ++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 sql-schema/079.sql diff --git a/includes/defaults.inc.php b/includes/defaults.inc.php index 0e936861b7..1c0664ad8d 100644 --- a/includes/defaults.inc.php +++ b/includes/defaults.inc.php @@ -77,6 +77,7 @@ $config['memcached']['host'] = 'localhost'; $config['memcached']['port'] = 11211; $config['memcached']['ttl'] = 240; +$config['enable_extended_port_metrics'] = false; $config['slow_statistics'] = true; // THIS WILL CHANGE TO FALSE IN FUTURE // RRD Format Settings diff --git a/includes/polling/ports.inc.php b/includes/polling/ports.inc.php index 01a8e09aa1..9b51606adc 100644 --- a/includes/polling/ports.inc.php +++ b/includes/polling/ports.inc.php @@ -51,6 +51,21 @@ $stat_oids_db = array( 'ifInUcastPkts', 'ifOutUcastPkts', ); + +$stat_oids_db_extended = array( + 'ifInErrors', + 'ifOutErrors', + 'ifInNUcastPkts', + 'ifOutNUcastPkts', + 'ifInDiscards', + 'ifOutDiscards', + 'ifInUnknownProtos', + 'ifInBroadcastPkts', + 'ifOutBroadcastPkts', + 'ifInMulticastPkts', + 'ifOutMulticastPkts', +); + // From above for DB $etherlike_oids = array( 'dot3StatsAlignmentErrors', @@ -203,7 +218,14 @@ d_echo($port_stats); // FIXME -- this stuff is a little messy, looping the array to make an array just seems wrong. :> // -- i can make it a function, so that you don't know what it's doing. // -- $ports = adamasMagicFunction($ports_db); ? -$ports_db = dbFetchRows('SELECT * FROM `ports` WHERE `device_id` = ?', array($device['device_id'])); +if ($config['enable_extended_port_metrics']) { + // select * doesn't do what we want if multiple tables have the same column name -- last one wins :/ + $ports_db = dbFetchRows('SELECT *, `ports_statistics`.`port_id` AS `ports_statistics_port_id`, `ports`.`port_id` AS `port_id` FROM `ports` LEFT OUTER JOIN `ports_statistics` ON `ports`.`port_id` = `ports_statistics`.`port_id` WHERE `ports`.`device_id` = ?', array($device['device_id'])); +} +else { + $ports_db = dbFetchRows('SELECT * FROM `ports` WHERE `device_id` = ?', array($device['device_id'])); +} + foreach ($ports_db as $port) { $ports[$port['ifIndex']] = $port; } @@ -214,6 +236,9 @@ foreach ($port_stats as $ifIndex => $port) { echo 'valid'; if (!is_array($ports[$port['ifIndex']])) { $port_id = dbInsert(array('device_id' => $device['device_id'], 'ifIndex' => $ifIndex), 'ports'); + if ($config['enable_extended_port_metrics']) { + dbInsert(array('port_id' => $ports[$ifIndex]['port_id']), 'ports_statistics'); + } $ports[$port['ifIndex']] = dbFetchRow('SELECT * FROM `ports` WHERE `port_id` = ?', array($port_id)); echo 'Adding: '.$port['ifName'].'('.$ifIndex.')('.$ports[$port['ifIndex']]['port_id'].')'; // print_r($ports); @@ -222,6 +247,11 @@ foreach ($port_stats as $ifIndex => $port) { dbUpdate(array('deleted' => '0'), 'ports', '`port_id` = ?', array($ports[$ifIndex]['port_id'])); $ports[$ifIndex]['deleted'] = '0'; } + if ($config['enable_extended_port_metrics'] && + $ports[$ifIndex]['ports_statistics_port_id'] === null) { + // in case someone enabled the option after the port was already created + dbInsert(array('port_id' => $ports[$ifIndex]['port_id']), 'ports_statistics'); + } } else { if ($ports[$port['ifIndex']]['deleted'] != '1') { @@ -247,6 +277,7 @@ foreach ($ports as $port) { $polled_period = ($polled - $port['poll_time']); $port['update'] = array(); + $port['update_extended'] = array(); $port['state'] = array(); if ($config['slow_statistics'] == true) { @@ -401,10 +432,22 @@ foreach ($ports as $port) { // End parse ifAlias // Update IF-MIB metrics - foreach ($stat_oids_db as $oid) { + $_stat_oids = $stat_oids_db; + if ($config['enable_extended_port_metrics']) { + $_stat_oids = $_stat_oids + $stat_oids_db_extended; + } + foreach ($_stat_oids as $oid) { + $port_update = 'update'; + if ($config['enable_extended_port_metrics']) { + $extended_metric = !in_array($oid, $stat_oids_db, true); + if ($extended_metric) { + $port_update = 'update_extended'; + } + } + if ($config['slow_statistics'] == true) { - $port['update'][$oid] = $this_port[$oid]; - $port['update'][$oid.'_prev'] = $port[$oid]; + $port[$port_update][$oid] = $this_port[$oid]; + $port[$port_update][$oid.'_prev'] = $port[$oid]; } $oid_prev = $oid.'_prev'; @@ -420,8 +463,8 @@ foreach ($ports as $port) { $port['stats'][$oid.'_diff'] = $oid_diff; if ($config['slow_statistics'] == true) { - $port['update'][$oid.'_rate'] = $oid_rate; - $port['update'][$oid.'_delta'] = $oid_diff; + $port[$port_update][$oid.'_rate'] = $oid_rate; + $port[$port_update][$oid.'_delta'] = $oid_diff; } d_echo("\n $oid ($oid_diff B) $oid_rate Bps $polled_period secs\n"); @@ -546,6 +589,10 @@ foreach ($ports as $port) { // Update Database if (count($port['update'])) { $updated = dbUpdate($port['update'], 'ports', '`port_id` = ?', array($port['port_id'])); + if ($config['enable_extended_port_metrics'] and count($port['update_extended'])) { + // do we want to do something else with this? + $updated += dbUpdate($port['update_extended'], 'ports_statistics', '`port_id` = ?', array($port['port_id'])); + } d_echo("$updated updated"); } diff --git a/sql-schema/079.sql b/sql-schema/079.sql new file mode 100644 index 0000000000..a6a7e48f24 --- /dev/null +++ b/sql-schema/079.sql @@ -0,0 +1,42 @@ +create table ports_statistics ( + port_id int(11) NOT NULL, + ifInNUcastPkts bigint(20) DEFAULT NULL, + ifInNUcastPkts_prev bigint(20) DEFAULT NULL, + ifInNUcastPkts_delta bigint(20) DEFAULT NULL, + ifInNUcastPkts_rate int(11) DEFAULT NULL, + ifOutNUcastPkts bigint(20) DEFAULT NULL, + ifOutNUcastPkts_prev bigint(20) DEFAULT NULL, + ifOutNUcastPkts_delta bigint(20) DEFAULT NULL, + ifOutNUcastPkts_rate int(11) DEFAULT NULL, + ifInDiscards bigint(20) DEFAULT NULL, + ifInDiscards_prev bigint(20) DEFAULT NULL, + ifInDiscards_delta bigint(20) DEFAULT NULL, + ifInDiscards_rate int(11) DEFAULT NULL, + ifOutDiscards bigint(20) DEFAULT NULL, + ifOutDiscards_prev bigint(20) DEFAULT NULL, + ifOutDiscards_delta bigint(20) DEFAULT NULL, + ifOutDiscards_rate int(11) DEFAULT NULL, + ifInUnknownProtos bigint(20) DEFAULT NULL, + ifInUnknownProtos_prev bigint(20) DEFAULT NULL, + ifInUnknownProtos_delta bigint(20) DEFAULT NULL, + ifInUnknownProtos_rate int(11) DEFAULT NULL, + ifInBroadcastPkts bigint(20) DEFAULT NULL, + ifInBroadcastPkts_prev bigint(20) DEFAULT NULL, + ifInBroadcastPkts_delta bigint(20) DEFAULT NULL, + ifInBroadcastPkts_rate int(11) DEFAULT NULL, + ifOutBroadcastPkts bigint(20) DEFAULT NULL, + ifOutBroadcastPkts_prev bigint(20) DEFAULT NULL, + ifOutBroadcastPkts_delta bigint(20) DEFAULT NULL, + ifOutBroadcastPkts_rate int(11) DEFAULT NULL, + ifInMulticastPkts bigint(20) DEFAULT NULL, + ifInMulticastPkts_prev bigint(20) DEFAULT NULL, + ifInMulticastPkts_delta bigint(20) DEFAULT NULL, + ifInMulticastPkts_rate int(11) DEFAULT NULL, + ifOutMulticastPkts bigint(20) DEFAULT NULL, + ifOutMulticastPkts_prev bigint(20) DEFAULT NULL, + ifOutMulticastPkts_delta bigint(20) DEFAULT NULL, + ifOutMulticastPkts_rate int(11) DEFAULT NULL, + PRIMARY KEY(port_id), + FOREIGN KEY(port_id) REFERENCES ports(port_id) +); +