Skip to content

Commit

Permalink
initial commit: it works!
Browse files Browse the repository at this point in the history
  • Loading branch information
coffeepac committed Nov 18, 2015
1 parent 63e497d commit ec64d63
Show file tree
Hide file tree
Showing 8 changed files with 273 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
source 'https://rubygems.org'
gemspec
117 changes: 117 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
PATH
remote: .
specs:
logstash-codec-fieldselect (0.0.1)
logstash-core (>= 2.0.0.beta2, < 3.0.0)
logstash-mixin-aws
stud (~> 0.0.22)

GEM
remote: https://rubygems.org/
specs:
aws-sdk (2.1.36)
aws-sdk-resources (= 2.1.36)
aws-sdk-core (2.1.36)
jmespath (~> 1.0)
aws-sdk-resources (2.1.36)
aws-sdk-core (= 2.1.36)
aws-sdk-v1 (1.66.0)
json (~> 1.4)
nokogiri (>= 1.4.4)
cabin (0.7.2)
clamp (0.6.5)
coderay (1.1.0)
concurrent-ruby (0.9.2-java)
diff-lcs (1.2.5)
ffi (1.9.10-java)
filesize (0.0.4)
gem_publisher (1.5.0)
gems (0.8.3)
i18n (0.6.9)
insist (1.0.0)
jmespath (1.1.3)
jrjackson (0.3.7)
jruby-openssl (0.9.12-java)
json (1.8.3-java)
kramdown (1.9.0)
logstash-codec-line (2.0.2)
logstash-core (>= 2.0.0.beta2, < 3.0.0)
logstash-codec-plain (2.0.2)
logstash-core (>= 2.0.0.beta2, < 3.0.0)
logstash-core (2.1.0.snapshot2-java)
cabin (~> 0.7.0)
clamp (~> 0.6.5)
concurrent-ruby (= 0.9.2)
filesize (= 0.0.4)
gems (~> 0.8.3)
i18n (= 0.6.9)
jrjackson (~> 0.3.7)
jruby-openssl (>= 0.9.11)
minitar (~> 0.5.4)
pry (~> 0.10.1)
rubyzip (~> 1.1.7)
stud (~> 0.0.19)
thread_safe (~> 0.3.5)
treetop (< 1.5.0)
logstash-devutils (0.0.18-java)
gem_publisher
insist (= 1.0.0)
kramdown
minitar
rake
rspec (~> 3.1.0)
rspec-wait
stud (>= 0.0.20)
logstash-input-generator (2.0.2)
logstash-codec-plain
logstash-core (>= 2.0.0.beta2, < 3.0.0)
logstash-mixin-aws (2.0.2)
aws-sdk (~> 2.1.0)
aws-sdk-v1 (>= 1.61.0)
logstash-codec-plain
logstash-core (>= 2.0.0.beta2, < 3.0.0)
method_source (0.8.2)
minitar (0.5.4)
nokogiri (1.6.6.3-java)
polyglot (0.3.5)
pry (0.10.3-java)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
spoon (~> 0.0)
rake (10.4.2)
rspec (3.1.0)
rspec-core (~> 3.1.0)
rspec-expectations (~> 3.1.0)
rspec-mocks (~> 3.1.0)
rspec-core (3.1.7)
rspec-support (~> 3.1.0)
rspec-expectations (3.1.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.1.0)
rspec-mocks (3.1.3)
rspec-support (~> 3.1.0)
rspec-support (3.1.2)
rspec-wait (0.0.8)
rspec (>= 2.11, < 3.5)
rubyzip (1.1.7)
slop (3.6.0)
spoon (0.0.4)
ffi
stud (0.0.22)
thread_safe (0.3.5-java)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)

PLATFORMS
java

DEPENDENCIES
logstash-codec-fieldselect!
logstash-codec-line
logstash-devutils
logstash-input-generator

BUNDLED WITH
1.10.6
7 changes: 7 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
@files=[]

task :default do
system("rake -T")
end

require "logstash/devutils/rake"
Binary file added lib/logstash/codecs/.fieldselect.rb.swp
Binary file not shown.
62 changes: 62 additions & 0 deletions lib/logstash/codecs/fieldselect.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# encoding: utf-8
require "logstash/codecs/base"
require "logstash/codecs/line"

class LogStash::Codecs::Fieldselect < LogStash::Codecs::Base

# This codec will select only the fields listed or default
# to only selecting message
#
# input {
# stdin { codec => fieldselect { fields => [] }
# }
#
# or
#
# output {
# stdout { codec => fieldselect { fields => [] }
# }
config_name "fieldselect"

# Select fields to output, concated with a comma
config :fields, :validate => :array, :default => ['message']

public
def register
@lines = LogStash::Codecs::Line.new
@lines.charset = "UTF-8"
end

public
def decode(data)
@lines.decode(data) do |line|
selected = field_selector(line)
yield LogStash::Event.new(selected)
end
end # def decode

public
def encode(event)
encoded = field_concater(event)
@on_event.call(event, encoded)
end # def encode

private
def field_selector(data)
selected = {}
@fields.each do |field|
selected[field] = data[field]
end
return selected
end

private
def field_concater(data)
concated = ""
@fields.each do |field|
concated += data[field] + ", "
end
concated.chomp!(", ")
return concated + "\n"
end
end # class LogStash::Codecs::Fieldselect
30 changes: 30 additions & 0 deletions logstash-codec-fieldselect.gemspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Gem::Specification.new do |s|

s.name = 'logstash-codec-fieldselect'
s.version = '0.0.1'
s.licenses = ['Apache License (2.0)']
s.summary = "This codec was created to select certain fields for output"
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
s.authors = ["Elastic"]
s.email = '[email protected]'
s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
s.require_paths = ["lib"]

# Files
s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']

# Tests
s.test_files = s.files.grep(%r{^(test|spec|features)/})

# Special flag to let us know this is actually a logstash plugin
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }

# Gem dependencies
s.add_runtime_dependency "logstash-core", ">= 2.0.0.beta2", "< 3.0.0"
s.add_runtime_dependency 'logstash-mixin-aws'
s.add_runtime_dependency 'stud', '~> 0.0.22'
s.add_development_dependency 'logstash-devutils'
s.add_development_dependency 'logstash-input-generator'
s.add_development_dependency 'logstash-codec-line'
end

Binary file added spec/codecs/.fieldselect_spec.rb.swp
Binary file not shown.
55 changes: 55 additions & 0 deletions spec/codecs/fieldselect_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# encoding: utf-8

require "logstash/devutils/rspec/spec_helper"
require "logstash/codecs/fieldselect"
require "logstash/event"

describe LogStash::Codecs::Fieldselect do
context "default settings" do
subject do
next LogStash::Codecs::Fieldselect.new
end

context "#encode" do
let (:event) {LogStash::Event.new({"message" => "hello world", "host" => "test", "leggo" => "my eggo"})}

it "should return only the default select field, message" do
expect(subject).to receive(:on_event).once.and_call_original
subject.on_event do |e, d|
insist {d} == event['message'] + "\n"
end
subject.encode(event)
end
end

context "#decode" do
it "should return only the default select field, message" do
decoded = false
subject.decode("hello world\n") do |e|
decoded = true
insist { e.is_a?(LogStash::Event) }
insist { e["message"] } == "hello world"
insist { e["host"] } == nil
end
insist { decoded } == true
end

end
end

context "select specific fields" do
subject do
next LogStash::Codecs::Fieldselect.new({'fields' => ['message', 'leggo']})
end

context "#encode" do
it "should return both selected fields, message and leggo" do
expect(subject).to receive(:on_event).once.and_call_original
subject.on_event do |e, d|
insist {d} == event['message'] + ", " + event['leggo'] + "\n"
end
end
end
end
end

0 comments on commit ec64d63

Please sign in to comment.