logstash-filter-rest 0.1.6 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3831712120e49fe2fc5f76a125bf0fd36d2b3779
4
- data.tar.gz: 5e66b534d403ef9e70005a703efc92dc98ee242c
3
+ metadata.gz: 70cf7db34fec1104a8eb742ce5633c11769a66d5
4
+ data.tar.gz: c265edbd76879148168331adc875befb458ec0a6
5
5
  SHA512:
6
- metadata.gz: b65e31422305236f2e59e3511823e42a28c09a5ca3400aa73ab9bceaed85e05d6f60fc3ad293888de62574bd91dc64220079a43fd1f7463cd9e8e72ce6a030a3
7
- data.tar.gz: f38a4d7b09b5eb816acce96bf72fe194a8899c538899014fde2a04eb63deb82fa291ed5d6bbc03c117ec8830fed18e778011d54e1e116a15e19775c521d5e333
6
+ metadata.gz: fac6c51358cd5cd6e9990807f03b169aeca591ea828c11f1b718b39639e99770edd534f896aa0b0ec1da8ed3e441d7807f34f8cfdf26e1403c75d73eeeaddbcd
7
+ data.tar.gz: 70a3d59b3d30ebc070e715f97be104c4e2161b59405b5ac488963a78d1eb8b400dd7b1d71025c8d382ca52d34d13de56401331793089a37d200c9d85872d5e86
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Logstash REST Filter
1
+ # Logstash REST Filter [![Build Status](https://travis-ci.org/gandalfb/logstash-filter-rest.svg?branch=http-keep-alive)](https://travis-ci.org/gandalfb/logstash-filter-rest)
2
2
 
3
3
  This is a filter plugin for [Logstash](https://github.com/elasticsearch/logstash).
4
4
 
@@ -27,22 +27,33 @@ $LS_HOME/bin/plugin install logstash-filter-rest-0.1.0.gem
27
27
  Add the following inside the filter section of your logstash configuration:
28
28
 
29
29
  ```sh
30
- rest {
31
- url => "http://example.com" # string (required, with field reference: "http://example.com?id=%{id}")
32
- json => true # boolean (optional, default = false)
33
- method => "post" # string (optional, default = "get")
34
- sprintf => true # boolean (optional, default = false, set this to true if you want to use field references in url, header or params)
35
- header => { # hash (optional)
36
- "key1" => "value1"
37
- "key2" => "value2"
38
- "key3" => "%{somefield}" # Please set sprintf to true if you want to use field references
30
+ filter {
31
+ rest {
32
+ request => {
33
+ url => "http://example.com" # string (required, with field reference: "http://example.com?id=%{id}" or params, if defined)
34
+ method => "post" # string (optional, default = "get")
35
+ headers => { # hash (optional)
36
+ "key1" => "value1"
37
+ "key2" => "value2"
38
+ }
39
+ auth => {
40
+ user => "AzureDiamond"
41
+ password => "hunter2"
42
+ }
43
+ params => { # hash (optional, available for method => "get" and "post"; if post it will be transformed into body hash and posted as json)
44
+ "key1" => "value1"
45
+ "key2" => "value2"
46
+ "key3" => "%{somefield}" # Please set sprintf to true if you want to use field references
47
+ }
48
+ }
49
+ json => true # boolean (optional, default = false)
50
+ sprintf => true # boolean (optional, default = false, set this to true if you want to use field references in url, header or params)
51
+ target => "my_key" # string (optional, default = "rest_response")
52
+ fallback => { # hash describing a default in case of error
53
+ "key1" => "value1"
54
+ "key2" => "value2"
55
+ }
39
56
  }
40
- params => { # hash (optional, only available for method => "post")
41
- "key1" => "value1"
42
- "key2" => "value2"
43
- "key3" => "%{somefield}" # Please set sprintf to true if you want to use field references
44
- }
45
- response_key => "my_key" # string (optional, default = "rest_response")
46
57
  }
47
58
  ```
48
59
 
@@ -1,105 +1,234 @@
1
1
  # encoding: utf-8
2
- require "logstash/filters/base"
3
- require "logstash/namespace"
4
- require "json"
5
- require "rest_client"
2
+ require 'logstash/filters/base'
3
+ require 'logstash/namespace'
4
+ require 'logstash/plugin_mixins/http_client'
5
+ require 'logstash/json'
6
6
 
7
7
  # Logstash REST Filter
8
8
  # This filter calls a defined URL and saves the answer into a specified field.
9
9
  #
10
10
  class LogStash::Filters::Rest < LogStash::Filters::Base
11
+ include LogStash::PluginMixins::HttpClient
11
12
 
12
- # Usage:
13
+ config_name 'rest'
14
+
15
+ # Configure the rest request send via HttpClient Plugin
16
+ # with hash objects used by the mixin plugin
17
+ #
18
+ # For example, if you want the data to be put in the `doc` field:
19
+ # [source,ruby]
20
+ # filter {
21
+ # rest {
22
+ # request => {
23
+ # url => "http://example.com" # string (required, with field reference: "http://example.com?id=%{id}" or params, if defined)
24
+ # method => "post" # string (optional, default = "get")
25
+ # headers => { # hash (optional)
26
+ # "key1" => "value1"
27
+ # "key2" => "value2"
28
+ # }
29
+ # auth => {
30
+ # user => "AzureDiamond"
31
+ # password => "hunter2"
32
+ # }
33
+ # params => { # hash (optional, available for method => "get" and "post"; if post it will be transformed into body hash and posted as json)
34
+ # "key1" => "value1"
35
+ # "key2" => "value2"
36
+ # "key3" => "%{somefield}" # Please set sprintf to true if you want to use field references
37
+ # }
38
+ # }
39
+ # }
40
+ # }
41
+ #
42
+ # NOTE: for further details, please reference https://github.com/logstash-plugins/logstash-mixin-http_client[logstash-mixin-http_client]
43
+ config :request, :validate => :hash, :required => true
44
+
45
+ # The plugin is written json centric, which defaults to true
46
+ # the response body will be parsed to json if true
13
47
  #
14
- # rest {
15
- # url => "http://example.com" # string (required, with field reference: "http://example.com?id=%{id}")
16
- # json => true # boolean (optional, default = false)
17
- # method => "post" # string (optional, default = "get")
18
- # sprintf => true # boolean (optional, default = false, set this to true if you want to use field references in url, header or params)
19
- # header => { # hash (optional)
20
- # "key1" => "value1"
21
- # "key2" => "value2"
22
- # "key3" => "%{somefield}" # Please set sprintf to true if you want to use field references
23
- # }
24
- # params => { # hash (optional, only available for method => "post")
25
- # "key1" => "value1"
26
- # "key2" => "value2"
27
- # "key3" => "%{somefield}" # Please set sprintf to true if you want to use field references
28
- # }
29
- # response_key => "my_key" # string (optional, default = "rest_response")
30
- # }
48
+ # [source,ruby]
49
+ # filter {
50
+ # rest {
51
+ # request => { .. }
52
+ # json => true
53
+ # }
54
+ # }
55
+ config :json, :validate => :boolean, :default => true
56
+
57
+ # If true, references to event fields can be made in
58
+ # url, params or body by using '%{somefield}'
31
59
  #
32
-
33
- config_name "rest"
34
-
35
- config :url, :validate => :string, :required => true
36
- config :method, :validate => :string, :default => "get"
37
- config :json, :validate => :boolean, :default => false
60
+ # [source,ruby]
61
+ # filter {
62
+ # rest {
63
+ # request => { .. }
64
+ # sprintf => true
65
+ # }
66
+ # }
38
67
  config :sprintf, :validate => :boolean, :default => false
39
- config :header, :validate => :hash, :default => { }
40
- config :params, :validate => :hash, :default => { }
41
- config :response_key, :validate => :string, :default => "rest_response"
68
+
69
+ # Defines the field, where the parsed response is written to
70
+ # if set to '' it will be written to event root
71
+ #
72
+ # For example, if you want the data to be put in the `doc` field:
73
+ # [source,ruby]
74
+ # filter {
75
+ # rest {
76
+ # request => { .. }
77
+ # target => "doc"
78
+ # }
79
+ # }
80
+ #
81
+ # NOTE: if the `target` field already exists, it will be overwritten!
82
+ config :target, :validate => :string, :default => 'rest'
83
+
84
+ # If set, any error like json parsing or invalid http response
85
+ # will result in this hash to be added to target instead of error tags
86
+ #
87
+ # For example, if you want the fallback data to be put in the `target` field:
88
+ # [source,ruby]
89
+ # filter {
90
+ # rest {
91
+ # request => { .. }
92
+ # fallback => {
93
+ # 'key1' => 'value1'
94
+ # 'key2' => 'value2'
95
+ # ...
96
+ # }
97
+ # }
98
+ # }
99
+ config :fallback, :validate => :hash, :default => {}
100
+
101
+ # Append values to the `tags` field when there has been no
102
+ # successful match or json parsing error
103
+ config :tag_on_rest_failure, :validate => :array, :default => ['_restfailure']
104
+ config :tag_on_json_failure, :validate => :array, :default => ['_jsonparsefailure']
42
105
 
43
106
  public
44
- def register
45
107
 
108
+ def register
109
+ @request = normalize_request(@request)
46
110
  end # def register
47
111
 
112
+ private
113
+
114
+ def normalize_request(url_or_spec)
115
+ if url_or_spec.is_a?(String)
116
+ res = [:get, url_or_spec]
117
+ elsif url_or_spec.is_a?(Hash)
118
+ # The client will expect keys / values
119
+ spec = Hash[url_or_spec.clone.map { |k, v| [k.to_sym, v] }]
120
+
121
+ # method and url aren't really part of the options, so we pull them out
122
+ method = (spec.delete(:method) || :get).to_sym.downcase
123
+ url = spec.delete(:url)
124
+
125
+ # if it is a post and json, it is used as body string, not params
126
+ spec[:body] = spec.delete(:params) if method == :post
127
+
128
+ # We need these strings to be keywords!
129
+ spec[:auth] = { user: spec[:auth]['user'], pass: spec[:auth]['password'] } if spec[:auth]
130
+
131
+ res = [method, url, spec]
132
+ else
133
+ raise LogStash::ConfigurationError, "Invalid URL or request spec: '#{url_or_spec}', expected a String or Hash!"
134
+ end
135
+
136
+ validate_request!(url_or_spec, res)
137
+ res
138
+ end
139
+
140
+ private
141
+
142
+ def validate_request!(url_or_spec, request)
143
+ method, url, spec = request
144
+
145
+ raise LogStash::ConfigurationError, "No URL provided for request! #{url_or_spec}" unless url
146
+ raise LogStash::ConfigurationError, "Not supported request method #{method}" unless [ :get, :post ].include?( method )
147
+
148
+ if spec && spec[:auth]
149
+ raise LogStash::ConfigurationError, "Auth was specified, but 'user' was not!" unless spec[:auth][:user]
150
+ raise LogStash::ConfigurationError, "Auth was specified, but 'password' was not!" unless spec[:auth][:pass]
151
+ end
152
+
153
+ request
154
+ end
155
+
156
+ private
157
+
158
+ def request_http(request)
159
+ @logger.debug? && @logger.debug('Fetching URL', :request => request)
160
+
161
+ request[2][:body] = LogStash::Json.dump(request[2][:body]) if request[2].key?(:body)
162
+
163
+ method, url, *request_opts = request
164
+ response = client.http(method, url, *request_opts)
165
+ [response.code, response.body]
166
+ end
167
+
168
+ private
169
+
170
+ def process_response(response, event)
171
+ if @json
172
+ begin
173
+ parsed = LogStash::Json.load(response)
174
+ event = add_to_event(parsed, event)
175
+ rescue
176
+ if @fallback.empty?
177
+ @tag_on_json_failure.each { |tag| event.tag(tag) }
178
+ @logger.warn('JSON parsing error', :response => response, :event => event)
179
+ else
180
+ event = add_to_event(@fallback, event)
181
+ end
182
+ end
183
+ else
184
+ event.set(@target, response.strip)
185
+ end
186
+ event
187
+ end
188
+
48
189
  public
190
+
49
191
  def filter(event)
50
192
  return unless filter?(event)
51
- begin
52
- case method
53
- when "get"
54
- response = RestClient.get sprint(@sprintf, @url, event), sprint(@sprintf, @header, event)
55
- when "post"
56
- response = RestClient.post sprint(@sprintf, @url, event), sprint(@sprintf, @params, event), sprint(@sprintf, @header, event)
57
- else
58
- response = "invalid method"
59
- @logger.error("Invalid method:", :method => method)
60
- end
61
-
62
- if json == true
63
- begin
64
- h = JSON.parse(response)
65
- if response_key == ""
66
- h.each do |key, value|
67
- event[key] = value
68
- end
69
- else
70
- event[response_key] = { }
71
- event[response_key] = h
72
- end
73
- rescue
74
- event['jsonerror'] = "unable to parse json"
75
- end
76
- else
77
- event[@response_key] = response.strip
78
- end
79
- rescue
80
- @logger.error("Error in Rest Filter. Parameters:", :url => url, :method => method, :json => json, :header => header, :params => params)
81
- @logger.error("Rest Error Message:", :message => $!.message)
82
- @logger.error("Backtrace:", :backtrace => $!.backtrace)
83
- event['resterror'] = "Rest Filter Error. Please see Logstash Error Log for further information."
84
- end
85
-
86
- filter_matched(event)
193
+ @request[2][:params] = sprint(@sprintf, @request[2][:params], event) if @request[2].key?(:params)
194
+ @request[2][:body] = sprint(@sprintf, @request[2][:body], event) if @request[2].key?(:body)
195
+ @request[1] = sprint(@sprintf, @request[1], event)
196
+
197
+ code, body = request_http(@request)
198
+ if code.between?(200, 299)
199
+ event = process_response(body, event)
200
+ @logger.debug? && @logger.debug('Sucess received', :code => code, :body => body)
201
+ else
202
+ @logger.debug? && @logger.debug('Http error received', :code => code, :body => body)
203
+ if @fallback.empty?
204
+ @tag_on_rest_failure.each { |tag| event.tag(tag) }
205
+ @logger.error('Error in Rest filter', :request => @request, :json => @json, :code => code, :body => body)
206
+ else
207
+ event = add_to_event(@fallback, event)
208
+ @logger.debug? && @logger.debug('Setting fallback', :fallback => @fallback)
209
+ end
210
+ end
211
+ filter_matched(event)
87
212
  end # def filter
88
-
213
+
214
+ private
215
+
89
216
  def sprint(sprintf, hash, event)
90
- if sprintf
91
- if hash.class == Hash
92
- result = { }
93
- hash.each do |key, value|
94
- result[key] = event.sprintf(value)
95
- end
96
- return result
97
- else
98
- return event.sprintf(hash)
99
- end
100
- else
101
- return hash
102
- end
217
+ return hash unless sprintf
218
+ return event.sprintf(hash) unless hash.is_a?(Hash)
219
+ result = {}
220
+ hash.each { |k, v| result[k] = event.sprintf(v) }
221
+ result
103
222
  end
104
223
 
224
+ private
225
+
226
+ def add_to_event(to_add, event)
227
+ if @target.empty?
228
+ to_add.each { |k, v| event[k] = v }
229
+ else
230
+ event[@target] = to_add
231
+ end
232
+ event
233
+ end
105
234
  end # class LogStash::Filters::Rest
@@ -1,25 +1,27 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-filter-rest'
3
- s.version = '0.1.6'
3
+ s.version = '0.2.0'
4
4
  s.licenses = ['Apache License (2.0)']
5
- s.summary = "This filter requests data from a RESTful Web Service."
6
- 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"
7
- s.authors = ["Lucas Henning"]
5
+ s.summary = 'This filter requests data from a RESTful Web Service.'
6
+ 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'
7
+ s.authors = ['Lucas Henning', 'Gandalf Buscher']
8
8
  s.email = 'mail@hurb.de'
9
- s.homepage = "https://github.com/lucashenning/logstash-filter-rest/"
10
- s.require_paths = ["lib"]
9
+ s.homepage = 'https://github.com/lucashenning/logstash-filter-rest/'
10
+ s.require_paths = ['lib']
11
11
 
12
12
  # Files
13
- s.files = `git ls-files`.split($\)
14
- # Tests
13
+ s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
14
+ # Tests
15
15
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
16
16
 
17
17
  # Special flag to let us know this is actually a logstash plugin
18
- s.metadata = { "logstash_plugin" => "true", "logstash_group" => "filter" }
18
+ s.metadata = { 'logstash_plugin' => 'true', 'logstash_group' => 'filter' }
19
19
 
20
20
  # Gem dependencies
21
- s.add_runtime_dependency "logstash-core", '>= 1.5.0', '< 3.0.0'
22
- s.add_runtime_dependency "rest-client", '>= 1.8.0'
23
- s.add_runtime_dependency 'logstash-codec-json'
24
- s.add_development_dependency 'logstash-devutils'
21
+ s.add_runtime_dependency 'logstash-core', '>= 1.6.0', '< 3.0.0'
22
+ s.add_runtime_dependency 'logstash-codec-json', '>= 1.6.0', '< 3.0.0'
23
+ s.add_runtime_dependency 'logstash-mixin-http_client', '>= 2.2.4', '< 5.0.0'
24
+
25
+ s.add_development_dependency 'logstash-devutils', '~> 0'
26
+ s.add_development_dependency 'pry', '~> 0'
25
27
  end
@@ -1,12 +1,14 @@
1
1
  require 'spec_helper'
2
- require "logstash/filters/rest"
2
+ require 'logstash/filters/rest'
3
3
 
4
4
  describe LogStash::Filters::Rest do
5
- describe "Set to Rest Filter" do
5
+ describe "Set to Rest Filter Get without params" do
6
6
  let(:config) do <<-CONFIG
7
7
  filter {
8
8
  rest {
9
- url => "http://jsonplaceholder.typicode.com/users/1"
9
+ request => {
10
+ url => "http://jsonplaceholder.typicode.com/users/10"
11
+ }
10
12
  json => true
11
13
  }
12
14
  }
@@ -14,8 +16,250 @@ describe LogStash::Filters::Rest do
14
16
  end
15
17
 
16
18
  sample("message" => "some text") do
17
- expect(subject).to include("rest_response")
18
- expect(subject['rest_response']).to include("id")
19
+ expect(subject).to include('rest')
20
+ expect(subject['rest']).to include("id")
21
+ expect(subject['rest']['id']).to eq(10)
22
+ expect(subject['rest']).to_not include("fallback")
23
+ end
24
+ end
25
+ describe "Set to Rest Filter Get without params custom target" do
26
+ let(:config) do <<-CONFIG
27
+ filter {
28
+ rest {
29
+ request => {
30
+ url => "http://jsonplaceholder.typicode.com/users/10"
31
+ }
32
+ json => true
33
+ target => 'testing'
34
+ }
35
+ }
36
+ CONFIG
37
+ end
38
+
39
+ sample("message" => "some text") do
40
+ expect(subject).to include('testing')
41
+ expect(subject['testing']).to include("id")
42
+ expect(subject['testing']['id']).to eq(10)
43
+ expect(subject['testing']).to_not include("fallback")
44
+ end
45
+ end
46
+ describe "Set to Rest Filter Get without params and sprintf" do
47
+ let(:config) do <<-CONFIG
48
+ filter {
49
+ rest {
50
+ request => {
51
+ url => "http://jsonplaceholder.typicode.com/users/%{message}"
52
+ }
53
+ json => true
54
+ sprintf => true
55
+ }
56
+ }
57
+ CONFIG
58
+ end
59
+
60
+ sample("message" => "10") do
61
+ expect(subject).to include('rest')
62
+ expect(subject['rest']).to include("id")
63
+ expect(subject['rest']['id']).to eq(10)
64
+ expect(subject['rest']).to_not include("fallback")
65
+ end
66
+ end
67
+ describe "Set to Rest Filter Get without params http error" do
68
+ let(:config) do <<-CONFIG
69
+ filter {
70
+ rest {
71
+ request => {
72
+ url => "http://httpstat.us/404"
73
+ }
74
+ json => true
75
+ }
76
+ }
77
+ CONFIG
78
+ end
79
+
80
+ sample("message" => "some text") do
81
+ expect(subject).to_not include('rest')
82
+ expect(subject['tags']).to include('_restfailure')
83
+ end
84
+ end
85
+ describe "Set to Rest Filter Get with params" do
86
+ let(:config) do <<-CONFIG
87
+ filter {
88
+ rest {
89
+ request => {
90
+ url => "https://jsonplaceholder.typicode.com/posts"
91
+ params => {
92
+ userId => 10
93
+ }
94
+ headers => {
95
+ "Content-Type" => "application/json"
96
+ }
97
+ }
98
+ json => true
99
+ }
100
+ }
101
+ CONFIG
102
+ end
103
+
104
+ sample("message" => "some text") do
105
+ expect(subject).to include('rest')
106
+ expect(subject['rest'][0]).to include("userId")
107
+ expect(subject['rest'][0]['userId']).to eq(10)
108
+ expect(subject['rest']).to_not include("fallback")
109
+ end
110
+ end
111
+ describe "Set to Rest Filter Get with params sprintf" do
112
+ let(:config) do <<-CONFIG
113
+ filter {
114
+ rest {
115
+ request => {
116
+ url => "https://jsonplaceholder.typicode.com/posts"
117
+ params => {
118
+ userId => "%{message}"
119
+ }
120
+ headers => {
121
+ "Content-Type" => "application/json"
122
+ }
123
+ }
124
+ json => true
125
+ sprintf => true
126
+ }
127
+ }
128
+ CONFIG
129
+ end
130
+
131
+ sample("message" => "10") do
132
+ expect(subject).to include('rest')
133
+ expect(subject['rest'][0]).to include("userId")
134
+ expect(subject['rest'][0]['userId']).to eq(10)
135
+ expect(subject['rest']).to_not include("fallback")
136
+ end
137
+ end
138
+ describe "Set to Rest Filter Post with params" do
139
+ let(:config) do <<-CONFIG
140
+ filter {
141
+ rest {
142
+ request => {
143
+ url => "https://jsonplaceholder.typicode.com/posts"
144
+ method => "post"
145
+ params => {
146
+ title => 'foo'
147
+ body => 'bar'
148
+ userId => 42
149
+ }
150
+ headers => {
151
+ "Content-Type" => "application/json"
152
+ }
153
+ }
154
+ json => true
155
+ }
156
+ }
157
+ CONFIG
158
+ end
159
+
160
+ sample("message" => "some text") do
161
+ expect(subject).to include('rest')
162
+ expect(subject['rest']).to include("id")
163
+ expect(subject['rest']['userId']).to eq(42)
164
+ expect(subject['rest']).to_not include("fallback")
165
+ end
166
+ end
167
+ describe "Set to Rest Filter Post with params sprintf" do
168
+ let(:config) do <<-CONFIG
169
+ filter {
170
+ rest {
171
+ request => {
172
+ url => "https://jsonplaceholder.typicode.com/posts"
173
+ method => "post"
174
+ params => {
175
+ title => 'foo'
176
+ body => 'bar'
177
+ userId => "%{message}"
178
+ }
179
+ headers => {
180
+ "Content-Type" => "application/json"
181
+ }
182
+ }
183
+ json => true
184
+ sprintf => true
185
+ }
186
+ }
187
+ CONFIG
188
+ end
189
+
190
+ sample("message" => "42") do
191
+ expect(subject).to include('rest')
192
+ expect(subject['rest']).to include("id")
193
+ expect(subject['rest']['userId']).to eq(42)
194
+ expect(subject['rest']).to_not include("fallback")
195
+ end
196
+ end
197
+ describe "Fallback" do
198
+ let(:config) do <<-CONFIG
199
+ filter {
200
+ rest {
201
+ request => {
202
+ url => "http://jsonplaceholder.typicode.com/users/0"
203
+ }
204
+ json => true
205
+ fallback => {
206
+ "fallback1" => true
207
+ "fallback2" => true
208
+ }
209
+ }
210
+ }
211
+ CONFIG
212
+ end
213
+
214
+ sample("message" => "some text") do
215
+ expect(subject).to include('rest')
216
+ expect(subject['rest']).to include("fallback1")
217
+ expect(subject['rest']).to include("fallback2")
218
+ expect(subject['rest']).to_not include("id")
219
+ end
220
+ end
221
+ describe "Fallback empty target" do
222
+ let(:config) do <<-CONFIG
223
+ filter {
224
+ rest {
225
+ request => {
226
+ url => "http://jsonplaceholder.typicode.com/users/0"
227
+ }
228
+ json => true
229
+ target => ''
230
+ fallback => {
231
+ "fallback1" => true
232
+ "fallback2" => true
233
+ }
234
+ }
235
+ }
236
+ CONFIG
237
+ end
238
+
239
+ sample("message" => "some text") do
240
+ expect(subject).to_not include('rest')
241
+ expect(subject).to include("fallback1")
242
+ expect(subject).to include("fallback2")
243
+ expect(subject).to_not include("id")
244
+ end
245
+ end
246
+ describe "Empty target" do
247
+ let(:config) do <<-CONFIG
248
+ filter {
249
+ rest {
250
+ request => {
251
+ url => "http://jsonplaceholder.typicode.com/users/1"
252
+ }
253
+ json => true
254
+ target => ''
255
+ }
256
+ }
257
+ CONFIG
258
+ end
259
+
260
+ sample("message" => "some text") do
261
+ expect(subject).to include("id")
262
+ expect(subject).to_not include("fallback")
19
263
  end
20
264
  end
21
265
  end
data/spec/spec_helper.rb CHANGED
@@ -1 +1,2 @@
1
- require "logstash/devutils/rspec/spec_helper"
1
+ require 'logstash/devutils/rspec/spec_helper'
2
+ require 'pry'
metadata CHANGED
@@ -1,77 +1,104 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Henning
8
+ - Gandalf Buscher
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-04-08 00:00:00.000000000 Z
12
+ date: 2016-08-20 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 3.0.0
14
23
  name: logstash-core
24
+ prerelease: false
25
+ type: :runtime
15
26
  version_requirements: !ruby/object:Gem::Requirement
16
27
  requirements:
17
- - - '>='
28
+ - - ">="
18
29
  - !ruby/object:Gem::Version
19
- version: 1.5.0
20
- - - <
30
+ version: 1.6.0
31
+ - - "<"
21
32
  - !ruby/object:Gem::Version
22
33
  version: 3.0.0
34
+ - !ruby/object:Gem::Dependency
23
35
  requirement: !ruby/object:Gem::Requirement
24
36
  requirements:
25
- - - '>='
37
+ - - ">="
26
38
  - !ruby/object:Gem::Version
27
- version: 1.5.0
28
- - - <
39
+ version: 1.6.0
40
+ - - "<"
29
41
  - !ruby/object:Gem::Version
30
42
  version: 3.0.0
43
+ name: logstash-codec-json
31
44
  prerelease: false
32
45
  type: :runtime
33
- - !ruby/object:Gem::Dependency
34
- name: rest-client
35
46
  version_requirements: !ruby/object:Gem::Requirement
36
47
  requirements:
37
- - - '>='
48
+ - - ">="
38
49
  - !ruby/object:Gem::Version
39
- version: 1.8.0
50
+ version: 1.6.0
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: 3.0.0
54
+ - !ruby/object:Gem::Dependency
40
55
  requirement: !ruby/object:Gem::Requirement
41
56
  requirements:
42
- - - '>='
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 2.2.4
60
+ - - "<"
43
61
  - !ruby/object:Gem::Version
44
- version: 1.8.0
62
+ version: 5.0.0
63
+ name: logstash-mixin-http_client
45
64
  prerelease: false
46
65
  type: :runtime
47
- - !ruby/object:Gem::Dependency
48
- name: logstash-codec-json
49
66
  version_requirements: !ruby/object:Gem::Requirement
50
67
  requirements:
51
- - - '>='
68
+ - - ">="
52
69
  - !ruby/object:Gem::Version
53
- version: '0'
70
+ version: 2.2.4
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: 5.0.0
74
+ - !ruby/object:Gem::Dependency
54
75
  requirement: !ruby/object:Gem::Requirement
55
76
  requirements:
56
- - - '>='
77
+ - - "~>"
57
78
  - !ruby/object:Gem::Version
58
79
  version: '0'
59
- prerelease: false
60
- type: :runtime
61
- - !ruby/object:Gem::Dependency
62
80
  name: logstash-devutils
81
+ prerelease: false
82
+ type: :development
63
83
  version_requirements: !ruby/object:Gem::Requirement
64
84
  requirements:
65
- - - '>='
85
+ - - "~>"
66
86
  - !ruby/object:Gem::Version
67
87
  version: '0'
88
+ - !ruby/object:Gem::Dependency
68
89
  requirement: !ruby/object:Gem::Requirement
69
90
  requirements:
70
- - - '>='
91
+ - - "~>"
71
92
  - !ruby/object:Gem::Version
72
93
  version: '0'
94
+ name: pry
73
95
  prerelease: false
74
96
  type: :development
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
75
102
  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
76
103
  email: mail@hurb.de
77
104
  executables: []
@@ -82,7 +109,6 @@ files:
82
109
  - Gemfile
83
110
  - LICENSE
84
111
  - README.md
85
- - Rakefile
86
112
  - lib/logstash/filters/rest.rb
87
113
  - logstash-filter-rest.gemspec
88
114
  - spec/filters/rest_spec.rb
@@ -99,17 +125,17 @@ require_paths:
99
125
  - lib
100
126
  required_ruby_version: !ruby/object:Gem::Requirement
101
127
  requirements:
102
- - - '>='
128
+ - - ">="
103
129
  - !ruby/object:Gem::Version
104
130
  version: '0'
105
131
  required_rubygems_version: !ruby/object:Gem::Requirement
106
132
  requirements:
107
- - - '>='
133
+ - - ">="
108
134
  - !ruby/object:Gem::Version
109
135
  version: '0'
110
136
  requirements: []
111
137
  rubyforge_project:
112
- rubygems_version: 2.4.6
138
+ rubygems_version: 2.6.4
113
139
  signing_key:
114
140
  specification_version: 4
115
141
  summary: This filter requests data from a RESTful Web Service.
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "logstash/devutils/rake"