logstash-input-http_poller 5.2.0 → 5.2.1

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
  SHA256:
3
- metadata.gz: 512535463aaa56747ba5e9d6a264887588966a6df43518955deccb19f2b7acae
4
- data.tar.gz: 6c9b5b63198545b35e019b8e4f70edcec9f74ea9e8b4e53d6982b3841f48598b
3
+ metadata.gz: ffa63b5111349fab5d81dbc52cc005ab2ab6ed296aab3135859d941b3fd32c4b
4
+ data.tar.gz: 6ab7912818139b2c9595fe7b0797f0c4e02bb9af2722a32e5af1c9ca8c887536
5
5
  SHA512:
6
- metadata.gz: 52a07cfe047ab7774d5ed1279ac9c5434031ccd86f57a6b93996345c8f7c1e6fe4792b8525dee40ef0be14832a2bfb85be192a80021f67a59adae507a0e01b5f
7
- data.tar.gz: e614b85fd0558f4bfda62c8cb5df8811249cd6ed2cfa9ebfeb67caab08feb133a00e29737e2a806c471b59bf4efd75ac5404f06be38488f8e70987ebe8441ef6
6
+ metadata.gz: 2093f0da0658436437293283a8425e2e497d2bb1e17a9b3910dff3e2ea5bf8a1ce546225abf4f97f24866abd812d0078e0c479ee7c3ef401ee3c3ec611002c21
7
+ data.tar.gz: 24210d613caee8ed465816b9865d75ad0547d8e81f5160858742d77bbe4ddef46284b798b4c1581bc706f0267f4316718318995dc5dbb3647c123d407d7fdf08
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 5.2.1
2
+ - Deps: unpin rufus-scheduler dependency [#130](https://github.com/logstash-plugins/logstash-input-http_poller/pull/130)
3
+
1
4
  ## 5.2.0
2
5
  - Feat: support ssl_verification_mode option [#131](https://github.com/logstash-plugins/logstash-input-http_poller/pull/131)
3
6
 
data/Gemfile CHANGED
@@ -9,3 +9,5 @@ if Dir.exist?(logstash_path) && use_logstash_source
9
9
  gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
10
10
  gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
11
11
  end
12
+
13
+ gem 'rufus-scheduler', ENV['RUFUS_SCHEDULER_VERSION'] if ENV['RUFUS_SCHEDULER_VERSION']
@@ -55,9 +55,12 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
55
55
  setup_requests!
56
56
  end
57
57
 
58
+ # @overload
58
59
  def stop
59
- Stud.stop!(@interval_thread) if @interval_thread
60
- @scheduler.stop if @scheduler
60
+ if @scheduler
61
+ @scheduler.shutdown # on newer Rufus (3.8) this joins on the scheduler thread
62
+ end
63
+ # TODO implement client.close as we as releasing it's pooled resources!
61
64
  end
62
65
 
63
66
  private
@@ -163,16 +166,15 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
163
166
  #schedule hash must contain exactly one of the allowed keys
164
167
  msg_invalid_schedule = "Invalid config. schedule hash must contain " +
165
168
  "exactly one of the following keys - cron, at, every or in"
166
- raise Logstash::ConfigurationError, msg_invalid_schedule if @schedule.keys.length !=1
169
+ raise Logstash::ConfigurationError, msg_invalid_schedule if @schedule.keys.length != 1
167
170
  schedule_type = @schedule.keys.first
168
171
  schedule_value = @schedule[schedule_type]
169
172
  raise LogStash::ConfigurationError, msg_invalid_schedule unless Schedule_types.include?(schedule_type)
170
173
 
171
174
  @scheduler = Rufus::Scheduler.new(:max_work_threads => 1)
172
- #as of v3.0.9, :first_in => :now doesn't work. Use the following workaround instead
173
175
  opts = schedule_type == "every" ? { :first_in => 0.01 } : {}
174
176
  @scheduler.send(schedule_type, schedule_value, opts) { run_once(queue) }
175
- @scheduler.join
177
+ @scheduler.thread.join # due newer rufus (3.8) doing a blocking operation on scheduler.join
176
178
  end
177
179
 
178
180
  def run_once(queue)
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-http_poller'
3
- s.version = '5.2.0'
3
+ s.version = '5.2.1'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Decodes the output of an HTTP API into events"
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"
@@ -21,8 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
22
22
  s.add_runtime_dependency 'logstash-codec-plain'
23
23
  s.add_runtime_dependency "logstash-mixin-http_client", ">= 7.1.0"
24
- s.add_runtime_dependency 'stud', "~> 0.0.22"
25
- s.add_runtime_dependency 'rufus-scheduler', "~>3.0.9"
24
+ s.add_runtime_dependency 'rufus-scheduler', ">= 3.0.9"
26
25
  s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.3'
27
26
  s.add_runtime_dependency 'logstash-mixin-event_support', '~> 1.0', '>= 1.0.1'
28
27
  s.add_runtime_dependency 'logstash-mixin-validator_support', '~> 1.0'
@@ -25,18 +25,19 @@ describe LogStash::Inputs::HTTP_Poller do
25
25
  "schedule" => default_schedule,
26
26
  "urls" => default_urls,
27
27
  "codec" => "json",
28
- "metadata_target" => metadata_target
28
+ "metadata_target" => metadata_target,
29
+ "pool_max" => 3, "pool_max_per_route" => 1, 'keepalive' => false
29
30
  }
30
31
  }
31
- let(:klass) { LogStash::Inputs::HTTP_Poller }
32
+ let(:opts) { default_opts }
32
33
 
34
+ subject(:plugin) { described_class.new(opts) }
33
35
 
34
36
  describe "instances" do
35
- subject { klass.new(default_opts) }
37
+ subject { described_class.new(default_opts) }
36
38
 
37
- before do
38
- subject.register
39
- end
39
+ before { subject.register }
40
+ after { subject.stop }
40
41
 
41
42
  describe "#run" do
42
43
  it "should setup a scheduler" do
@@ -189,22 +190,21 @@ describe LogStash::Inputs::HTTP_Poller do
189
190
  "metadata_target" => metadata_target
190
191
  }
191
192
  }
192
- it "should run at the schedule" do
193
- instance = klass.new(opts)
194
- instance.register
193
+
194
+ before do
195
195
  Timecop.travel(Time.new(2000,1,1,0,0,0,'+00:00'))
196
196
  Timecop.scale(60)
197
- queue = Queue.new
198
- runner = Thread.new do
199
- instance.run(queue)
200
- end
201
- sleep 3
202
- instance.stop
203
- runner.kill
204
- runner.join
205
- expect(queue.size).to eq(2)
197
+ end
198
+
199
+ after do
206
200
  Timecop.return
207
201
  end
202
+
203
+ it "should run at the schedule" do
204
+ run_plugin_and_yield_queue(plugin, sleep: 3) do |queue|
205
+ try(5) { expect(queue.size).to be >= 2 }
206
+ end
207
+ end
208
208
  end
209
209
 
210
210
  context "given 'at' expression" do
@@ -216,22 +216,21 @@ describe LogStash::Inputs::HTTP_Poller do
216
216
  "metadata_target" => metadata_target
217
217
  }
218
218
  }
219
- it "should run at the schedule" do
220
- instance = klass.new(opts)
221
- instance.register
219
+
220
+ before do
222
221
  Timecop.travel(Time.new(2000,1,1,0,0,0,'+00:00'))
223
- Timecop.scale(60 * 5)
224
- queue = Queue.new
225
- runner = Thread.new do
226
- instance.run(queue)
227
- end
228
- sleep 2
229
- instance.stop
230
- runner.kill
231
- runner.join
232
- expect(queue.size).to eq(1)
222
+ Timecop.scale (60 * 5) / 2
223
+ end
224
+
225
+ after do
233
226
  Timecop.return
234
227
  end
228
+
229
+ it "should run at the schedule" do
230
+ run_plugin_and_yield_queue(plugin, sleep: 2) do |queue|
231
+ try(5) { expect(queue.size).to eq(1) }
232
+ end
233
+ end
235
234
  end
236
235
 
237
236
  context "given 'every' expression" do
@@ -244,20 +243,12 @@ describe LogStash::Inputs::HTTP_Poller do
244
243
  }
245
244
  }
246
245
  it "should run at the schedule" do
247
- instance = klass.new(opts)
248
- instance.register
249
- queue = Queue.new
250
- runner = Thread.new do
251
- instance.run(queue)
246
+ run_plugin_and_yield_queue(plugin, sleep: 5) do |queue|
247
+ #T 0123456
248
+ #events x x x x
249
+ #expects 3 events at T=5
250
+ try(5) { expect(queue.size).to be_between(2, 3) }
252
251
  end
253
- #T 0123456
254
- #events x x x x
255
- #expects 3 events at T=5
256
- sleep 5
257
- instance.stop
258
- runner.kill
259
- runner.join
260
- expect(queue.size).to be_between(2, 3)
261
252
  end
262
253
  end
263
254
 
@@ -271,21 +262,28 @@ describe LogStash::Inputs::HTTP_Poller do
271
262
  }
272
263
  }
273
264
  it "should run at the schedule" do
274
- instance = klass.new(opts)
275
- instance.register
276
- queue = Queue.new
277
- runner = Thread.new do
278
- instance.run(queue)
265
+ run_plugin_and_yield_queue(plugin, sleep: 2.5) do |queue|
266
+ try(5) { expect(queue.size).to eq(1) }
279
267
  end
280
- sleep 3
281
- instance.stop
282
- runner.kill
283
- runner.join
284
- expect(queue.size).to eq(1)
285
268
  end
286
269
  end
287
270
  end
288
271
 
272
+ def run_plugin_and_yield_queue(plugin, sleep: nil)
273
+ plugin.register
274
+ queue = Queue.new
275
+ begin
276
+ runner = Thread.new do
277
+ plugin.run(queue)
278
+ end
279
+ sleep(sleep) if sleep
280
+ yield(queue)
281
+ ensure
282
+ plugin.stop
283
+ runner.join if runner
284
+ end
285
+ end
286
+
289
287
  describe "events", :ecs_compatibility_support, :aggregate_failures do
290
288
  ecs_compatibility_matrix(:disabled, :v1, :v8 => :v1) do |ecs_select|
291
289
  before do
@@ -339,6 +337,8 @@ describe LogStash::Inputs::HTTP_Poller do
339
337
  event # materialize the subject
340
338
  end
341
339
 
340
+ after { poller.stop }
341
+
342
342
  it "should enqueue a message" do
343
343
  expect(event).to be_a(LogStash::Event)
344
344
  end
@@ -399,9 +399,6 @@ describe LogStash::Inputs::HTTP_Poller do
399
399
  let(:payload) { {"a" => 2, "hello" => ["a", "b", "c"]} }
400
400
  let(:response_body) { LogStash::Json.dump(payload) }
401
401
  let(:opts) { default_opts }
402
- let(:instance) {
403
- klass.new(opts)
404
- }
405
402
  let(:name) { default_name }
406
403
  let(:url) { default_url }
407
404
  let(:code) { 202 }
@@ -411,14 +408,14 @@ describe LogStash::Inputs::HTTP_Poller do
411
408
  }
412
409
 
413
410
  before do
414
- instance.register
411
+ plugin.register
415
412
  u = url.is_a?(Hash) ? url["url"] : url # handle both complex specs and simple string URLs
416
- instance.client.stub(u,
413
+ plugin.client.stub(u,
417
414
  :body => response_body,
418
415
  :code => code
419
416
  )
420
- allow(instance).to receive(:decorate)
421
- instance.send(:run_once, queue)
417
+ allow(plugin).to receive(:decorate)
418
+ plugin.send(:run_once, queue)
422
419
  end
423
420
 
424
421
  it "should have a matching message" do
@@ -426,7 +423,7 @@ describe LogStash::Inputs::HTTP_Poller do
426
423
  end
427
424
 
428
425
  it "should decorate the event" do
429
- expect(instance).to have_received(:decorate).once
426
+ expect(plugin).to have_received(:decorate).once
430
427
  end
431
428
 
432
429
  include_examples("matching metadata")
@@ -434,7 +431,7 @@ describe LogStash::Inputs::HTTP_Poller do
434
431
  context "with an empty body" do
435
432
  let(:response_body) { "" }
436
433
  it "should return an empty event" do
437
- instance.send(:run_once, queue)
434
+ plugin.send(:run_once, queue)
438
435
  headers_field = ecs_select[disabled: "[#{metadata_target}][response_headers]",
439
436
  v1: "[#{metadata_target}][input][http_poller][response][headers]"]
440
437
  expect(event.get("#{headers_field}[content-length]")).to eql("0")
@@ -449,7 +446,7 @@ describe LogStash::Inputs::HTTP_Poller do
449
446
  }
450
447
 
451
448
  it "should not have any metadata on the event" do
452
- instance.send(:run_once, queue)
449
+ plugin.send(:run_once, queue)
453
450
  expect(event.get(metadata_target)).to be_nil
454
451
  end
455
452
  end
@@ -555,6 +552,8 @@ describe LogStash::Inputs::HTTP_Poller do
555
552
 
556
553
  describe "stopping" do
557
554
  let(:config) { default_opts }
558
- it_behaves_like "an interruptible input plugin"
555
+ it_behaves_like "an interruptible input plugin" do
556
+ let(:allowed_lag) { 10 } # CI: wait till scheduler shuts down
557
+ end
559
558
  end
560
559
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-http_poller
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 5.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-02-01 00:00:00.000000000 Z
12
+ date: 2022-02-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  requirement: !ruby/object:Gem::Requirement
@@ -62,21 +62,7 @@ dependencies:
62
62
  - !ruby/object:Gem::Dependency
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: 0.0.22
68
- name: stud
69
- prerelease: false
70
- 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
- - - "~>"
65
+ - - ">="
80
66
  - !ruby/object:Gem::Version
81
67
  version: 3.0.9
82
68
  name: rufus-scheduler
@@ -84,7 +70,7 @@ dependencies:
84
70
  type: :runtime
85
71
  version_requirements: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - "~>"
73
+ - - ">="
88
74
  - !ruby/object:Gem::Version
89
75
  version: 3.0.9
90
76
  - !ruby/object:Gem::Dependency