From 271805eca02c2bc810c05ae39f67164b59af18e5 Mon Sep 17 00:00:00 2001 From: Pablo Barrera Date: Wed, 7 Aug 2013 23:13:50 +0200 Subject: [PATCH] Adding extractnumbers filter --- lib/logstash/filters/extractnumbers.rb | 83 ++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 lib/logstash/filters/extractnumbers.rb diff --git a/lib/logstash/filters/extractnumbers.rb b/lib/logstash/filters/extractnumbers.rb new file mode 100644 index 000000000..64917f0ba --- /dev/null +++ b/lib/logstash/filters/extractnumbers.rb @@ -0,0 +1,83 @@ +require 'logstash/namespace' +require 'logstash/filters/base' + + +# This filter automatically extracts all numbers found inside a string +# +# This is useful when you have lines that don't match a grok pattern +# or use json but you still need to extract numbers. +# +# Each numbers is returned in a @fields.intX or @fields.floatX field +# where X indicates the position in the string. +# +# The fields produced by this filter are extra useful used in combination +# with kibana number plotting features. +class LogStash::Filters::ExtractNumbers < LogStash::Filters::Base + config_name 'extractnumbers' + plugin_status 'experimental' + + # The source field for the data. By default is message. + config :source, :validate => :string, :default => 'message' + + public + def register + end + + public + def filter(event) + integers = nil + floats = nil + + msg = event[@source] + + if not msg + return + end + + # If for some reason the field is an array of values, take the first only. + msg = msg.first if msg.is_a?(Array) + + + fields = msg.split + for elem in fields + int = str_as_integer(elem) + if int != nil + if not integers + integers = Array.new + end + integers.push(int) + next + end + f = str_as_float(elem) + if f != nil + if not floats + floats = Array.new + end + floats.push(f) + end + end + + if integers + index = 0 + for i in integers + index += 1 + event["int" + index.to_s] = i + end + end + if floats + index = 0 + for f in floats + index += 1 + event["float" + index.to_s] = f + end + end + end + + def str_as_integer(str) + Integer(str) rescue nil + end + + def str_as_float(str) + Float(str) rescue nil + end +end # class LogStash::Filters::ExtractNumbers