logstash-input-http_poller 5.2.1 → 5.4.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
  SHA256:
3
- metadata.gz: ffa63b5111349fab5d81dbc52cc005ab2ab6ed296aab3135859d941b3fd32c4b
4
- data.tar.gz: 6ab7912818139b2c9595fe7b0797f0c4e02bb9af2722a32e5af1c9ca8c887536
3
+ metadata.gz: 959498284e07e414f7be7e02b9df125372526da763a4d273b55fc609186b777c
4
+ data.tar.gz: 6a6f4dc0da77770581920f719e9de03f3d81bdc079a61fdb43874e5c09d3afa8
5
5
  SHA512:
6
- metadata.gz: 2093f0da0658436437293283a8425e2e497d2bb1e17a9b3910dff3e2ea5bf8a1ce546225abf4f97f24866abd812d0078e0c479ee7c3ef401ee3c3ec611002c21
7
- data.tar.gz: 24210d613caee8ed465816b9865d75ad0547d8e81f5160858742d77bbe4ddef46284b798b4c1581bc706f0267f4316718318995dc5dbb3647c123d407d7fdf08
6
+ metadata.gz: d3af6dc69528053dcc66ccdef55fbd9dfc56bede4cd383ccd44689a884f601b14b630f1d3accc7d56e86ca41f4bbe544379e7dc8cc23d8794db8b2c6d9fd4711
7
+ data.tar.gz: 693a73cc6a442b7b78d15987ea99d84a6a3b5a6143b12261a95eda1a7bfec070650771f66c2a652709470e4c5cebdc5e8f0921c6e3265c3942d168d8bb32aea2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 5.4.0
2
+ - Refactor: start using scheduler mixin [#134](https://github.com/logstash-plugins/logstash-input-http_poller/pull/134)
3
+
4
+ ## 5.3.1
5
+ - Fix: make sure plugin is closing the http client [#130](https://github.com/logstash-plugins/logstash-input-http_poller/pull/130)
6
+
7
+ ## 5.3.0
8
+ - Feat: added ssl_supported_protocols option [#133](https://github.com/logstash-plugins/logstash-input-http_poller/pull/133)
9
+
1
10
  ## 5.2.1
2
11
  - Deps: unpin rufus-scheduler dependency [#130](https://github.com/logstash-plugins/logstash-input-http_poller/pull/130)
3
12
 
data/docs/index.asciidoc CHANGED
@@ -146,6 +146,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
146
146
  | <<plugins-{type}s-{plugin}-retry_non_idempotent>> |<<boolean,boolean>>|No
147
147
  | <<plugins-{type}s-{plugin}-schedule>> |<<hash,hash>>|Yes
148
148
  | <<plugins-{type}s-{plugin}-socket_timeout>> |<<number,number>>|No
149
+ | <<plugins-{type}s-{plugin}-ssl_supported_protocols>> |<<string,string>>|No
149
150
  | <<plugins-{type}s-{plugin}-ssl_verification_mode>> |<<string,string>>|No
150
151
  | <<plugins-{type}s-{plugin}-target>> |<<string,string>>|No
151
152
  | <<plugins-{type}s-{plugin}-truststore>> |a valid filesystem path|No
@@ -414,6 +415,23 @@ See: rufus/scheduler for details about different schedule options and value stri
414
415
 
415
416
  Timeout (in seconds) to wait for data on the socket. Default is `10s`
416
417
 
418
+ [id="plugins-{type}s-{plugin}-ssl_supported_protocols"]
419
+ ===== `ssl_supported_protocols`
420
+
421
+ * Value type is <<string,string>>
422
+ * Allowed values are: `'TLSv1.1'`, `'TLSv1.2'`, `'TLSv1.3'`
423
+ * Default depends on the JDK being used. With up-to-date Logstash, the default is `['TLSv1.2', 'TLSv1.3']`.
424
+ `'TLSv1.1'` is not considered secure and is only provided for legacy applications.
425
+
426
+ List of allowed SSL/TLS versions to use when establishing a connection to the HTTP endpoint.
427
+
428
+ For Java 8 `'TLSv1.3'` is supported only since **8u262** (AdoptOpenJDK), but requires that you set the
429
+ `LS_JAVA_OPTS="-Djdk.tls.client.protocols=TLSv1.3"` system property in Logstash.
430
+
431
+ NOTE: If you configure the plugin to use `'TLSv1.1'` on any recent JVM, such as the one packaged with Logstash,
432
+ the protocol is disabled by default and needs to be enabled manually by changing `jdk.tls.disabledAlgorithms` in
433
+ the *$JDK_HOME/conf/security/java.security* configuration file. That is, `TLSv1.1` needs to be removed from the list.
434
+
417
435
  [id="plugins-{type}s-{plugin}-ssl_verification_mode"]
418
436
  ===== `ssl_verification_mode`
419
437
 
@@ -4,11 +4,11 @@ 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
  require "logstash/plugin_mixins/ecs_compatibility_support"
9
8
  require 'logstash/plugin_mixins/ecs_compatibility_support/target_check'
10
9
  require 'logstash/plugin_mixins/validator_support/field_reference_validation_adapter'
11
10
  require 'logstash/plugin_mixins/event_support/event_factory_adapter'
11
+ require 'logstash/plugin_mixins/scheduler'
12
12
 
13
13
  class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
14
14
  include LogStash::PluginMixins::HttpClient
@@ -18,6 +18,8 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
18
18
 
19
19
  extend LogStash::PluginMixins::ValidatorSupport::FieldReferenceValidationAdapter
20
20
 
21
+ include LogStash::PluginMixins::Scheduler
22
+
21
23
  config_name "http_poller"
22
24
 
23
25
  default :codec, "json"
@@ -45,23 +47,34 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
45
47
  config :metadata_target, :validate => :string, :default => '@metadata'
46
48
 
47
49
  public
48
- Schedule_types = %w(cron every at in)
49
50
  def register
50
51
  @host = Socket.gethostname.force_encoding(Encoding::UTF_8)
51
52
 
52
- @logger.info("Registering http_poller Input", :type => @type, :schedule => @schedule, :timeout => @timeout)
53
-
54
53
  setup_ecs_field!
55
54
  setup_requests!
56
55
  end
57
56
 
58
57
  # @overload
59
58
  def stop
60
- if @scheduler
61
- @scheduler.shutdown # on newer Rufus (3.8) this joins on the scheduler thread
59
+ close_client
60
+ end
61
+
62
+ # @overload
63
+ def close
64
+ close_client
65
+ end
66
+
67
+ def close_client
68
+ @logger.debug("closing http client", client: client)
69
+ begin
70
+ client.close # since Manticore 0.9.0 this shuts-down/closes all resources
71
+ rescue => e
72
+ details = { exception: e.class, message: e.message }
73
+ details[:backtrace] = e.backtrace if @logger.debug?
74
+ @logger.warn "failed closing http client", details
62
75
  end
63
- # TODO implement client.close as we as releasing it's pooled resources!
64
76
  end
77
+ private :close_client
65
78
 
66
79
  private
67
80
  def setup_requests!
@@ -169,25 +182,27 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
169
182
  raise Logstash::ConfigurationError, msg_invalid_schedule if @schedule.keys.length != 1
170
183
  schedule_type = @schedule.keys.first
171
184
  schedule_value = @schedule[schedule_type]
172
- raise LogStash::ConfigurationError, msg_invalid_schedule unless Schedule_types.include?(schedule_type)
185
+ raise LogStash::ConfigurationError, msg_invalid_schedule unless %w(cron every at in).include?(schedule_type)
173
186
 
174
- @scheduler = Rufus::Scheduler.new(:max_work_threads => 1)
175
- opts = schedule_type == "every" ? { :first_in => 0.01 } : {}
176
- @scheduler.send(schedule_type, schedule_value, opts) { run_once(queue) }
177
- @scheduler.thread.join # due newer rufus (3.8) doing a blocking operation on scheduler.join
187
+ opts = schedule_type == "every" ? { first_in: 0.01 } : {}
188
+ scheduler.public_send(schedule_type, schedule_value, opts) { run_once(queue) }
189
+ scheduler.join
178
190
  end
179
191
 
180
192
  def run_once(queue)
181
193
  @requests.each do |name, request|
194
+ # prevent executing a scheduler kick after the plugin has been stop-ed
195
+ # this could easily happen as the scheduler shutdown is not immediate
196
+ return if stop?
182
197
  request_async(queue, name, request)
183
198
  end
184
199
 
185
- client.execute!
200
+ client.execute! unless stop?
186
201
  end
187
202
 
188
203
  private
189
204
  def request_async(queue, name, request)
190
- @logger.debug? && @logger.debug("Fetching URL", :name => name, :url => request)
205
+ @logger.debug? && @logger.debug("async queueing fetching url", name: name, url: request)
191
206
  started = Time.now
192
207
 
193
208
  method, *request_opts = request
@@ -204,6 +219,7 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
204
219
 
205
220
  private
206
221
  def handle_success(queue, name, request, response, execution_time)
222
+ @logger.debug? && @logger.debug("success fetching url", name: name, url: request)
207
223
  body = response.body
208
224
  # If there is a usable response. HEAD requests are `nil` and empty get
209
225
  # responses come up as "" which will cause the codec to not yield anything
@@ -242,6 +258,7 @@ class LogStash::Inputs::HTTP_Poller < LogStash::Inputs::Base
242
258
  private
243
259
  # Beware, on old versions of manticore some uncommon failures are not handled
244
260
  def handle_failure(queue, name, request, exception, execution_time)
261
+ @logger.debug? && @logger.debug("failed fetching url", name: name, url: request)
245
262
  event = event_factory.new_event
246
263
  event.tag("_http_request_failure")
247
264
  apply_metadata(event, name, request, nil, execution_time)
@@ -1,9 +1,9 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-http_poller'
3
- s.version = '5.2.1'
3
+ s.version = '5.4.0'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Decodes the output of an HTTP API into events"
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"
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"
7
7
  s.authors = [ "Elastic", "andrewvc"]
8
8
  s.email = 'info@elastic.co'
9
9
  s.homepage = "http://www.elastic.co/guide/en/logstash/current/index.html"
@@ -20,8 +20,8 @@ Gem::Specification.new do |s|
20
20
  # Gem dependencies
21
21
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
22
22
  s.add_runtime_dependency 'logstash-codec-plain'
23
- s.add_runtime_dependency "logstash-mixin-http_client", ">= 7.1.0"
24
- s.add_runtime_dependency 'rufus-scheduler', ">= 3.0.9"
23
+ s.add_runtime_dependency "logstash-mixin-http_client", ">= 7.2.0"
24
+ s.add_runtime_dependency 'logstash-mixin-scheduler', '~> 1.0'
25
25
  s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.3'
26
26
  s.add_runtime_dependency 'logstash-mixin-event_support', '~> 1.0', '>= 1.0.1'
27
27
  s.add_runtime_dependency 'logstash-mixin-validator_support', '~> 1.0'
@@ -201,8 +201,8 @@ describe LogStash::Inputs::HTTP_Poller do
201
201
  end
202
202
 
203
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 }
204
+ run_plugin_and_yield_queue(plugin, sleep: 3.1) do |queue|
205
+ try(10) { expect(queue.size).to be >= 2 }
206
206
  end
207
207
  end
208
208
  end
@@ -227,8 +227,8 @@ describe LogStash::Inputs::HTTP_Poller do
227
227
  end
228
228
 
229
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) }
230
+ run_plugin_and_yield_queue(plugin, sleep: 4.1) do |queue|
231
+ try(10) { expect(queue.size).to eq(1) }
232
232
  end
233
233
  end
234
234
  end
@@ -247,7 +247,7 @@ describe LogStash::Inputs::HTTP_Poller do
247
247
  #T 0123456
248
248
  #events x x x x
249
249
  #expects 3 events at T=5
250
- try(5) { expect(queue.size).to be_between(2, 3) }
250
+ try(10) { expect(queue.size).to be_between(2, 3) }
251
251
  end
252
252
  end
253
253
  end
@@ -255,15 +255,15 @@ describe LogStash::Inputs::HTTP_Poller do
255
255
  context "given 'in' expression" do
256
256
  let(:opts) {
257
257
  {
258
- "schedule" => { "in" => "2s"},
258
+ "schedule" => { "in" => "1s"},
259
259
  "urls" => default_urls,
260
260
  "codec" => "json",
261
261
  "metadata_target" => metadata_target
262
262
  }
263
263
  }
264
264
  it "should run at the schedule" do
265
- run_plugin_and_yield_queue(plugin, sleep: 2.5) do |queue|
266
- try(5) { expect(queue.size).to eq(1) }
265
+ run_plugin_and_yield_queue(plugin, sleep: 2.05) do |queue|
266
+ try(10) { expect(queue.size).to eq(1) }
267
267
  end
268
268
  end
269
269
  end
@@ -410,14 +410,15 @@ describe LogStash::Inputs::HTTP_Poller do
410
410
  before do
411
411
  plugin.register
412
412
  u = url.is_a?(Hash) ? url["url"] : url # handle both complex specs and simple string URLs
413
- plugin.client.stub(u,
414
- :body => response_body,
415
- :code => code
416
- )
413
+ plugin.client.stub(u, :body => response_body, :code => code)
417
414
  allow(plugin).to receive(:decorate)
418
415
  plugin.send(:run_once, queue)
419
416
  end
420
417
 
418
+ after do
419
+ plugin.close
420
+ end
421
+
421
422
  it "should have a matching message" do
422
423
  expect(event.to_hash).to include(payload)
423
424
  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.1
4
+ version: 5.4.0
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-16 00:00:00.000000000 Z
12
+ date: 2022-06-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 7.1.0
53
+ version: 7.2.0
54
54
  name: logstash-mixin-http_client
55
55
  prerelease: false
56
56
  type: :runtime
@@ -58,21 +58,21 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 7.1.0
61
+ version: 7.2.0
62
62
  - !ruby/object:Gem::Dependency
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 3.0.9
68
- name: rufus-scheduler
67
+ version: '1.0'
68
+ name: logstash-mixin-scheduler
69
69
  prerelease: false
70
70
  type: :runtime
71
71
  version_requirements: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 3.0.9
75
+ version: '1.0'
76
76
  - !ruby/object:Gem::Dependency
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements: