logstash-input-http_poller 2.1.0 → 3.0.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: 791035a6079e584fae5b891675e5e17225405a70
4
- data.tar.gz: 8286793c8788fc5af3c0d90ee10f613d49933e25
3
+ metadata.gz: 7c10834cd3780892bc9232ffb268b691d9f19d0e
4
+ data.tar.gz: d01112b2050202711def2a766c2d993bb4ebab66
5
5
  SHA512:
6
- metadata.gz: 95894f281b1440dd9c07bdf4790a2bf3017791c9c1f038a14b735637cb7a9b28db992c4e30898f29b37bbd158b51bc61ed159ad2d7fdbf5d2b68a45fac8303c3
7
- data.tar.gz: 2b93713dad3146739aaed0a0b7ba838381d8e7b46ef9fa9a2a217e83d40b063d9ce4a04221c9d5697542aab77960572e8bbe7274776a1d416d30b8035b0b0be7
6
+ metadata.gz: 3e19ccee8c2c9ef27489ce79fa020784d0b6f348aea0ff90921f80050ab709dcec8e96f94792c5b3b39ea7c69e844430969598043060ef3ae34c383ac1145d31
7
+ data.tar.gz: c292ca93af6d0ded87971e2f3cb529b48e1fbd401c9a6abdab762c588f5e1bbc5e8a959d38d0c8737066d1714470821c504e5a66d446d1c75cd02dc19adbea19
data/CHANGELOG.md CHANGED
@@ -1,3 +1,5 @@
1
+ ## 3.0.0
2
+ - Update the plugin to the version 2.0 of the plugin api, this change is required for Logstash 5.0 compatibility. See https://github.com/elastic/logstash/issues/5141
1
3
  # 2.0.5
2
4
  - Depend on logstash-core-plugin-api instead of logstash-core, removing the need to mass update plugins on major releases of logstash
3
5
  # 2.0.4
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
1
  source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in logstash-mass_effect.gemspec
2
4
  gemspec
@@ -4,7 +4,6 @@ require "logstash/namespace"
4
4
  require "logstash/plugin_mixins/http_client"
5
5
  require "socket" # for Socket.gethostname
6
6
  require "manticore"
7
- require "rufus/scheduler"
8
7
 
9
8
  # This Logstash input plugin allows you to call an HTTP API, decode the output of it into event(s), and
10
9
  # send them on their merry way. The idea behind this plugins came from a need to read springboot
@@ -34,8 +33,7 @@ require "rufus/scheduler"
34
33
  # }
35
34
  # }
36
35
  # request_timeout => 60
37
- # # Supports "cron", "every", "at" and "in" schedules by rufus scheduler
38
- # schedule => { cron => "* * * * * UTC"}
36
+ # interval => 60
39
37
  # codec => "json"
40
38
  # # A hash of request metadata info (timing, response headers, etc.) will be sent here
41
39
  # metadata_target => "http_poller_metadata"
@@ -61,20 +59,7 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
61
59
  config :urls, :validate => :hash, :required => true
62
60
 
63
61
  # How often (in seconds) the urls will be called
64
- # DEPRECATED. Use 'schedule' option instead.
65
- # If both interval and schedule options are specified, interval
66
- # option takes higher precedence
67
- config :interval, :validate => :number, :deprecated => true
68
-
69
- # Schedule of when to periodically poll from the urls
70
- # Format: A hash with
71
- # + key: "cron" | "every" | "in" | "at"
72
- # + value: string
73
- # Examples:
74
- # a) { "every" => "1h" }
75
- # b) { "cron" => "* * * * * UTC" }
76
- # See: rufus/scheduler for details about different schedule options and value string format
77
- config :schedule, :validate => :hash
62
+ config :interval, :validate => :number, :required => true
78
63
 
79
64
  # Define the target field for placing the received data. If this setting is omitted, the data will be stored at the root (top level) of the event.
80
65
  config :target, :validate => :string
@@ -85,19 +70,17 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
85
70
  config :metadata_target, :validate => :string, :default => '@metadata'
86
71
 
87
72
  public
88
- Schedule_types = %w(cron every at in)
89
73
  def register
90
74
  @host = Socket.gethostname.force_encoding(Encoding::UTF_8)
91
75
 
92
76
  @logger.info("Registering http_poller Input", :type => @type,
93
- :urls => @urls, :interval => @interval, :schedule => @schedule, :timeout => @timeout)
77
+ :urls => @urls, :interval => @interval, :timeout => @timeout)
94
78
 
95
79
  setup_requests!
96
80
  end
97
81
 
98
82
  def stop
99
83
  Stud.stop!(@interval_thread) if @interval_thread
100
- @scheduler.stop if @scheduler
101
84
  end
102
85
 
103
86
  private
@@ -150,46 +133,13 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
150
133
 
151
134
  public
152
135
  def run(queue)
153
- #interval or schedule must be provided. Must be exclusively either one. Not neither. Not both.
154
- raise LogStash::ConfigurationError, "Invalid config. Neither interval nor schedule was specified." \
155
- unless @interval || @schedule
156
- raise LogStash::ConfigurationError, "Invalid config. Specify only interval or schedule. Not both." \
157
- if @interval && @schedule
158
-
159
- if @interval
160
- setup_interval(queue)
161
- elsif @schedule
162
- setup_schedule(queue)
163
- else
164
- #should not reach here
165
- raise LogStash::ConfigurationError, "Invalid config. Neither interval nor schedule was specified."
166
- end
167
- end
168
-
169
- private
170
- def setup_interval(queue)
171
136
  @interval_thread = Thread.current
172
137
  Stud.interval(@interval) do
173
138
  run_once(queue)
174
139
  end
175
140
  end
176
141
 
177
- def setup_schedule(queue)
178
- #schedule hash must contain exactly one of the allowed keys
179
- msg_invalid_schedule = "Invalid config. schedule hash must contain " +
180
- "exactly one of the following keys - cron, at, every or in"
181
- raise Logstash::ConfigurationError, msg_invalid_schedule if @schedule.keys.length !=1
182
- schedule_type = @schedule.keys.first
183
- schedule_value = @schedule[schedule_type]
184
- raise LogStash::ConfigurationError, msg_invalid_schedule unless Schedule_types.include?(schedule_type)
185
-
186
- @scheduler = Rufus::Scheduler.new(:max_work_threads => 1)
187
- #as of v3.0.9, :first_in => :now doesn't work. Use the following workaround instead
188
- opts = schedule_type == "every" ? { :first_in => 0.01 } : {}
189
- @scheduler.send(schedule_type, schedule_value, opts) { run_once(queue) }
190
- @scheduler.join
191
- end
192
-
142
+ private
193
143
  def run_once(queue)
194
144
  @requests.each do |name, request|
195
145
  request_async(queue, name, request)
@@ -244,13 +194,13 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
244
194
 
245
195
  # This is also in the metadata, but we send it anyone because we want this
246
196
  # persisted by default, whereas metadata isn't. People don't like mysterious errors
247
- event["http_request_failure"] = {
197
+ event.set("http_request_failure", {
248
198
  "request" => structure_request(request),
249
199
  "name" => name,
250
200
  "error" => exception.to_s,
251
201
  "backtrace" => exception.backtrace,
252
202
  "runtime_seconds" => execution_time
253
- }
203
+ })
254
204
 
255
205
  queue << event
256
206
  rescue StandardError, java.lang.Exception => e
@@ -266,7 +216,7 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
266
216
  private
267
217
  def apply_metadata(event, name, request, response=nil, execution_time=nil)
268
218
  return unless @metadata_target
269
- event[@metadata_target] = event_metadata(name, request, response, execution_time)
219
+ event.set(@metadata_target, event_metadata(name, request, response, execution_time))
270
220
  end
271
221
 
272
222
  private
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-http_poller'
3
- s.version = '2.1.0'
3
+ s.version = '3.0.0'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Poll HTTP endpoints with Logstash."
6
6
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -18,14 +18,12 @@ Gem::Specification.new do |s|
18
18
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "input" }
19
19
 
20
20
  # Gem dependencies
21
- s.add_runtime_dependency "logstash-core-plugin-api", "~> 1.0"
21
+ s.add_runtime_dependency "logstash-core-plugin-api", "~> 2.0"
22
22
  s.add_runtime_dependency 'logstash-codec-plain'
23
23
  s.add_runtime_dependency 'logstash-mixin-http_client', ">= 2.2.4", "< 3.0.0"
24
24
  s.add_runtime_dependency 'stud', "~> 0.0.22"
25
- s.add_runtime_dependency 'rufus-scheduler', "~>3.0.9"
26
25
 
27
26
  s.add_development_dependency 'logstash-codec-json'
28
27
  s.add_development_dependency 'logstash-devutils'
29
28
  s.add_development_dependency 'flores'
30
- s.add_development_dependency 'timecop'
31
29
  end
@@ -1,14 +1,11 @@
1
1
  require "logstash/devutils/rspec/spec_helper"
2
2
  require 'logstash/inputs/http_poller'
3
3
  require 'flores/random'
4
- require "timecop"
5
4
 
6
5
  describe LogStash::Inputs::HTTP_Poller do
7
6
  let(:metadata_target) { "_http_poller_metadata" }
8
7
  let(:queue) { Queue.new }
9
- let(:default_schedule) {
10
- { "cron" => "* * * * * UTC" }
11
- }
8
+ let(:default_interval) { 5 }
12
9
  let(:default_name) { "url1 " }
13
10
  let(:default_url) { "http://localhost:1827" }
14
11
  let(:default_urls) {
@@ -18,7 +15,7 @@ describe LogStash::Inputs::HTTP_Poller do
18
15
  }
19
16
  let(:default_opts) {
20
17
  {
21
- "schedule" => default_schedule,
18
+ "interval" => default_interval,
22
19
  "urls" => default_urls,
23
20
  "codec" => "json",
24
21
  "metadata_target" => metadata_target
@@ -34,13 +31,9 @@ describe LogStash::Inputs::HTTP_Poller do
34
31
  end
35
32
 
36
33
  describe "#run" do
37
- it "should setup a scheduler" do
38
- runner = Thread.new do
39
- subject.run(double("queue"))
40
- expect(subject.instance_variable_get("@scheduler")).to be_a_kind_of(Rufus::Scheduler)
41
- end
42
- runner.kill
43
- runner.join
34
+ it "should run at the specified interval" do
35
+ expect(Stud).to receive(:interval).with(default_interval).once
36
+ subject.run(double("queue"))
44
37
  end
45
38
  end
46
39
 
@@ -158,166 +151,9 @@ describe LogStash::Inputs::HTTP_Poller do
158
151
  end
159
152
  end
160
153
 
161
- describe "scheduler configuration" do
162
- context "given an interval" do
163
- let(:opts) {
164
- {
165
- "interval" => 2,
166
- "urls" => default_urls,
167
- "codec" => "json",
168
- "metadata_target" => metadata_target
169
- }
170
- }
171
- it "should run once in each interval" do
172
- instance = klass.new(opts)
173
- instance.register
174
- queue = Queue.new
175
- runner = Thread.new do
176
- instance.run(queue)
177
- end
178
- #T 0123456
179
- #events x x x x
180
- #expects 3 events at T=5
181
- sleep 5
182
- instance.stop
183
- runner.kill
184
- runner.join
185
- expect(queue.size).to eq(3)
186
- end
187
- end
188
-
189
- context "given both interval and schedule options" do
190
- let(:opts) {
191
- {
192
- "interval" => 1,
193
- "schedule" => { "every" => "5s" },
194
- "urls" => default_urls,
195
- "codec" => "json",
196
- "metadata_target" => metadata_target
197
- }
198
- }
199
- it "should raise ConfigurationError" do
200
- instance = klass.new(opts)
201
- instance.register
202
- queue = Queue.new
203
- runner = Thread.new do
204
- expect{instance.run(queue)}.to raise_error(LogStash::ConfigurationError)
205
- end
206
- instance.stop
207
- runner.kill
208
- runner.join
209
- end
210
- end
211
-
212
- context "given 'cron' expression" do
213
- let(:opts) {
214
- {
215
- "schedule" => { "cron" => "* * * * * UTC" },
216
- "urls" => default_urls,
217
- "codec" => "json",
218
- "metadata_target" => metadata_target
219
- }
220
- }
221
- it "should run at the schedule" do
222
- instance = klass.new(opts)
223
- instance.register
224
- Timecop.travel(Time.new(2000,1,1,0,0,0,'+00:00'))
225
- Timecop.scale(60)
226
- queue = Queue.new
227
- runner = Thread.new do
228
- instance.run(queue)
229
- end
230
- sleep 3
231
- instance.stop
232
- runner.kill
233
- runner.join
234
- expect(queue.size).to eq(2)
235
- Timecop.return
236
- end
237
- end
238
-
239
- context "given 'at' expression" do
240
- let(:opts) {
241
- {
242
- "schedule" => { "at" => "2000-01-01 00:05:00 +0000"},
243
- "urls" => default_urls,
244
- "codec" => "json",
245
- "metadata_target" => metadata_target
246
- }
247
- }
248
- it "should run at the schedule" do
249
- instance = klass.new(opts)
250
- instance.register
251
- Timecop.travel(Time.new(2000,1,1,0,0,0,'+00:00'))
252
- Timecop.scale(60 * 5)
253
- queue = Queue.new
254
- runner = Thread.new do
255
- instance.run(queue)
256
- end
257
- sleep 2
258
- instance.stop
259
- runner.kill
260
- runner.join
261
- expect(queue.size).to eq(1)
262
- Timecop.return
263
- end
264
- end
265
-
266
- context "given 'every' expression" do
267
- let(:opts) {
268
- {
269
- "schedule" => { "every" => "2s"},
270
- "urls" => default_urls,
271
- "codec" => "json",
272
- "metadata_target" => metadata_target
273
- }
274
- }
275
- it "should run at the schedule" do
276
- instance = klass.new(opts)
277
- instance.register
278
- queue = Queue.new
279
- runner = Thread.new do
280
- instance.run(queue)
281
- end
282
- #T 0123456
283
- #events x x x x
284
- #expects 3 events at T=5
285
- sleep 5
286
- instance.stop
287
- runner.kill
288
- runner.join
289
- expect(queue.size).to eq(3)
290
- end
291
- end
292
-
293
- context "given 'in' expression" do
294
- let(:opts) {
295
- {
296
- "schedule" => { "in" => "2s"},
297
- "urls" => default_urls,
298
- "codec" => "json",
299
- "metadata_target" => metadata_target
300
- }
301
- }
302
- it "should run at the schedule" do
303
- instance = klass.new(opts)
304
- instance.register
305
- queue = Queue.new
306
- runner = Thread.new do
307
- instance.run(queue)
308
- end
309
- sleep 3
310
- instance.stop
311
- runner.kill
312
- runner.join
313
- expect(queue.size).to eq(1)
314
- end
315
- end
316
- end
317
-
318
154
  describe "events" do
319
155
  shared_examples("matching metadata") {
320
- let(:metadata) { event[metadata_target] }
156
+ let(:metadata) { event.get(metadata_target) }
321
157
 
322
158
  it "should have the correct name" do
323
159
  expect(metadata["name"]).to eql(name)
@@ -355,11 +191,11 @@ describe LogStash::Inputs::HTTP_Poller do
355
191
  end
356
192
 
357
193
  it "should enqueue a message with 'http_request_failure' set" do
358
- expect(event["http_request_failure"]).to be_a(Hash)
194
+ expect(event.get("http_request_failure")).to be_a(Hash)
359
195
  end
360
196
 
361
197
  it "should tag the event with '_http_request_failure'" do
362
- expect(event["tags"]).to include('_http_request_failure')
198
+ expect(event.get("tags")).to include('_http_request_failure')
363
199
  end
364
200
 
365
201
  it "should invoke handle failure exactly once" do
@@ -440,7 +276,7 @@ describe LogStash::Inputs::HTTP_Poller do
440
276
 
441
277
  it "should not have any metadata on the event" do
442
278
  instance.send(:run_once, queue)
443
- expect(event[metadata_target]).to be_nil
279
+ expect(event.get(metadata_target)).to be_nil
444
280
  end
445
281
  end
446
282
 
@@ -456,9 +292,7 @@ describe LogStash::Inputs::HTTP_Poller do
456
292
  }
457
293
  let(:opts) {
458
294
  {
459
- "schedule" => {
460
- "cron" => "* * * * * UTC"
461
- },
295
+ "interval" => default_interval,
462
296
  "urls" => {
463
297
  default_name => url
464
298
  },
@@ -482,7 +316,7 @@ describe LogStash::Inputs::HTTP_Poller do
482
316
  # When events go through the pipeline they are java-ified
483
317
  # this normalizes the payload to java types
484
318
  payload_normalized = LogStash::Json.load(LogStash::Json.dump(payload))
485
- expect(event[target]).to include(payload_normalized)
319
+ expect(event.get(target)).to include(payload_normalized)
486
320
  end
487
321
  end
488
322
  end
metadata CHANGED
@@ -1,45 +1,46 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-http_poller
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  - andrewvc
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-20 00:00:00.000000000 Z
12
+ date: 2016-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
+ name: logstash-core-plugin-api
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '1.0'
20
- name: logstash-core-plugin-api
21
- prerelease: false
20
+ version: '2.0'
22
21
  type: :runtime
22
+ prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.0'
27
+ version: '2.0'
28
28
  - !ruby/object:Gem::Dependency
29
+ name: logstash-codec-plain
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - ">="
32
33
  - !ruby/object:Gem::Version
33
34
  version: '0'
34
- name: logstash-codec-plain
35
- prerelease: false
36
35
  type: :runtime
36
+ prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
+ name: logstash-mixin-http_client
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
46
  - - ">="
@@ -48,9 +49,8 @@ dependencies:
48
49
  - - "<"
49
50
  - !ruby/object:Gem::Version
50
51
  version: 3.0.0
51
- name: logstash-mixin-http_client
52
- prerelease: false
53
52
  type: :runtime
53
+ prerelease: false
54
54
  version_requirements: !ruby/object:Gem::Requirement
55
55
  requirements:
56
56
  - - ">="
@@ -60,90 +60,64 @@ dependencies:
60
60
  - !ruby/object:Gem::Version
61
61
  version: 3.0.0
62
62
  - !ruby/object:Gem::Dependency
63
+ name: stud
63
64
  requirement: !ruby/object:Gem::Requirement
64
65
  requirements:
65
66
  - - "~>"
66
67
  - !ruby/object:Gem::Version
67
68
  version: 0.0.22
68
- name: stud
69
- prerelease: false
70
69
  type: :runtime
71
- version_requirements: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 0.0.22
76
- - !ruby/object:Gem::Dependency
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: 3.0.9
82
- name: rufus-scheduler
83
70
  prerelease: false
84
- type: :runtime
85
71
  version_requirements: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: 3.0.9
75
+ version: 0.0.22
90
76
  - !ruby/object:Gem::Dependency
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
77
  name: logstash-codec-json
97
- prerelease: false
98
- type: :development
99
- version_requirements: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- - !ruby/object:Gem::Dependency
105
78
  requirement: !ruby/object:Gem::Requirement
106
79
  requirements:
107
80
  - - ">="
108
81
  - !ruby/object:Gem::Version
109
82
  version: '0'
110
- name: logstash-devutils
111
- prerelease: false
112
83
  type: :development
84
+ prerelease: false
113
85
  version_requirements: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - ">="
116
88
  - !ruby/object:Gem::Version
117
89
  version: '0'
118
90
  - !ruby/object:Gem::Dependency
91
+ name: logstash-devutils
119
92
  requirement: !ruby/object:Gem::Requirement
120
93
  requirements:
121
94
  - - ">="
122
95
  - !ruby/object:Gem::Version
123
96
  version: '0'
124
- name: flores
125
- prerelease: false
126
97
  type: :development
98
+ prerelease: false
127
99
  version_requirements: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ">="
130
102
  - !ruby/object:Gem::Version
131
103
  version: '0'
132
104
  - !ruby/object:Gem::Dependency
105
+ name: flores
133
106
  requirement: !ruby/object:Gem::Requirement
134
107
  requirements:
135
108
  - - ">="
136
109
  - !ruby/object:Gem::Version
137
110
  version: '0'
138
- name: timecop
139
- prerelease: false
140
111
  type: :development
112
+ prerelease: false
141
113
  version_requirements: !ruby/object:Gem::Requirement
142
114
  requirements:
143
115
  - - ">="
144
116
  - !ruby/object:Gem::Version
145
117
  version: '0'
146
- description: This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program
118
+ description: This gem is a Logstash plugin required to be installed on top of the
119
+ Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
120
+ gem is not a stand-alone program
147
121
  email: info@elastic.co
148
122
  executables: []
149
123
  extensions: []
@@ -163,7 +137,7 @@ licenses:
163
137
  metadata:
164
138
  logstash_plugin: 'true'
165
139
  logstash_group: input
166
- post_install_message:
140
+ post_install_message:
167
141
  rdoc_options: []
168
142
  require_paths:
169
143
  - lib
@@ -178,9 +152,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
152
  - !ruby/object:Gem::Version
179
153
  version: '0'
180
154
  requirements: []
181
- rubyforge_project:
182
- rubygems_version: 2.4.8
183
- signing_key:
155
+ rubyforge_project:
156
+ rubygems_version: 2.5.1
157
+ signing_key:
184
158
  specification_version: 4
185
159
  summary: Poll HTTP endpoints with Logstash.
186
160
  test_files: