From 73149f3f19aff0e5bd3e0ca44ae08f59004d4e27 Mon Sep 17 00:00:00 2001 From: Rosiak Date: Sat, 27 Feb 2016 15:29:11 +0100 Subject: [PATCH] More updates Add sensor_prev to be able to alert on state change Add docs --- doc/Developing/Sensor-State-Support.md | 97 ++++++++++++++++++++++++++ includes/polling/functions.inc.php | 6 +- sql-schema/105.sql | 1 + 3 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 doc/Developing/Sensor-State-Support.md diff --git a/doc/Developing/Sensor-State-Support.md b/doc/Developing/Sensor-State-Support.md new file mode 100644 index 0000000000..3bdd8a2175 --- /dev/null +++ b/doc/Developing/Sensor-State-Support.md @@ -0,0 +1,97 @@ +# Sensor State Support + +### Introduction + +In this section we are briefly going to walk through, what it takes to write sensor state support. +We will also briefly get around the concepts of the current sensor state monitoring. + +### Logic + +For sensor state monitoring, we have 4 DB tables we need to concentrate about. +- sensors +- state_indexes +- state_translations +- sensors_to_state_indexes + +We will just briefly tie a comment to each one of them. + +#### sensors + +*Each time a sensor needs to be polled, the system needs to know which sensor is it that it need to poll, at what oid is this sensor located and what class the sensor is etc. +This information is fetched from the sensors table.* + +#### state_indexes + +*Is where we keep track of which state sensors we monitor.* + +#### state_translations + +*Is where we map the possible returned state sensor values to a generic LibreNMS value, in order to make displaying and alerting more generic. +We also map these values to the actual state sensor(state_index) where these values are actually returned from.* + + +*The LibreNMS generic states is derived from Nagios:* + +``` +0 = OK + +1 = Warning + +2 = Critical + +3 = Unknown +``` + +#### sensors_to_state_indexes + +*Is as you might have guessed, where the sensor_id is mapped to a state_index_id.* + +### Example +This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplys in Cisco switches. +The file should be located in /includes/discovery/sensors/state/cisco.inc.php. + +```php + $value[0], + 'state_descr' => $value[1], + 'state_draw_graph' => $value[2], + 'state_value' => $value[3], + 'state_generic_value' => $value[4] + ); + dbInsert($insert, 'state_translations'); + } + } + + foreach ($temp as $index => $entry) { + //Discover Sensors + discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $temp[$index]['ciscoEnvMonSupplyStatusDescr'], '1', '1', null, null, null, null, $temp[$index]['ciscoEnvMonSupplyState'], 'snmp', $index); + + //Create Sensor To State Index + create_sensor_to_state_index($device, $state_name, $index); + } + } +} +``` diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php index 68c48fa942..2db5ee4c50 100644 --- a/includes/polling/functions.inc.php +++ b/includes/polling/functions.inc.php @@ -122,7 +122,11 @@ function poll_sensor($device, $class, $unit) { log_event(ucfirst($class).' '.$sensor['sensor_descr'].' above threshold: '.$sensor_value." $unit (> ".$sensor['sensor_limit']." $unit)", $device, $class, $sensor['sensor_id']); } - dbUpdate(array('sensor_current' => $sensor_value, 'lastupdate' => array('NOW()')), 'sensors', '`sensor_class` = ? AND `sensor_id` = ?', array($class, $sensor['sensor_id'])); + if ($sensor['sensor_class'] == 'state' && $sensor['sensor_current'] != $sensor_value) { + log_event($class . ' sensor has changed from ' . $sensor['sensor_current'] . ' to ' . $sensor_value, $device, $class, $sensor['sensor_id']); + } + + dbUpdate(array('sensor_current' => $sensor_value, 'sensor_prev' => $sensor['sensor_current'], 'lastupdate' => array('NOW()')), 'sensors', '`sensor_class` = ? AND `sensor_id` = ?', array($class,$sensor['sensor_id'])); }//end foreach }//end poll_sensor() diff --git a/sql-schema/105.sql b/sql-schema/105.sql index fbe3e6e65c..70f4286357 100644 --- a/sql-schema/105.sql +++ b/sql-schema/105.sql @@ -3,3 +3,4 @@ CREATE TABLE IF NOT EXISTS `state_translations` ( `state_translation_id` int(11) CREATE TABLE IF NOT EXISTS `sensors_to_state_indexes` ( `sensors_to_state_translations_id` int(11) NOT NULL AUTO_INCREMENT, `sensor_id` int(11) NOT NULL, `state_index_id` int(11) NOT NULL, PRIMARY KEY (`sensors_to_state_translations_id`), UNIQUE KEY `sensor_id_state_index_id` (`sensor_id`,`state_index_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; ALTER TABLE `sensors_to_state_indexes` ADD FOREIGN KEY (`sensor_id`) REFERENCES `sensors`(`sensor_id`) ON DELETE RESTRICT ON UPDATE RESTRICT; ALTER TABLE `sensors_to_state_indexes` ADD FOREIGN KEY (`state_index_id`) REFERENCES `state_indexes`(`state_index_id`) ON DELETE RESTRICT ON UPDATE RESTRICT; +ALTER TABLE `sensors` ADD `sensor_prev` float default NULL;