logstash-mixin-event_support 1.0.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 233ecb7e5843d824206f80593bbf24a22e21a8d5975eef777db50b3ebfddc498
4
+ data.tar.gz: 932f4b6b548e0e60e2fa73afcf9997f1dba7670444cbd7f25b05917ca6798fa8
5
+ SHA512:
6
+ metadata.gz: a4656f34606801300aad4e2b28c57c1765c841dd93b896402e5dc423007801f9725a520a1bce4d90a8c43b1a4b5cd0aa33c72d7304a9f8a5140e96d3f8201e9e
7
+ data.tar.gz: 8fbae0b280cd5913e9316e4bbf0f90301f808666c3b44dc373d972e1d66d3b0f08e3ede83856c166ecc14b8e95094e57d49adece3e56cf96c7c30def745260b8
data/CHANGELOG.md ADDED
File without changes
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2020 Elastic N.V. <http://www.elastic.co>
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # Event Support Mixin
2
+
3
+ [![Build Status](https://travis-ci.com/logstash-plugins/logstash-mixin-event_support.svg?branch=master)](https://travis-ci.com/logstash-plugins/logstash-mixin-event_support)
4
+
5
+
6
+ ## Usage
7
+
8
+ 1. Add this gem as a runtime dependency of your Logstash plugin's `gemspec`:
9
+
10
+ ~~~ ruby
11
+ Gem::Specification.new do |s|
12
+ # ...
13
+
14
+ s.add_runtime_dependency 'logstash-mixin-event_support'
15
+ end
16
+ ~~~
17
+
18
+ 2. In your plugin code, require this library and include it into your plugin class
19
+ that already inherits `LogStash::Plugin`:
20
+
21
+ ~~~ ruby
22
+ require 'logstash/plugin_mixins/event_support/event_factory_adapter'
23
+
24
+ class LogStash::Codecs::Bar < Logstash::Codecs::Base
25
+
26
+ include LogStash::PluginMixins::EventSupport::EventFactoryAdapter
27
+
28
+ # an optional mixin to provide `events_from_json` using the factory :
29
+ #include LogStash::PluginMixins::EventSupport::FromJsonHelper
30
+
31
+ def decode(data, &block)
32
+ payload = extract_bar(data) # ...
33
+ yield event_factory.new_event(payload)
34
+ end
35
+
36
+ # def extract_bar(data) ...
37
+
38
+ end
39
+ ~~~
40
+
41
+ ## Development
42
+
43
+ This gem:
44
+ - *MUST* remain API-stable at 1.x
45
+ - *MUST NOT* introduce additional runtime dependencies
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/namespace'
4
+ require 'logstash/plugin'
5
+
6
+ module LogStash
7
+ module PluginMixins
8
+ module EventSupport
9
+ # @see LogStash::PluginMixins::EventSupport::EventFactoryAdapter
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/plugin_mixins/event_support'
4
+
5
+ require 'logstash-core'
6
+ require 'logstash/plugin'
7
+
8
+ module LogStash
9
+ module PluginMixins
10
+ module EventSupport
11
+ module EventFactoryAdapter
12
+
13
+ ##
14
+ # @api internal
15
+ # @param base [Class]: a class that inherits `LogStash::Plugin`, typically one
16
+ # descending from one of the four plugin base classes
17
+ # (e.g., `LogStash::Inputs::Base`)
18
+ # @raise [ArgumentError]
19
+ # @return [void]
20
+ def self.included(base)
21
+ fail(ArgumentError, "`#{base}` must inherit LogStash::Plugin") unless base < LogStash::Plugin
22
+
23
+ if defined? LogStash::Plugins::EventFactorySupport
24
+ core_event_support = LogStash::Plugins::EventFactorySupport
25
+ fail(ArgumentError, "`#{base}` should include #{core_event_support}") unless base < core_event_support
26
+ else
27
+ unless const_defined?(:FallbackImpl)
28
+ require_relative 'event_factory_adapter/fallback_impl'
29
+ private_constant :FallbackImpl
30
+ end
31
+ base.send(:include, FallbackImpl)
32
+ end
33
+ end
34
+
35
+ ##
36
+ # @api private
37
+ #
38
+ # @param base [Object]
39
+ # @raise [ArgumentError]
40
+ def self.extended(base)
41
+ fail(ArgumentError, "`#{self}` cannot be extended into an existing object (#{base.inspect})")
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ module LogStash::PluginMixins::EventSupport::EventFactoryAdapter::FallbackImpl
4
+
5
+ # The event_factory method is effectively final and should not be re-defined by plugins.
6
+ #
7
+ # @return an event factory object with a `new_event(Hash)` API
8
+ def event_factory
9
+ @_event_factory ||= BasicEventFactory::INSTANCE
10
+ end
11
+
12
+ # The `targeted_event_factory` method is effectively final and should not be re-defined.
13
+ # If the plugin defines a `target => ...` option than this method will return a factory
14
+ # that respects the set target, otherwise (no target) returns {#event_factory}.
15
+ #
16
+ # @return an event factory object with a `new_event(Hash)` API
17
+ def targeted_event_factory
18
+ @_targeted_event_factory ||= begin # not synchronized - fine to initialize twice
19
+ raise ArgumentError.new('config(:target) not present') unless respond_to?(:target)
20
+ target.nil? ? event_factory : TargetedEventFactory.new(event_factory, target)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ class BasicEventFactory
27
+ INSTANCE = new
28
+
29
+ # @param payload [Hash]
30
+ # @return [LogStash::Event]
31
+ def new_event(payload = {})
32
+ LogStash::Event.new(payload)
33
+ end
34
+
35
+ end
36
+ private_constant :BasicEventFactory
37
+
38
+ class TargetedEventFactory
39
+
40
+ def initialize(inner, target)
41
+ @delegate = inner
42
+ @target = target # TODO validate
43
+ end
44
+
45
+ # @param payload [Hash]
46
+ # @return [LogStash::Event]
47
+ def new_event(payload = {})
48
+ event = @delegate.new_event
49
+ event.set(@target, payload)
50
+ event
51
+ end
52
+
53
+ end
54
+ private_constant :TargetedEventFactory
55
+
56
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/plugin_mixins/event_support'
4
+ require 'logstash/plugin_mixins/event_support/event_factory_adapter'
5
+
6
+ require 'logstash-core'
7
+ require 'logstash/event'
8
+
9
+ module LogStash
10
+ module PluginMixins
11
+ module EventSupport
12
+ module FromJsonHelper
13
+
14
+ def self.included(base)
15
+ if defined? LogStash::Plugins::EventFactorySupport # native support from LS core
16
+ base.send(:include, NativeImpl)
17
+ else
18
+ require 'logstash/json'
19
+ base.send(:include, FallbackImpl)
20
+ end
21
+ end
22
+
23
+ module NativeImpl
24
+
25
+ def events_from_json(json, event_factory)
26
+ LogStash::Event.from_json(json) { |data| event_factory.new_event(data) }
27
+ end
28
+
29
+ end
30
+ private_constant :NativeImpl
31
+
32
+ module FallbackImpl
33
+
34
+ def events_from_json(json, event_factory)
35
+ decoded = LogStash::Json.load(json)
36
+ case decoded
37
+ when Array then decoded.map { |data| event_factory.new_event(data) }
38
+ when Hash then [ event_factory.new_event(decoded) ]
39
+ else raise LogStash::Json::ParserError.new("JSON must contain array or hash, got #{decoded.class}")
40
+ end
41
+ end
42
+
43
+ end
44
+ private_constant :FallbackImpl
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,140 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ require "logstash/plugin_mixins/event_support/event_factory_adapter"
4
+
5
+ require 'logstash/inputs/base'
6
+ require 'logstash/filters/base'
7
+ require 'logstash/codecs/base'
8
+ require 'logstash/outputs/base'
9
+
10
+ describe LogStash::PluginMixins::EventSupport::EventFactoryAdapter do
11
+ let(:event_factory_adapter) { described_class }
12
+
13
+ context 'included into a class' do
14
+
15
+ context 'that does not inherit from `LogStash::Plugin`' do
16
+ let(:plugin_class) { Class.new }
17
+ it 'fails with an ArgumentError' do
18
+ expect do
19
+ plugin_class.send(:include, described_class)
20
+ end.to raise_error(ArgumentError, /LogStash::Plugin/)
21
+ end
22
+ end
23
+
24
+ [
25
+ LogStash::Inputs::Base,
26
+ LogStash::Filters::Base,
27
+ LogStash::Codecs::Base,
28
+ LogStash::Outputs::Base
29
+ ].each do |base_class|
30
+
31
+ context "that inherits from `#{base_class}`" do
32
+
33
+ # native_event_factory_support = base_class.method_defined?(:event_factory)
34
+
35
+ let(:plugin_base_class) { base_class }
36
+
37
+ subject(:plugin_class) do
38
+ Class.new(plugin_base_class) do
39
+ config_name 'sample'
40
+ end
41
+ end
42
+
43
+ describe 'the result' do
44
+
45
+ before(:each) do
46
+ plugin_class.send(:include, described_class)
47
+ end
48
+
49
+ it 'defines an `event_factory` method' do
50
+ expect(plugin_class.method_defined?(:event_factory)).to be true
51
+ end
52
+
53
+ it 'defines an `targeted_event_factory` method' do
54
+ expect(plugin_class.method_defined?(:targeted_event_factory)).to be true
55
+ end
56
+
57
+ let(:options) { Hash.new }
58
+ let(:plugin) { plugin_class.new(options) }
59
+
60
+ shared_examples 'an event factory' do
61
+
62
+ it 'returns an event' do
63
+ expect( event_factory.new_event ).to be_a LogStash::Event
64
+ expect( event = event_factory.new_event('foo' => 'bar') ).to be_a LogStash::Event
65
+ expect( event.get('foo') ).to eql 'bar'
66
+ end
67
+
68
+ end
69
+
70
+ describe 'event_factory' do
71
+
72
+ subject(:event_factory) { plugin.send(:event_factory) }
73
+
74
+ it_behaves_like 'an event factory'
75
+
76
+ it 'memoizes the factory instance' do
77
+ expect( event_factory ).to be plugin.send(:event_factory)
78
+ end
79
+
80
+ end
81
+
82
+ describe 'targeted_event_factory (no config :target option)' do
83
+
84
+ it 'raises an error' do
85
+ expect { plugin.send(:targeted_event_factory) }.to raise_error(ArgumentError, /target/)
86
+ end
87
+
88
+ end
89
+
90
+ describe 'targeted_event_factory' do
91
+
92
+ subject(:plugin_class) do
93
+ Class.new(plugin_base_class) do
94
+ config_name 'sample'
95
+ config :target, :validate => :string
96
+ end
97
+ end
98
+
99
+ subject(:targeted_event_factory) { plugin.send(:targeted_event_factory) }
100
+
101
+ it_behaves_like 'an event factory' do
102
+ subject(:event_factory) { targeted_event_factory }
103
+ end
104
+
105
+ it 'memoizes the factory instance' do
106
+ expect( targeted_event_factory ).to be plugin.send(:targeted_event_factory)
107
+ end
108
+
109
+ it 'uses the basic event factory (no target specified)' do
110
+ expect( targeted_event_factory ).to be plugin.send(:event_factory)
111
+ end
112
+
113
+ context 'with target' do
114
+
115
+ let(:options) { super().merge('target' => '[the][baz]') }
116
+
117
+ it 'returns an event' do
118
+ expect( targeted_event_factory.new_event ).to be_a LogStash::Event
119
+ expect( event = targeted_event_factory.new_event('foo' => 'bar') ).to be_a LogStash::Event
120
+ expect( event.include?('foo') ).to be false
121
+ expect( event.get('[the][baz][foo]') ).to eql 'bar'
122
+ end
123
+
124
+ it 'memoizes the factory instance' do
125
+ expect( targeted_event_factory ).to be plugin.send(:targeted_event_factory)
126
+ end
127
+
128
+ it 'uses a different factory from the basic one' do
129
+ expect( targeted_event_factory ).not_to be plugin.send(:event_factory)
130
+ end
131
+
132
+ end
133
+ end
134
+
135
+ end
136
+ end
137
+ end
138
+
139
+ end
140
+ end
@@ -0,0 +1,70 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ require "logstash/plugin_mixins/event_support/from_json_helper"
4
+
5
+ require 'logstash/inputs/base'
6
+ require 'logstash/filters/base'
7
+ require 'logstash/codecs/base'
8
+ require 'logstash/outputs/base'
9
+
10
+ describe LogStash::PluginMixins::EventSupport::FromJsonHelper do
11
+
12
+ context 'included into a class' do
13
+
14
+ [
15
+ LogStash::Inputs::Base,
16
+ LogStash::Filters::Base,
17
+ LogStash::Codecs::Base,
18
+
19
+ ].each do |base_class|
20
+
21
+ context "that inherits from `#{base_class}`" do
22
+
23
+ subject(:plugin_class) do
24
+ Class.new(base_class) do
25
+ config_name 'sample'
26
+
27
+ include LogStash::PluginMixins::EventSupport::FromJsonHelper
28
+ end
29
+ end
30
+
31
+ let(:options) { Hash.new }
32
+ let(:plugin) { plugin_class.new(options) }
33
+
34
+ let(:event_factory) { double('event_factory') }
35
+
36
+ it 'parses valid json' do
37
+ expect( event_factory ).to receive(:new_event) { |data| LogStash::Event.new('test' => data) }
38
+
39
+ events = plugin.events_from_json('{ "foo": "bar" }', event_factory)
40
+ expect( events.size ).to eql 1
41
+ expect( event = events.first ).to be_a LogStash::Event
42
+ expect( event.get('[test]') ).to eql 'foo' => 'bar'
43
+ end
44
+
45
+ it 'parses multi json' do
46
+ expect( event_factory ).to receive(:new_event) { |data| LogStash::Event.new('test' => data) }.twice
47
+
48
+ events = plugin.events_from_json('[ {"foo": "bar"}, { "baz": 42.0 } ]', event_factory)
49
+ expect( events.size ).to eql 2
50
+ expect( events[0].get('[test]') ).to eql 'foo' => 'bar'
51
+ expect( events[1].get('[test]') ).to eql 'baz' => 42.0
52
+ end
53
+
54
+ it 'raises on unexpected json' do
55
+ expect { plugin.events_from_json(' "42" ', event_factory) }.to raise_error(LogStash::Json::ParserError)
56
+ end
57
+
58
+ it 'raises on invalid json' do
59
+ expect { plugin.events_from_json('{ "" }', event_factory) }.to raise_error(LogStash::Json::ParserError)
60
+ end
61
+
62
+ it 'raises on incomplete json' do
63
+ expect { plugin.events_from_json('{"answer":"42"', event_factory) }.to raise_error(LogStash::Json::ParserError)
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,3 @@
1
+ require 'rspec'
2
+
3
+ require "logstash-core"
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logstash-mixin-event_support
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: java
6
+ authors:
7
+ - Elastic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-06-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '6.8'
19
+ name: logstash-core
20
+ prerelease: false
21
+ type: :runtime
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '6.8'
27
+ - !ruby/object:Gem::Dependency
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ name: logstash-devutils
34
+ prerelease: false
35
+ type: :development
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ name: logstash-codec-plain
48
+ prerelease: false
49
+ type: :development
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.9'
61
+ name: rspec
62
+ prerelease: false
63
+ type: :development
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.9'
69
+ description:
70
+ email: info@elastic.co
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - CHANGELOG.md
76
+ - LICENSE
77
+ - README.md
78
+ - lib/logstash/plugin_mixins/event_support.rb
79
+ - lib/logstash/plugin_mixins/event_support/event_factory_adapter.rb
80
+ - lib/logstash/plugin_mixins/event_support/event_factory_adapter/fallback_impl.rb
81
+ - lib/logstash/plugin_mixins/event_support/from_json_helper.rb
82
+ - spec/logstash/plugin_mixins/event_support/event_factory_adapter_spec.rb
83
+ - spec/logstash/plugin_mixins/event_support/from_json_helper_spec.rb
84
+ - spec/logstash/spec_helper.rb
85
+ homepage: https://github.com/logstash-plugins/logstash-mixin-event_support
86
+ licenses:
87
+ - Apache-2.0
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubyforge_project:
105
+ rubygems_version: 2.6.13
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Event support for Logstash plugins
109
+ test_files:
110
+ - spec/logstash/plugin_mixins/event_support/event_factory_adapter_spec.rb
111
+ - spec/logstash/plugin_mixins/event_support/from_json_helper_spec.rb
112
+ - spec/logstash/spec_helper.rb