fluent-plugin-opensearch 1.0.1 → 1.0.2

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: 9dc42f6d13cb540c456050657cd2079a7b755a77e4148122f486be2b15486db7
4
- data.tar.gz: 76bc650e96fc7b35a84641f6b0916024985bdccb779e54ef4e49d2172eb6227f
3
+ metadata.gz: 6382f3ad5be4b3c2c5aaa425568e4421c761bcb8cc5de65369123d01830a8888
4
+ data.tar.gz: 3e38aceba420423bf15065a0203ed6d696fa862d86d365a090d72d8da290a92a
5
5
  SHA512:
6
- metadata.gz: dfa28860c87c55fcffba26a9d4990e64d909b8daf5e0ed68dfe309d6fcd3d78b61f41738bff3a88e6ffd780f1c870e0a95a151c5637c228f488253e2ac889a79
7
- data.tar.gz: 77045d8ba592eaf9daf904b5d10ac36935c8d0ac13decff011e281cc0732e72f5b02ba69e196a8822a303dcb399752fe081d2bb846e0a19a93123513eac763e3
6
+ metadata.gz: 0bccfd9d20535f856b4dd115eb9126efc2cf2cfbe02d52fcb1f2e14db43747ee90de71f87873924540ea973f1d077d4618b87beb053e09e4d1c52d7b1b33bcc6
7
+ data.tar.gz: 3d9a7ce81fbb624f4af5e42dcfef10e4059073523a5b410af67575cffb11bf7e243f11d66cc6bf87851ea5e5dd0f2f7d76100923d53cf386df82ede3beb0c3ad
data/History.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ### [Unreleased]
4
4
 
5
+ ### 1.0.2
6
+ - Honor @hosts parameter for Data Streams (#21)
7
+ - Use template_file for Data Streams (#20)
8
+ - Specify host argument if needed (#11)
9
+
5
10
  ### 1.0.1
6
11
  - Add testcases for hosts parameter (#10)
7
12
  - Permit to handle @hosts parameter (#9)
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = 'fluent-plugin-opensearch'
6
- s.version = '1.0.1'
6
+ s.version = '1.0.2'
7
7
  s.authors = ['Hiroshi Hatake']
8
8
  s.email = ['cosmo0920.wp@gmail.com']
9
9
  s.description = %q{Opensearch output plugin for Fluent event collector}
@@ -29,16 +29,14 @@ module Fluent::Plugin
29
29
  @data_stream_names = []
30
30
  end
31
31
 
32
- host = data_stream_connection
33
-
34
32
  unless @use_placeholder
35
33
  begin
36
34
  @data_stream_names = [@data_stream_name]
37
35
  retry_operate(@max_retry_putting_template,
38
36
  @fail_on_putting_template_retry_exceed,
39
37
  @catch_transport_exception_on_retry) do
40
- create_index_template(@data_stream_name, @data_stream_template_name, host)
41
- create_data_stream(@data_stream_name, host)
38
+ create_index_template(@data_stream_name, @data_stream_template_name)
39
+ create_data_stream(@data_stream_name)
42
40
  end
43
41
  rescue => e
44
42
  raise Fluent::ConfigError, "Failed to create data stream: <#{@data_stream_name}> #{e.message}"
@@ -46,18 +44,9 @@ module Fluent::Plugin
46
44
  end
47
45
  end
48
46
 
49
- # FIXME: Currently, the first element from hosts is only used and extracted.
50
- def data_stream_connection
51
- if host = get_connection_options[:hosts].first
52
- "#{host[:scheme]}://#{host[:host]}:#{host[:port]}#{host[:path]}"
53
- else
54
- @host
55
- end
56
- end
57
-
58
47
  def validate_data_stream_parameters
59
48
  {"data_stream_name" => @data_stream_name,
60
- "data_stream_template_name"=> @data_stream_template_name}.each do |parameter, value|
49
+ "data_stream_template_name" => @data_stream_template_name}.each do |parameter, value|
61
50
  unless valid_data_stream_parameters?(value)
62
51
  unless start_with_valid_characters?(value)
63
52
  if not_dots?(value)
@@ -80,19 +69,25 @@ module Fluent::Plugin
80
69
  end
81
70
 
82
71
  def create_index_template(datastream_name, template_name, host = nil)
83
- return if data_stream_exist?(datastream_name) or template_exists?(template_name, host)
84
- body = {
85
- "index_patterns" => ["#{datastream_name}*"],
86
- "data_stream" => {},
87
- }
88
- params = {
89
- name: template_name,
90
- body: body
91
- }
92
- retry_operate(@max_retry_putting_template,
93
- @fail_on_putting_template_retry_exceed,
94
- @catch_transport_exception_on_retry) do
95
- client(host).indices.put_index_template(params)
72
+ # Create index template from file
73
+ if @template_file
74
+ template_installation_actual(template_name, @customize_template, @application_name, datastream_name, host)
75
+ else # Create default index template
76
+ return if data_stream_exist?(datastream_name, host) or template_exists?(template_name, host)
77
+ body = {
78
+ "index_patterns" => ["#{datastream_name}*"],
79
+ "data_stream" => {},
80
+ }
81
+
82
+ params = {
83
+ name: template_name,
84
+ body: body
85
+ }
86
+ retry_operate(@max_retry_putting_template,
87
+ @fail_on_putting_template_retry_exceed,
88
+ @catch_transport_exception_on_retry) do
89
+ client(host).indices.put_index_template(params)
90
+ end
96
91
  end
97
92
  end
98
93
 
@@ -169,8 +164,13 @@ module Fluent::Plugin
169
164
  def write(chunk)
170
165
  data_stream_name = @data_stream_name
171
166
  data_stream_template_name = @data_stream_template_name
172
- host = @host
167
+ host = nil
173
168
  if @use_placeholder
169
+ host = if @hosts
170
+ extract_placeholders(@hosts, chunk)
171
+ else
172
+ extract_placeholders(@host, chunk)
173
+ end
174
174
  data_stream_name = extract_placeholders(@data_stream_name, chunk)
175
175
  data_stream_template_name = extract_placeholders(@data_stream_template_name, chunk)
176
176
  unless @data_stream_names.include?(data_stream_name)
@@ -0,0 +1,4 @@
1
+ {
2
+ "index_patterns": ["foo*"],
3
+ "data_stream": {}
4
+ }
@@ -118,6 +118,18 @@ class OpenSearchOutputDataStreamTest < Test::Unit::TestCase
118
118
  stub_data_stream(datastream_name)
119
119
  end
120
120
 
121
+ def stub_opensearch_with_store_index_command_counts(url="http://localhost:9200/_bulk")
122
+ if @index_command_counts == nil
123
+ @index_command_counts = {}
124
+ @index_command_counts.default = 0
125
+ end
126
+
127
+ stub_request(:post, url).with do |req|
128
+ index_cmds = req.body.split("\n").map {|r| JSON.parse(r) }
129
+ @index_command_counts[url] += index_cmds.size
130
+ end
131
+ end
132
+
121
133
  # ref. https://opensearch.org/docs/latest/opensearch/data-streams/
122
134
  class DataStreamNameTest < self
123
135
 
@@ -329,9 +341,9 @@ class OpenSearchOutputDataStreamTest < Test::Unit::TestCase
329
341
  data_stream_name default
330
342
  }
331
343
  stub_opensearch_info("https://host1:443/elastic//", "1.2.2",
332
- {'Authorization'=>'Basic am9objpwYXNzd29yZA=='})
344
+ {'Authorization'=>"Basic #{Base64.encode64('john:password').split.first}"})
333
345
  stub_opensearch_info("http://host2/default_path/_data_stream/default", "1.2.2",
334
- {'Authorization'=>'Basic am9objpwYXNzd29yZA=='})
346
+ {'Authorization'=>"Basic #{Base64.encode64('john:password').split.first}"})
335
347
  stub_existent_data_stream?("default", "https://host1/elastic/")
336
348
  instance = driver(config).instance
337
349
 
@@ -367,6 +379,19 @@ class OpenSearchOutputDataStreamTest < Test::Unit::TestCase
367
379
  assert_equal "foo", driver(conf).instance.data_stream_name
368
380
  end
369
381
 
382
+ def test_template_file
383
+ stub_default
384
+ cwd = File.dirname(__FILE__)
385
+ conf = config_element(
386
+ 'ROOT', '', {
387
+ '@type' => OPENSEARCH_DATA_STREAM_TYPE,
388
+ 'data_stream_name' => 'foo',
389
+ 'data_stream_template_name' => "foo_tpl",
390
+ 'template_file' => File.join(cwd, 'datastream_template.json')
391
+ })
392
+ assert_equal "foo", driver(conf).instance.data_stream_name
393
+ end
394
+
370
395
  def test_existent_data_stream
371
396
  stub_index_template
372
397
  stub_existent_data_stream?
@@ -484,13 +509,56 @@ class OpenSearchOutputDataStreamTest < Test::Unit::TestCase
484
509
  '@type' => OPENSEARCH_DATA_STREAM_TYPE,
485
510
  'data_stream_name' => 'foo',
486
511
  'data_stream_template_name' => 'foo_tpl'
487
- })
512
+ })
488
513
  driver(conf).run(default_tag: 'test') do
489
514
  driver.feed(sample_record)
490
515
  end
491
516
  assert_equal 1, @bulk_records
492
517
  end
493
518
 
519
+ def test_placeholder_writes_to_multi_hosts
520
+ stub_default("foo_bar", "foo_tpl_bar")
521
+ hosts = [['192.168.33.50', 9201], ['192.168.33.51', 9201], ['192.168.33.52', 9201]]
522
+ hosts_string = hosts.map {|x| "#{x[0]}:#{x[1]}"}.compact.join(',')
523
+ hosts.each do |host_info|
524
+ host, port = host_info
525
+ stub_opensearch_with_store_index_command_counts("http://#{host}:#{port}/foo_bar/_bulk")
526
+ stub_opensearch_info("http://#{host}:#{port}/")
527
+ stub_request(:get, "http://#{host}:#{port}/_data_stream/foo_bar").
528
+ to_return(status: 200, body: "", headers: {})
529
+ end
530
+
531
+ conf = config_element(
532
+ 'ROOT', '', {
533
+ '@type' => OPENSEARCH_DATA_STREAM_TYPE,
534
+ 'data_stream_name' => 'foo_${key1}',
535
+ 'data_stream_template_name' => 'foo_tpl_${key1}',
536
+ 'hosts' => "#{hosts_string}"
537
+ }, [config_element('buffer', 'tag,key1', {
538
+ 'timekey' => '1d'
539
+ }, [])])
540
+ driver(conf).run(default_tag: 'test') do
541
+ hashes = {
542
+ 'age' => rand(100),
543
+ 'key1' => 'bar'
544
+ }
545
+ 1000.times do
546
+ driver.feed(sample_record.merge(hashes))
547
+ end
548
+ end
549
+
550
+ # @note: we cannot make multi chunks with options (flush_interval, buffer_chunk_limit)
551
+ # it's Fluentd test driver's constraint
552
+ # so @index_command_counts.size is always 1
553
+ assert(@index_command_counts.size > 0, "not working with hosts options")
554
+
555
+ total = 0
556
+ @index_command_counts.each do |_, count|
557
+ total += count
558
+ end
559
+ assert_equal(2000, total)
560
+ end
561
+
494
562
  def test_template_retry_install_fails
495
563
  cwd = File.dirname(__FILE__)
496
564
  template_file = File.join(cwd, 'test_index_template.json')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-opensearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroshi Hatake
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-31 00:00:00.000000000 Z
11
+ date: 2022-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -208,6 +208,7 @@ files:
208
208
  - lib/fluent/plugin/out_opensearch.rb
209
209
  - lib/fluent/plugin/out_opensearch_data_stream.rb
210
210
  - test/helper.rb
211
+ - test/plugin/datastream_template.json
211
212
  - test/plugin/test_alias_template.json
212
213
  - test/plugin/test_filter_opensearch_genid.rb
213
214
  - test/plugin/test_in_opensearch.rb
@@ -247,6 +248,7 @@ specification_version: 4
247
248
  summary: Opensearch output plugin for Fluent event collector
248
249
  test_files:
249
250
  - test/helper.rb
251
+ - test/plugin/datastream_template.json
250
252
  - test/plugin/test_alias_template.json
251
253
  - test/plugin/test_filter_opensearch_genid.rb
252
254
  - test/plugin/test_in_opensearch.rb