lib/logstash/inputs/snmp/base_client.rb in logstash-input-snmp-1.2.2 vs lib/logstash/inputs/snmp/base_client.rb in logstash-input-snmp-1.2.3
- old
+ new
@@ -5,37 +5,67 @@
module LogStash
class SnmpClientError < StandardError
end
- class BaseSnmpClient
-
+ # Only one Snmp instance per transport should be created and listened on.
+ # The Snmp object is thread safe and can be shared across input threads and pipelines.
+ class SnmpFactory
java_import "org.snmp4j.Snmp"
+ java_import "org.snmp4j.transport.DefaultUdpTransportMapping"
+ java_import "org.snmp4j.transport.DefaultTcpTransportMapping"
+
+ include Singleton
+
+ def initialize
+ @lock = Mutex.new
+ @udp = nil
+ @tcp = nil
+ end
+
+ def udp
+ @lock.synchronize do
+ if @udp.nil?
+ @udp = Snmp.new(DefaultUdpTransportMapping.new)
+ @udp.listen
+ end
+ end
+ @udp
+ end
+
+ def tcp
+ @lock.synchronize do
+ if @tcp.nil?
+ @tcp = Snmp.new(DefaultTcpTransportMapping.new)
+ @tcp.listen
+ end
+ end
+ @tcp
+ end
+ end
+
+ class BaseSnmpClient
java_import "org.snmp4j.TransportMapping"
java_import "org.snmp4j.mp.SnmpConstants"
java_import "org.snmp4j.smi.OID"
java_import "org.snmp4j.smi.VariableBinding"
- java_import "org.snmp4j.transport.DefaultUdpTransportMapping"
- java_import "org.snmp4j.transport.DefaultTcpTransportMapping"
java_import "org.snmp4j.util.TableUtils"
java_import "org.snmp4j.util.TreeUtils"
java_import "org.snmp4j.asn1.BER"
include LogStash::Util::Loggable
def initialize(protocol, address, port, retries, timeout, mib)
+ @mib = mib
+
transport = case protocol.to_s
when "udp"
- DefaultUdpTransportMapping.new
+ @snmp = SnmpFactory.instance.udp
when "tcp"
- DefaultTcpTransportMapping.new
+ @snmp = SnmpFactory.instance.tcp
else
raise(SnmpClientError, "invalid transport protocol specified '#{protocol.to_s}', expecting 'udp' or 'tcp'")
- end
-
- @mib = mib
- @snmp = Snmp.new(transport)
- transport.listen()
+ end
end
def get(oids, strip_root = 0, path_length = 0)
pdu = get_pdu
Array(oids).each { |oid| pdu.add(VariableBinding.new(OID.new(oid))) }