test-opensearch 0.0.0.2 → 0.0.0.3

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: e7580053f641548484430925f843889791431d992ea33d0f2208d0050df99f11
4
- data.tar.gz: 0aa937c2c3f0d2b46f51f13a089c131967d87452738ce1c2450349437c144733
3
+ metadata.gz: 4e56816c3f750e8e813fbcf64e6589ca799a2b94f2b00a07ef0ae8395a4da14b
4
+ data.tar.gz: 0340bdd6b8a12e2ed032437484656f61b37c5cca2355bc01cadd408225619b90
5
5
  SHA512:
6
- metadata.gz: 4f1c1c7c5e3b0545a16b00a97d794ddd19810db75353c5e1ec81f95720028f447c5eed44987e34a965acdf84a05916fd0f277d6135fc63f14c6cda3f2e1af1e8
7
- data.tar.gz: 6cebc7d1d09d249b1bb441a8dd15632a643769b6e8a645884b9c1bd52dc604016cce477de2a61e1d188e52d909ade417f8ef9d7f30e64ae8cde49f333f60a6a2
6
+ metadata.gz: b5cabd951822174fa8cf36902279bcf41db4a3a839b783ccdc072f4dfb6816c40d502261053343d71df9e5a1d26e3d330adfcbae839bbaa9b3974f576f226d11
7
+ data.tar.gz: 58305a974872fd798841bd9df1dccf0099c50282e6bab96d8dcd3155e0ad05c0796c7e856bec379d643c6dad03caf2a0057577a3981734f4bc0b2c3100df0bac
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = 'test-opensearch'
6
- s.version = '0.0.0.2'
6
+ s.version = '0.0.0.3'
7
7
  s.authors = ['Oleh']
8
8
  s.email = ['imcotop@icloud.com']
9
9
  s.description = %q{test}
@@ -26,9 +26,10 @@
26
26
 
27
27
  require 'opensearch'
28
28
 
29
- # require 'faraday/excon'
29
+ require 'faraday/excon'
30
30
  require 'fluent/log-ext'
31
31
  require 'fluent/plugin/input'
32
+ require 'fluent/plugin_helper'
32
33
  require_relative 'opensearch_constants'
33
34
 
34
35
  module Fluent::Plugin
@@ -39,7 +40,7 @@ module Fluent::Plugin
39
40
  DEFAULT_STORAGE_TYPE = 'local'
40
41
  METADATA = "@metadata".freeze
41
42
 
42
- helpers :timer, :thread
43
+ helpers :timer, :thread, :retry_state
43
44
 
44
45
  Fluent::Plugin.register_input('opensearch', self)
45
46
 
@@ -80,7 +81,24 @@ module Fluent::Plugin
80
81
  config_param :docinfo_fields, :array, :default => ['_index', '_type', '_id']
81
82
  config_param :docinfo_target, :string, :default => METADATA
82
83
  config_param :docinfo, :bool, :default => false
83
- config_param :infinite_check_connection, :bool, :default => true
84
+ config_param :check_connection, :bool, :default => true
85
+ config_param :retry_forever, :bool, default: true, desc: 'If true, plugin will ignore retry_timeout and retry_max_times options and retry forever.'
86
+ config_param :retry_timeout, :time, default: 72 * 60 * 60, desc: 'The maximum seconds to retry to flush while failing, until plugin discards buffer chunks.'
87
+ # 72hours == 17 times with exponential backoff (not to change default behavior)
88
+ config_param :retry_max_times, :integer, default: nil, desc: 'The maximum number of times to retry to flush while failing.'
89
+ config_param :retry_secondary_threshold, :float, default: 0.8, desc: 'ratio of retry_timeout to switch to use secondary while failing.'
90
+ # exponential backoff sequence will be initialized at the time of this threshold
91
+ config_param :retry_type, :enum, list: [:exponential_backoff, :periodic], default: :periodic
92
+ ### Periodic -> fixed :retry_wait
93
+ ### Exponential backoff: k is number of retry times
94
+ # c: constant factor, @retry_wait
95
+ # b: base factor, @retry_exponential_backoff_base
96
+ # k: times
97
+ # total retry time: c + c * b^1 + (...) + c*b^k = c*b^(k+1) - 1
98
+ config_param :retry_wait, :time, default: 1, desc: 'Seconds to wait before next retry to flush, or constant factor of exponential backoff.'
99
+ config_param :retry_exponential_backoff_base, :float, default: 2, desc: 'The base number of exponential backoff for retries.'
100
+ config_param :retry_max_interval, :time, default: nil, desc: 'The maximum interval seconds for exponential backoff between retries while failing.'
101
+ config_param :retry_randomize, :bool, default: false, desc: 'If true, output plugin will retry after randomized interval not to do burst retries.'
84
102
 
85
103
  include Fluent::Plugin::OpenSearchConstants
86
104
 
@@ -93,6 +111,7 @@ module Fluent::Plugin
93
111
 
94
112
  @timestamp_parser = create_time_parser
95
113
  @backend_options = backend_options
114
+ @retry = retry_state(@retry_randomize)
96
115
 
97
116
  raise Fluent::ConfigError, "`password` must be present if `user` is present" if @user && @password.nil?
98
117
 
@@ -139,6 +158,15 @@ module Fluent::Plugin
139
158
  raise Fluent::ConfigError, "You must install #{@http_backend} gem. Exception: #{ex}"
140
159
  end
141
160
 
161
+ def retry_state(randomize)
162
+ retry_state_create(
163
+ :input_retries,@retry_type,@retry_type,@retry_timeout,
164
+ forever: @retry_forever,max_steps: @retry_max_times,
165
+ max_interval: @retry_max_interval,backoff_base: @retry_exponential_backoff_base,
166
+ randomize: randomize
167
+ )
168
+ end
169
+
142
170
  def get_escaped_userinfo(host_str)
143
171
  if m = host_str.match(/(?<scheme>.*)%{(?<user>.*)}:%{(?<password>.*)}(?<path>@.*)/)
144
172
  m["scheme"] +
@@ -177,12 +205,33 @@ module Fluent::Plugin
177
205
  host.merge!(user: @user, password: @password) if !host[:user] && @user
178
206
  host.merge!(path: @path) if !host[:path] && @path
179
207
  end
180
-
208
+ live_hosts = hosts.select { |host| reachable_host?(host) }
181
209
  {
182
- hosts: hosts
210
+ hosts: live_hosts
183
211
  }
184
212
  end
185
213
 
214
+ def reachable_host?(host)
215
+ if @check_connection
216
+ client = OpenSearch::Client.new(
217
+ host: ["#{host[:scheme]}://#{host[:host]}:#{host[:port]}"],
218
+ user: host[:user],
219
+ password: host[:password],
220
+ reload_connections: @reload_connections,
221
+ request_timeout: @request_timeout,
222
+ resurrect_after: @resurrect_after,
223
+ reload_on_failure: @reload_on_failure,
224
+ transport_options: { ssl: { verify: @ssl_verify, ca_file: @ca_file, version: @ssl_version } }
225
+ )
226
+ client.ping
227
+ else
228
+ true
229
+ end
230
+ rescue => e
231
+ log.warn "Failed to connect to #{host[:scheme]}://#{host[:host]}:#{host[:port]}: #{e.message}"
232
+ false
233
+ end
234
+
186
235
  def emit_error_label_event(&block)
187
236
  # If `emit_error_label_event` is specified as false, error event emittions are not occurred.
188
237
  if emit_error_label_event
@@ -303,30 +352,39 @@ module Fluent::Plugin
303
352
  run_slice(slice_id)
304
353
  end
305
354
  end
306
- rescue Faraday::ConnectionFailed => e
307
- log.warn "Connection to OpenSearch failed during search in the 'run' method: #{e.message}. Retrying..."
308
- retry
355
+ rescue => e
356
+ @retry.step
357
+ # Check if the retry limit has been reached
358
+ if @retry.limit?
359
+ msg = "Hit limit for retries."
360
+ log.warn msg, retry_times: @retry.steps, error: e.message
361
+ break
362
+ else
363
+ msg = "failed to connect or search."
364
+ log.warn(msg, retry_times: @retry.steps, next_retry_time: @retry.next_time.round, error: error)
365
+ sleep(@retry.next_time - Time.now)
366
+ retry
367
+ end
309
368
  end
310
369
 
311
370
  def run_slice(slice_id=nil)
312
- client.ping
313
- # slice_query = @base_query
314
- # slice_query = slice_query.merge('slice' => { 'id' => slice_id, 'max' => @num_slices}) unless slice_id.nil?
315
- # result = client.search(@options.merge(:body => Yajl.dump(slice_query) ))
316
- # es = Fluent::MultiEventStream.new
317
-
318
- # result["hits"]["hits"].each {|hit| process_events(hit, es)}
319
- # has_hits = result['hits']['hits'].any?
320
- # scroll_id = result['_scroll_id']
321
-
322
- # while has_hits && scroll_id
323
- # result = process_next_scroll_request(es, scroll_id)
324
- # has_hits = result['has_hits']
325
- # scroll_id = result['_scroll_id']
326
- # end
327
-
328
- # router.emit_stream(@tag, es)
329
- # clear_scroll(scroll_id)
371
+ slice_query = @base_query
372
+ slice_query = slice_query.merge('slice' => { 'id' => slice_id, 'max' => @num_slices}) unless slice_id.nil?
373
+ result = client.search(@options.merge(:body => Yajl.dump(slice_query) ))
374
+ es = Fluent::MultiEventStream.new
375
+
376
+ result["hits"]["hits"].each {|hit| process_events(hit, es)}
377
+ has_hits = result['hits']['hits'].any?
378
+ scroll_id = result['_scroll_id']
379
+
380
+ while has_hits && scroll_id
381
+ result = process_next_scroll_request(es, scroll_id)
382
+ has_hits = result['has_hits']
383
+ scroll_id = result['_scroll_id']
384
+ end
385
+
386
+ router.emit_stream(@tag, es)
387
+ clear_scroll(scroll_id)
330
388
  end
331
389
 
332
390
  def clear_scroll(scroll_id)
@@ -39,7 +39,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
39
39
  CONFIG = %[
40
40
  tag raw.opensearch
41
41
  interval 2
42
- infinite_check_connection false
42
+ check_connection false
43
43
  ]
44
44
 
45
45
  def setup
@@ -191,7 +191,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
191
191
  user john
192
192
  password doe
193
193
  tag raw.opensearch
194
- infinite_check_connection false
194
+ check_connection false
195
195
  }
196
196
  instance = driver(config).instance
197
197
 
@@ -230,7 +230,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
230
230
  user john
231
231
  password doe
232
232
  tag raw.opensearch
233
- infinite_check_connection false
233
+ check_connection false
234
234
  }
235
235
  instance = driver(config).instance
236
236
 
@@ -252,7 +252,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
252
252
  user %{j+hn}
253
253
  password %{d@e}
254
254
  tag raw.opensearch
255
- infinite_check_connection false
255
+ check_connection false
256
256
  }
257
257
  instance = driver(config).instance
258
258
 
@@ -275,7 +275,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
275
275
  path /es/
276
276
  port 123
277
277
  tag raw.opensearch
278
- infinite_check_connection false
278
+ check_connection false
279
279
  }
280
280
  instance = driver(config).instance
281
281
 
@@ -300,7 +300,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
300
300
  user default_user
301
301
  password default_password
302
302
  tag raw.opensearch
303
- infinite_check_connection false
303
+ check_connection false
304
304
  }
305
305
  instance = driver(config).instance
306
306
 
@@ -329,7 +329,7 @@ class OpenSearchInputTest < Test::Unit::TestCase
329
329
  user default_user
330
330
  password default_password
331
331
  tag raw.opensearch
332
- infinite_check_connection false
332
+ check_connection false
333
333
  }
334
334
  instance = driver(config).instance
335
335
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-opensearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.2
4
+ version: 0.0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-15 00:00:00.000000000 Z
11
+ date: 2024-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd