lib/arborist/monitor/snmp/swap.rb
changeset 4 e6eb11b1e00d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/arborist/monitor/snmp/swap.rb	Wed Sep 07 15:23:42 2016 -0700
@@ -0,0 +1,86 @@
+# -*- ruby -*-
+# vim: set noet nosta sw=4 ts=4 :
+
+require 'arborist/monitor/snmp' unless defined?( Arborist::Monitor::SNMP )
+
+# SNMP swap usage checks.
+# Returns swap used in a 'swap_in_use' attribute.
+#
+class Arborist::Monitor::SNMP::Swap
+	include Arborist::Monitor::SNMP
+
+	extend Loggability
+	log_to :arborist
+
+	# Global defaults for instances of this monitor
+	#
+	DEFAULT_OPTIONS = {
+		error_at: 95, # in percent full
+	}
+
+	# OIDS for discovering memory usage.
+	#
+	MEMORY = {
+		swap_total: '1.3.6.1.4.1.2021.4.3.0',
+		swap_avail: '1.3.6.1.4.1.2021.4.4.0',
+	}
+
+
+	### This monitor is complex enough to require creating an instance from the caller.
+	### Provide a friendlier error message the class was provided to exec() directly.
+	###
+	def self::run( nodes )
+		return new.run( nodes )
+	end
+
+
+	### Create a new instance of this monitor.
+	###
+	def initialize( options=DEFAULT_OPTIONS )
+		options = DEFAULT_OPTIONS.merge( options || {} )
+		options.each do |name, value|
+			self.public_send( "#{name.to_s}=", value )
+		end
+	end
+
+	# Set an error if used swap exceeds this percentage.
+	attr_accessor :error_at
+
+
+	### Perform the monitoring checks.
+	###
+	def run( nodes )
+		super do |snmp, host|
+			self.gather_swap( snmp, host )
+		end
+	end
+
+
+	#########
+	protected
+	#########
+
+	### Collect used swap information for +host+ from an existing (and
+	### open) +snmp+ connection.
+	###
+	def gather_swap( snmp, host )
+		self.log.debug "Getting used swap for: %s" % [ host ]
+
+		swap_total = snmp.get( SNMP::ObjectId.new(MEMORY[:swap_total]) ).varbind_list.first.value.to_f
+		swap_avail = snmp.get( SNMP::ObjectId.new(MEMORY[:swap_avail]) ).varbind_list.first.value.to_f
+		swap_in_use  = (( swap_avail.to_f / swap_total * 100 ) - 100 ).abs
+		self.log.debug "  Swap in use on %s: %0.1f%%" % [ host, swap_in_use ]
+
+		config = @identifiers[ host ].last || {}
+		if swap_in_use >= ( config['error_at'] || self.error_at )
+			@results[ host ] = {
+				error: "%0.1f%% swap in use" % [ swap_in_use ],
+				swap_in_use: swap_avail
+			}
+		else
+			@results[ host ] = { swap_in_use: swap_in_use }
+		end
+	end
+
+end # class Arborist::Monitor::SNMP::Swap
+