logstash-mixin-event_support 1.0.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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