logstash-filter-nested_json_split 0.9.1

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
+ SHA1:
3
+ metadata.gz: a1fcbe8e0dcf6009a99f430e43dc6536916c041a
4
+ data.tar.gz: 70736cad099403266fc01fd6bcf9bda78b00be7a
5
+ SHA512:
6
+ metadata.gz: 18da27009d19c871afa235ad29643bca54e850394d1fc56498633f7fa1a2e08860cdc27f8f20cba76d3c5aeced85b1c185918956c88c546585057c1d6bf75fe3
7
+ data.tar.gz: 91f886d45791181e773472d76c44b98d0d2e9dae32cac6c2897d533ae95e09521f10eb95f616020388442affc61ae96d16ac14270091bea41593e7b8412c3090
checksums.yaml.gz.sig ADDED
Binary file
data.tar.gz.sig ADDED
Binary file
data/CHANGELOG.md ADDED
@@ -0,0 +1,2 @@
1
+ ## 0.9.1
2
+ - First release
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2015 herimedia e.K., Köln <https://herimedia.com>
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,89 @@
1
+ # Logstash Plugin
2
+
3
+ [![Build
4
+ Status](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Filters/job/logstash-plugin-filter-nested_json_split-unit/badge/icon)](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Filters/job/logstash-plugin-filter-nested_json_split-unit/)
5
+
6
+ This is a plugin for [Logstash](https://github.com/elastic/logstash).
7
+
8
+ It is fully free and fully open source. The license is Apache 2.0, meaning you are pretty much free to use it however you want in whatever way.
9
+
10
+ ## Documentation
11
+
12
+ Logstash provides infrastructure to automatically generate documentation for this plugin. We use the asciidoc format to write documentation so any comments in the source code will be first converted into asciidoc and then into html. All plugin documentation are placed under one [central location](http://www.elastic.co/guide/en/logstash/current/).
13
+
14
+ - For formatting code or config example, you can use the asciidoc `[source,ruby]` directive
15
+ - For more asciidoc formatting tips, see the excellent reference here https://github.com/elastic/docs#asciidoc-guide
16
+
17
+ ## Need Help?
18
+
19
+ Need help? Try #logstash on freenode IRC or the https://discuss.elastic.co/c/logstash discussion forum.
20
+
21
+ ## Developing
22
+
23
+ ### 1. Plugin Developement and Testing
24
+
25
+ #### Code
26
+ - To get started, you'll need JRuby with the Bundler gem installed.
27
+
28
+ - Create a new plugin or clone and existing from the GitHub [logstash-plugins](https://github.com/logstash-plugins) organization. We also provide [example plugins](https://github.com/logstash-plugins?query=example).
29
+
30
+ - Install dependencies
31
+ ```sh
32
+ bundle install
33
+ ```
34
+
35
+ #### Test
36
+
37
+ - Update your dependencies
38
+
39
+ ```sh
40
+ bundle install
41
+ ```
42
+
43
+ - Run tests
44
+
45
+ ```sh
46
+ bundle exec rspec
47
+ ```
48
+
49
+ ### 2. Running your unpublished Plugin in Logstash
50
+
51
+ #### 2.1 Run in a local Logstash clone
52
+
53
+ - Edit Logstash `Gemfile` and add the local plugin path, for example:
54
+ ```ruby
55
+ gem "logstash-filter-awesome", :path => "/your/local/logstash-filter-awesome"
56
+ ```
57
+ - Install plugin
58
+ ```sh
59
+ bin/plugin install --no-verify
60
+ ```
61
+ - Run Logstash with your plugin
62
+ ```sh
63
+ bin/logstash -e 'filter {awesome {}}'
64
+ ```
65
+ At this point any modifications to the plugin code will be applied to this local Logstash setup. After modifying the plugin, simply rerun Logstash.
66
+
67
+ #### 2.2 Run in an installed Logstash
68
+
69
+ You can use the same **2.1** method to run your plugin in an installed Logstash by editing its `Gemfile` and pointing the `:path` to your local plugin development directory or you can build the gem and install it using:
70
+
71
+ - Build your plugin gem
72
+ ```sh
73
+ gem build logstash-filter-awesome.gemspec
74
+ ```
75
+ - Install the plugin from the Logstash home
76
+ ```sh
77
+ bin/plugin install /your/local/plugin/logstash-filter-awesome.gem
78
+ ```
79
+ - Start Logstash and proceed to test the plugin
80
+
81
+ ## Contributing
82
+
83
+ All contributions are welcome: ideas, patches, documentation, bug reports, complaints, and even something you drew up on a napkin.
84
+
85
+ Programming is not a required skill. Whatever you've seen about open source and maintainers or community members saying "send patches or die" - you will not see that here.
86
+
87
+ It is more important to the community that you are able to contribute.
88
+
89
+ For more information about contributing, see the [CONTRIBUTING](https://github.com/elastic/logstash/blob/master/CONTRIBUTING.md) file.
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+
3
+ require "logstash/filters/base"
4
+ require "logstash/namespace"
5
+
6
+ # This plugin ingests a (potentially nested) JSON object and splits it into
7
+ # multiple events based on one of its attributes that is an Array.
8
+ #
9
+ # For example, you could turn this aggregate event:
10
+ #
11
+ # [source,ruby]
12
+ # ----------------------------------------------------------------------------
13
+ # {
14
+ # "requestId": "123",
15
+ # "body": {
16
+ # "events": [
17
+ # { "id": "456", "master_event": "First event." },
18
+ # { "id": "789", "master_event": "Second event." },
19
+ # }
20
+ # }
21
+ # }
22
+ # ----------------------------------------------------------------------------
23
+ #
24
+ # Into these individual events:
25
+ #
26
+ # [source,ruby]
27
+ # ----------------------------------------------------------------------------
28
+ # {
29
+ # "requestId": "123",
30
+ # "event": { "id": "456", "master_event": "First event." }
31
+ # }
32
+ #
33
+ # {
34
+ # "requestId": "123",
35
+ # "event": { "id": "789", "master_event": "Second event." }
36
+ # }
37
+ # ----------------------------------------------------------------------------
38
+ #
39
+ # By configuring the plugin like so:
40
+ #
41
+ # [source]
42
+ # ----------------------------------------------------------------------------
43
+ # filter {
44
+ # nested_json_split {
45
+ # keys: ["body", "events"]
46
+ # target: "event"
47
+ # }
48
+ # }
49
+ # ----------------------------------------------------------------------------
50
+ #
51
+ # By default, the following configuration is applied:
52
+ #
53
+ # [source]
54
+ # ----------------------------------------------------------------------------
55
+ # filter {
56
+ # nested_json_split {
57
+ # keys: ["events"]
58
+ # target: "message"
59
+ # }
60
+ # }
61
+ # ----------------------------------------------------------------------------
62
+ class LogStash::Filters::NestedJsonSplit < LogStash::Filters::Base
63
+
64
+ config_name "nested_json_split"
65
+
66
+ config :keys, validate: :array, default: ["events"]
67
+ config :target, validate: :string, default: "message"
68
+
69
+ def filter(master_event)
70
+ events = master_event.remove(@keys.first)
71
+ @keys[1..-1].each do |key|
72
+ raise LogStash::ConfigurationError, "Input must be a JSON object / Ruby Hash but is instead: #{events.class.name} (#{events.inspect}). (Error occured while inspecting key #{key.inspect}.)" unless events.is_a?(Hash)
73
+ events = events[key]
74
+ end
75
+
76
+ if events.nil?
77
+ @logger.warn("Filtered events are null", events: events, keys: @keys, master_event: master_event, target: @target)
78
+ elsif not events.is_a?(Array)
79
+ raise(
80
+ LogStash::ConfigurationError,
81
+ "Filtered input should be an Array but is instead: #{events.class.name} (#{events.inspect})."
82
+ )
83
+ elsif events.empty?
84
+ @logger.info("Filtered events are empty", events: events, keys: @keys, master_event: master_event, target: @target)
85
+ else
86
+ events.each_with_index do |event_payload, idx|
87
+ if event_payload.respond_to?(:empty?) ? event_payload.empty? : !event_payload
88
+ @logger.info("Event #{idx+1} is empty", event_payload: event_payload, events: events, keys: @keys, master_event: master_event, target: @target)
89
+ else
90
+ event = master_event.clone
91
+ event[@target] = event_payload
92
+
93
+ @logger.debug("Stashing event #{idx+1}", event: event, event_payload: event_payload, events: events, keys: @keys, master_event: master_event, target: @target)
94
+
95
+ filter_matched(event)
96
+ yield event
97
+ end
98
+ end
99
+ end
100
+
101
+ master_event.cancel
102
+ filter_matched(master_event)
103
+ end
104
+
105
+ def register
106
+ raise LogStash::ConfigurationError, "\"keys\" must be an Array of Strings but is: #{@keys.inspect}." unless @keys.is_a?(Array) and @keys.all? { |k| k.is_a?(String) }
107
+ end
108
+
109
+ end
@@ -0,0 +1,27 @@
1
+ Gem::Specification.new do |s|
2
+ s.authors = ["Niels Ganser <niels@herimedia.com>"]
3
+ 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."
4
+ s.email = "niels@herimedia.com"
5
+ s.files = Dir[
6
+ "*.gemspec",
7
+ "*.md",
8
+ "Gemfile",
9
+ "LICENSE",
10
+ "lib/**/*",
11
+ "spec/**/*",
12
+ ]
13
+ s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
14
+ s.licenses = ["Apache License (2.0)"]
15
+ s.metadata = { "logstash_plugin" => "true", "logstash_group" => "filter" }
16
+ s.name = "logstash-filter-nested_json_split"
17
+ s.require_paths = ["lib"]
18
+ s.summary = "This nested_json_split filter splits an Array in a nested Hash / JSON object into multiple individual events."
19
+ s.test_files = s.files.grep(%r{\Aspec/})
20
+ s.version = "0.9.1"
21
+
22
+ s.cert_chain = ["certs/gems.herimedia.com-CA.pem", "certs/niels@herimedia.com.crt"]
23
+ s.signing_key = File.expand_path(ENV["SIGNING_KEY"]) if $0 =~ /gem\z/
24
+
25
+ s.add_development_dependency "logstash-devutils"
26
+ s.add_runtime_dependency "logstash-core", ">= 2.0.0", "< 3.0.0"
27
+ end
@@ -0,0 +1,195 @@
1
+ # encoding: utf-8
2
+
3
+ require "logstash/filters/nested_json_split"
4
+ require "spec_helper"
5
+
6
+ describe LogStash::Filters::NestedJsonSplit do
7
+ context "When using the default config" do
8
+ config <<-CONFIG
9
+ filter {
10
+ nested_json_split {}
11
+ }
12
+ CONFIG
13
+
14
+ describe "it should split \"events\" into \"message\"s" do
15
+ sample({
16
+ "events" => [
17
+ "first event",
18
+ "second event",
19
+ ],
20
+ }) do
21
+ expect(subject.length).to eq(2)
22
+
23
+ expect(subject[0]["message"]).to eq("first event")
24
+ expect(subject[1]["message"]).to eq("second event")
25
+ end
26
+ end
27
+
28
+ describe "it should retain the \"message\"s data structures" do
29
+ sample({
30
+ "events" => [
31
+ "A String",
32
+ 2,
33
+ { "A" => "Hash", "should" => "remain" },
34
+ ["An", "Array"],
35
+ ],
36
+ }) do
37
+ expect(subject.length).to eq(4)
38
+
39
+ expect(subject[0]["message"]).to eq("A String")
40
+ expect(subject[1]["message"]).to eq(2)
41
+ expect(subject[2]["message"]).to eq({ "A" => "Hash", "should" => "remain" })
42
+ expect(subject[3]["message"]).to eq(["An", "Array"])
43
+ end
44
+ end
45
+
46
+ describe "it should discard the original \"events\"" do
47
+ sample({
48
+ "events" => ["event 1", "event 2"],
49
+ }) do
50
+ expect(subject.length).to eq(2)
51
+
52
+ expect(subject[0]["events"]).to eq(nil)
53
+ expect(subject[1]["events"]).to eq(nil)
54
+ end
55
+ end
56
+
57
+ describe "it should retain the non-splitted key(s)" do
58
+ sample({
59
+ "events" => ["event 1", "event 2"],
60
+ "meta" => "common meta data",
61
+ "common" => { "more" => ["common", "data"] },
62
+ }) do
63
+ expect(subject.length).to eq(2)
64
+
65
+ expect(subject[0]["message"]).to eq("event 1")
66
+ expect(subject[0]["meta"]).to eq("common meta data")
67
+ expect(subject[0]["common"]).to eq({ "more" => ["common", "data"] })
68
+
69
+ expect(subject[1]["message"]).to eq("event 2")
70
+ expect(subject[1]["meta"]).to eq("common meta data")
71
+ expect(subject[1]["common"]).to eq({ "more" => ["common", "data"] })
72
+ end
73
+ end
74
+
75
+ describe "it should ignore empty event Arrays" do
76
+ sample({
77
+ "events" => [],
78
+ }) do
79
+ expect(subject).to eq(nil)
80
+ end
81
+ end
82
+
83
+ describe "it should ignore empty event contents" do
84
+ sample({
85
+ "events" => ["event 1", "event 2", "", nil, [], {}],
86
+ }) do
87
+ expect(subject.length).to eq(2)
88
+ end
89
+ end
90
+
91
+ it "should explode when \"events\" is not an Array" do
92
+ event = LogStash::Event.new("events" => "Not an Array")
93
+ filter = LogStash::Filters::NestedJsonSplit.new({})
94
+
95
+ expect do
96
+ filter.filter(event)
97
+ end.to raise_error(LogStash::ConfigurationError)
98
+ end
99
+ end
100
+
101
+ context "When using nested \"keys\"" do
102
+ config <<-CONFIG
103
+ filter {
104
+ nested_json_split {
105
+ keys => ["body", "events"]
106
+ }
107
+ }
108
+ CONFIG
109
+
110
+ describe "it should split \"events\" into \"message\"s" do
111
+ sample({
112
+ "body" => {
113
+ "events" => [
114
+ "first event",
115
+ "second event",
116
+ ],
117
+ },
118
+ }) do
119
+ expect(subject.length).to eq(2)
120
+
121
+ expect(subject[0]["message"]).to eq("first event")
122
+ expect(subject[1]["message"]).to eq("second event")
123
+ end
124
+ end
125
+
126
+ describe "it should discard the entire original top-level key" do
127
+ sample({
128
+ "body" => {
129
+ "events" => ["event 1", "event 2"],
130
+ },
131
+ }) do
132
+ expect(subject.length).to eq(2)
133
+
134
+ expect(subject[0]["body"]).to eq(nil)
135
+ expect(subject[1]["body"]).to eq(nil)
136
+ end
137
+ end
138
+
139
+ describe "it should retain the non-splitted key(s)" do
140
+ sample({
141
+ "body" => {
142
+ "events" => ["event 1", "event 2"],
143
+ },
144
+ "meta" => "common meta data",
145
+ "common" => { "more" => ["common", "data"] },
146
+ }) do
147
+ expect(subject.length).to eq(2)
148
+
149
+ expect(subject[0]["message"]).to eq("event 1")
150
+ expect(subject[0]["meta"]).to eq("common meta data")
151
+ expect(subject[0]["common"]).to eq({ "more" => ["common", "data"] })
152
+
153
+ expect(subject[1]["message"]).to eq("event 2")
154
+ expect(subject[1]["meta"]).to eq("common meta data")
155
+ expect(subject[1]["common"]).to eq({ "more" => ["common", "data"] })
156
+ end
157
+ end
158
+
159
+ it "should explode when the the inner nesting is not a Hash" do
160
+ event = LogStash::Event.new("body" => "Not a Hash")
161
+ filter = LogStash::Filters::NestedJsonSplit.new("keys" => ["body", "events"])
162
+
163
+ expect do
164
+ filter.filter(event)
165
+ end.to raise_error(LogStash::ConfigurationError)
166
+ end
167
+ end
168
+
169
+ context "When using a custom \"target\"" do
170
+ config <<-CONFIG
171
+ filter {
172
+ nested_json_split {
173
+ target => "event"
174
+ }
175
+ }
176
+ CONFIG
177
+
178
+ describe "it should split \"events\" into the \"target\" instead of \"message\"" do
179
+ sample({
180
+ "events" => [
181
+ "first event",
182
+ "second event",
183
+ ],
184
+ }) do
185
+ expect(subject.length).to eq(2)
186
+
187
+ expect(subject[0]["event"]).to eq("first event")
188
+ expect(subject[0]["message"]).to eq(nil)
189
+
190
+ expect(subject[1]["event"]).to eq("second event")
191
+ expect(subject[1]["message"]).to eq(nil)
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+
3
+ require "logstash/devutils/rspec/spec_helper"
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logstash-filter-nested_json_split
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ platform: ruby
6
+ authors:
7
+ - Niels Ganser <niels@herimedia.com>
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIGTzCCBDegAwIBAgIJAINVg3eI/0D7MA0GCSqGSIb3DQEBDQUAMIG9MQswCQYD
14
+ VQQGEwJERTEfMB0GA1UECAwWTm9ydGggUmhpbmUtV2VzdHBoYWxpYTEQMA4GA1UE
15
+ BwwHQ29sb2duZTEXMBUGA1UECgwOaGVyaW1lZGlhIGUuSy4xHDAaBgNVBAsME1J1
16
+ YnlHZW1zIFNpZ25pbmcgQ0ExGzAZBgNVBAMMEmdlbXMuaGVyaW1lZGlhLmNvbTEn
17
+ MCUGCSqGSIb3DQEJARYYaG9zdG1hc3RlckBoZXJpbWVkaWEuY29tMB4XDTE1MTIy
18
+ OTE4MTg0MFoXDTI1MTIyNjE4MTg0MFowgb0xCzAJBgNVBAYTAkRFMR8wHQYDVQQI
19
+ DBZOb3J0aCBSaGluZS1XZXN0cGhhbGlhMRAwDgYDVQQHDAdDb2xvZ25lMRcwFQYD
20
+ VQQKDA5oZXJpbWVkaWEgZS5LLjEcMBoGA1UECwwTUnVieUdlbXMgU2lnbmluZyBD
21
+ QTEbMBkGA1UEAwwSZ2Vtcy5oZXJpbWVkaWEuY29tMScwJQYJKoZIhvcNAQkBFhho
22
+ b3N0bWFzdGVyQGhlcmltZWRpYS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
23
+ ggIKAoICAQDPeKHaRVNcqcIWuwi+jtH64x/ZhvHu7l8kz5D2EacTepGYzJGGzfr+
24
+ NjMg+rbaIjYKQnJ+gdHCdN3r5EXrW+iaMqRB8bmktfQZq/yeSiHSdFFBDe1OGcz8
25
+ tum3X+Eou12PJ3/uAiMhogsbs1fDrasdkL774N9lqmpeBh9gTvgdKRLdJRblk2LU
26
+ oXv4GL9rtQa/1B1kpUPiyM8IA7CN/iI0XaOALbkB49hvJ+edVl6dou9LClNhd/5C
27
+ h5CHqG7ecySi92lOr6HlrkQa6/lZ/eSvvbmC6+II+tCyvmXckd3IyDEpr5V+qwP3
28
+ yBUbmH+2fkplPNY1inTVOlV71L3N06UtuuxIdtAGLXvltZ/E3AVW27uQHXjXwD8M
29
+ w+7vnwaXvHCZ7c6HCySFK/Yf1gOnYtwlGl9Rek8zM9VAse6EzQ4lIHj7zNcH9A1Z
30
+ vmvBXO1y6v7+PdKFM4fP8KCxwmtjn5X0MhyYao5cMIjndppXyUcViwBJ4K+/72Pv
31
+ HXWbQwcBVNVP8tjWxyx0tRfpzkwh0xPxWNTQPLEk1KVoWK3cMsubMQmNczSt31ZS
32
+ b3etova4lYote3MTCdkUILZFbhhmH0YBUau65EKj2zd6S6qs5N8eUtxpxb5U1Fio
33
+ K86ExIgWZAF4exi+dztDfN+7TLyX6gNCgV5rFb1DncMRPsPBu7cIaQIDAQABo1Aw
34
+ TjAdBgNVHQ4EFgQU07HolthJ2GougmAUe5wCGop8McMwHwYDVR0jBBgwFoAU07Ho
35
+ lthJ2GougmAUe5wCGop8McMwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOC
36
+ AgEAfAbk6Ypzvapek8AAINphl9PcIdBVbZ+0+VDxot/6EXn8r6gTPe3SWcHokYxO
37
+ Uatp+w9kiR+QGBDU2Y43mCQJeuAbUsnMUYL6JtAHM4A70EEQ/Rd1GLX2+UrbAE+r
38
+ eL5XpswSgyajZOSpJkGF+uKrKDhFZp8OEpUhBrw7QT5Qzf/4/8aWcWZkavsASL4W
39
+ DQxBUkVvkNbX5gHw/BHr9ZG+3PKDwvUcy5U6yRxkkBSCU+0ZmcYfrfOpF+yeq6dY
40
+ emIO7jq0f62DY8k6Ku/BTS03nCTMiwsjl2UHwsXe/P+iHd7D/O1Gyhj0ve5Tl2IU
41
+ ja1mmgl0i663tVpP/km1crCgjS5HnMWxe+VRvB6SmGwDSD1JIYGskGaL1X3EFkc5
42
+ HHGS4zKAtRrF2+F1qNtHckLtBcNDtzM4MOS3zI7CuqtDtwxc7+4YNDAcNO4wL6aw
43
+ GNZfGHIB2g6BQXHHKw0wO3oODNze5cCRp9M5rvzi8PmLg8RYY1lnHIezJdOwNyNY
44
+ gG7ThOBGl0JIwUpZllkXydrUh1t+/WvNy9HL3muyRPr+1IPHajQ2tX9IjmcyZlus
45
+ wzk3GasZ5kq6+crUf+Ad0aT/Zwv4zjHfYwxANM92+h2/YGAkzhZuSPCA3roE1Xti
46
+ 68OQ1G/L29aFRJ1xb7X1qoCYxbO0l1fIZ3LoDQl/v2V+nUo=
47
+ -----END CERTIFICATE-----
48
+ - |
49
+ -----BEGIN CERTIFICATE-----
50
+ MIIF6jCCA9ICCQCJetTjyY2WWDANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UEBhMC
51
+ REUxHzAdBgNVBAgMFk5vcnRoIFJoaW5lLVdlc3RwaGFsaWExEDAOBgNVBAcMB0Nv
52
+ bG9nbmUxFzAVBgNVBAoMDmhlcmltZWRpYSBlLksuMRwwGgYDVQQLDBNSdWJ5R2Vt
53
+ cyBTaWduaW5nIENBMRswGQYDVQQDDBJnZW1zLmhlcmltZWRpYS5jb20xJzAlBgkq
54
+ hkiG9w0BCQEWGGhvc3RtYXN0ZXJAaGVyaW1lZGlhLmNvbTAeFw0xNTEyMjkxODI3
55
+ NDNaFw0xNzEyMTAxODI3NDNaMIGvMQswCQYDVQQGEwJERTEfMB0GA1UECAwWTm9y
56
+ dGggUmhpbmUtV2VzdHBoYWxpYTEQMA4GA1UEBwwHQ29sb2duZTEXMBUGA1UECgwO
57
+ aGVyaW1lZGlhIGUuSy4xGTAXBgNVBAsMEFJ1YnlHZW1zIFNpZ25pbmcxFTATBgNV
58
+ BAMMDE5pZWxzIEdhbnNlcjEiMCAGCSqGSIb3DQEJARYTbmllbHNAaGVyaW1lZGlh
59
+ LmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAN7dnT6ukdcL/LYV
60
+ huhSDpEr4lXwo4J6DEnE1MgzC7x1SMD3hYiTDFc2UFfdIT7wK2JLpdI4IcNKIMKc
61
+ n067op9AXTM3P2hHQjF2BW4VA32jpPM/q/q4p/eMyZcNqOG/kCwc/5Vltvi2fSu7
62
+ efK0VOaaf3TPG7fVMlTAOMPdbEfi1pTvySE4/C6J4oB7VyjdBrEp+AHlxbQQF36B
63
+ T6fmYXEJ7nV0Ek+wSVm/6ZMiis0LwPInRDKwF2Rg/QYtVNQ8roRpwUsWSk1dvZtj
64
+ XPPdoh2b/ioXeEUUYRxLEqhr3cg7gqBZkAJdl+tL2zLN22ma5iHpLAj6ImaZ42eP
65
+ k3w2FlwbPnGy0viEdmiIc9H2iHB+uZEuX85clhYwSlvQdc4DRZ0//okywjQJMi/s
66
+ bEZdPTwO5QNUqX7FDzj3kuZE0E1WhnDwk0/0bDdO7uZ+GHeThgUcrUeRw7tWyX/l
67
+ NAmhUP0mxJFX8ljzTLzduYQn9vbkz2PPciRE15Z0d3NqOz9rkutzC6qYCDs4Newc
68
+ J/BEmDie1j/hGrZ/iqcOamj5wsYN0+QBwQMeEhsmOKwS7BpIaVAcZFra+itLV3ES
69
+ wPny70oNoIVSHd6hPT0sO5cGtIPF/uZB7tlIqdoPSrh6XlqOognsECtJ4CYHDwJk
70
+ ljzd49aUIfkbIY4QPxspsJjXXBWNAgMBAAEwDQYJKoZIhvcNAQELBQADggIBAE0Y
71
+ fltgbGwPgllP342U8G56pRxnfxcp1uTVM5s2Jwwx2ctWPP+l6/CeA61mwat7D+98
72
+ 5/brbOO+HfBE/ex4LTZ7M+cxUeVSvTvQ2YZmB7dkVZmGC+oXMnAUNJRwtVUuAR0q
73
+ 2lwpZKYXXPdJTiyvFqVWeODitHwPgova5ksqa1XCs6E2F52DxCBxMzFiCyenZ5F9
74
+ M0I/zGRNmoU45XA6U+g8ac38iGLjQAPF84DiqR1h7Su2AppcX1oDDp5LYwvizciy
75
+ oQ5UqbtHgfKHAq65eSy78yptihC1eh5tlfK8vKAXocbmRLfIU2C2FSVf5js1va1Y
76
+ D34h0oZWh5Zf7WFsYzj0bRvTqYTaV8NHUYY4gb4FMuiZTkslOKYFx/FT/PHAO7qc
77
+ 0zqPl3QcQFU1RMc7gA+M4+2MsKRMwrVhdLZ+5Ry5TWjIdBIUxnvoyYpzUBIzal5d
78
+ oNl1oBm3nI6HAJPJqY68rxsviltS7WNmPvqWx3GA1RBtwLc3OzPxALl/GJu+2AEo
79
+ /k613Kz++5fymheb5fsuDGxXizJawsfc6hNC7LLWBBeNl1obR3cskYWlRa3tT8Mm
80
+ P4v0NuZns53pFGSNLG4C2JXOGPYHVi5f0lhd4c7iDPXRuMbWzhFgAoUGRxWxl2Au
81
+ 818+taWKWQ4yT3JhOXis+aEXzFmjrzYw5Gxy05CI
82
+ -----END CERTIFICATE-----
83
+ date: 2015-12-29 00:00:00.000000000 Z
84
+ dependencies:
85
+ - !ruby/object:Gem::Dependency
86
+ name: logstash-devutils
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ prerelease: false
98
+ type: :development
99
+ - !ruby/object:Gem::Dependency
100
+ name: logstash-core
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 2.0.0
106
+ - - "<"
107
+ - !ruby/object:Gem::Version
108
+ version: 3.0.0
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 2.0.0
114
+ - - "<"
115
+ - !ruby/object:Gem::Version
116
+ version: 3.0.0
117
+ prerelease: false
118
+ type: :runtime
119
+ 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.
120
+ email: niels@herimedia.com
121
+ executables: []
122
+ extensions: []
123
+ extra_rdoc_files: []
124
+ files:
125
+ - CHANGELOG.md
126
+ - Gemfile
127
+ - LICENSE
128
+ - README.md
129
+ - lib/logstash/filters/nested_json_split.rb
130
+ - logstash-filter-nested_json_split.gemspec
131
+ - spec/filters/nested_json_split_spec.rb
132
+ - spec/spec_helper.rb
133
+ homepage: http://www.elastic.co/guide/en/logstash/current/index.html
134
+ licenses:
135
+ - Apache License (2.0)
136
+ metadata:
137
+ logstash_plugin: 'true'
138
+ logstash_group: filter
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.4.8
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: This nested_json_split filter splits an Array in a nested Hash / JSON object into multiple individual events.
159
+ test_files:
160
+ - spec/filters/nested_json_split_spec.rb
161
+ - spec/spec_helper.rb
metadata.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ �;H�b�M�%P��e�7��L�1ٓb�iMD�٪���z�D�.��/��nߟ$�]a�#ޕ��k����&sOۈc-ʼ85�|�.���!5Z�`��C^z# ! h&���H���S�A�jd�x$W���^�p��>k2��k1}.�@0D�l
2
+ vO���ା������($?�5���5���� ;�ǽ�%t3�iK�a�^,}�����٦t���Cx
3
+ �\���s`S���"�;U�����z