logstash-input-http_poller 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: