fluent-plugin-elasticsearch 1.18.1 → 1.18.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: f4e4ff948915da51a4c267d0350157b841c6b3f09862571d9777072d60d5c337
4
- data.tar.gz: dde99b5bd72bfadad60013689d8109b5776beb6ae942d65fad1ad8777df1ecb0
3
+ metadata.gz: ef82d990d532395ac70cfaca633811ecfec6e9277f02544a2fc73402aea79bd9
4
+ data.tar.gz: 30beccac0549c496631ba4943c2aae0161db08bb55966f38c1554b8c493beb12
5
5
  SHA512:
6
- metadata.gz: 13d604ed0ac1822333b5464efe34fd7f943b9c1151cbd2bf60c40356b028bab9164c6c66d26dd515c182d19a3f95f4b18e504d118212bf86be647b3681bd5659
7
- data.tar.gz: d90733254d79a977a12adc64a47f01315acfe391c3841f82c055be6aef20b1c209dd6e0d86620a581efd1b8b5f90b433fb6fb640126cda122b427802fc1beec3
6
+ metadata.gz: a7aaed653bb448e943265718258e9f92e2cb17fb778684483e58bac51c7a4175821aec96da2b6956ccf0f1b2e5c81775672f0c9ad34120e86b6e1e5f7b71aff2
7
+ data.tar.gz: 37a07ba5b227ce441396984abbedbafd6005d709df2b1489b39fcd5cdbb4e4aee820104b0cf99c944990133a227daa2ccde2b0a0d5f27a07929aa112e980d069
data/History.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  ### [Unreleased]
4
4
 
5
+ ### 1.18.2
6
+ - Retry upsert on recoverable error. (porting to v0.12) #667 (#684)
7
+
5
8
  ### 1.18.1
6
9
  - add new option to suppress doc wrapping (porting to v0.12) (#558)
7
10
 
@@ -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-elasticsearch'
6
- s.version = '1.18.1'
6
+ s.version = '1.18.2'
7
7
  s.authors = ['diogo', 'pitr']
8
8
  s.email = ['pitr.vern@gmail.com', 'me@diogoterror.com']
9
9
  s.description = %q{Elasticsearch output plugin for Fluent event collector}
@@ -0,0 +1,38 @@
1
+ require 'fluent/log'
2
+ # For elasticsearch-ruby v7.0.0 or later
3
+ # logger for Elasticsearch::Loggable required the following methods:
4
+ #
5
+ # * debug?
6
+ # * info?
7
+ # * warn?
8
+ # * error?
9
+ # * fatal?
10
+
11
+ module Fluent
12
+ class Log
13
+ # Elasticsearch::Loggable does not request trace? method.
14
+ # def trace?
15
+ # @level <= LEVEL_TRACE
16
+ # end
17
+
18
+ def debug?
19
+ @level <= LEVEL_DEBUG
20
+ end
21
+
22
+ def info?
23
+ @level <= LEVEL_INFO
24
+ end
25
+
26
+ def warn?
27
+ @level <= LEVEL_WARN
28
+ end
29
+
30
+ def error?
31
+ @level <= LEVEL_ERROR
32
+ end
33
+
34
+ def fatal?
35
+ @level <= LEVEL_FATAL
36
+ end
37
+ end
38
+ end
@@ -40,6 +40,8 @@ class Fluent::ElasticsearchErrorHandler
40
40
  write_operation = @plugin.write_operation
41
41
  elsif INDEX_OP == @plugin.write_operation && item.has_key?(CREATE_OP)
42
42
  write_operation = CREATE_OP
43
+ elsif UPSERT_OP == @plugin.write_operation && item.has_key?(UPDATE_OP)
44
+ write_operation = UPDATE_OP
43
45
  else
44
46
  # When we don't have an expected ops field, something changed in the API
45
47
  # expected return values (ES 2.x)
@@ -11,6 +11,7 @@ end
11
11
 
12
12
  require 'fluent/output'
13
13
  require 'fluent/event'
14
+ require 'fluent/log-ext'
14
15
  require_relative 'elasticsearch_constants'
15
16
  require_relative 'elasticsearch_error_handler'
16
17
  require_relative 'elasticsearch_index_template'
@@ -7,7 +7,8 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
7
7
 
8
8
  class TestPlugin
9
9
  attr_reader :log
10
- attr_reader :write_operation, :error_events
10
+ attr_reader :error_events
11
+ attr_accessor :write_operation
11
12
  def initialize(log)
12
13
  @log = log
13
14
  @write_operation = 'index'
@@ -80,21 +81,13 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
80
81
  assert_true(@plugin.error_events[0][:error].respond_to?(:backtrace))
81
82
  end
82
83
 
83
- def test_retry_error
84
- records = []
85
- error_records = Hash.new(false)
86
- error_records.merge!({0=>true, 4=>true, 9=>true})
87
- 10.times do |i|
88
- records << {time: 12345, record: {"message"=>"record #{i}","_id"=>i,"raise"=>error_records[i]}}
89
- end
90
- chunk = MockChunk.new(records)
91
-
92
- response = parse_response(%({
84
+ def create_mock_response(method)
85
+ parse_response(%({
93
86
  "took" : 1,
94
87
  "errors" : true,
95
88
  "items" : [
96
89
  {
97
- "create" : {
90
+ "#{method}" : {
98
91
  "_index" : "foo",
99
92
  "_type" : "bar",
100
93
  "_id" : "1",
@@ -102,7 +95,7 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
102
95
  }
103
96
  },
104
97
  {
105
- "create" : {
98
+ "#{method}" : {
106
99
  "_index" : "foo",
107
100
  "_type" : "bar",
108
101
  "_id" : "2",
@@ -114,15 +107,19 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
114
107
  }
115
108
  },
116
109
  {
117
- "create" : {
110
+ "#{method}" : {
118
111
  "_index" : "foo",
119
112
  "_type" : "bar",
120
113
  "_id" : "3",
121
- "status" : 409
114
+ "status" : 409,
115
+ "error" : {
116
+ "type":"version_conflict_engine_exception",
117
+ "reason":"document already exists"
118
+ }
122
119
  }
123
120
  },
124
121
  {
125
- "create" : {
122
+ "#{method}" : {
126
123
  "_index" : "foo",
127
124
  "_type" : "bar",
128
125
  "_id" : "5",
@@ -133,7 +130,7 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
133
130
  }
134
131
  },
135
132
  {
136
- "create" : {
133
+ "#{method}" : {
137
134
  "_index" : "foo",
138
135
  "_type" : "bar",
139
136
  "_id" : "6",
@@ -145,7 +142,7 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
145
142
  }
146
143
  },
147
144
  {
148
- "create" : {
145
+ "#{method}" : {
149
146
  "_index" : "foo",
150
147
  "_type" : "bar",
151
148
  "_id" : "7",
@@ -157,7 +154,7 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
157
154
  }
158
155
  },
159
156
  {
160
- "create" : {
157
+ "#{method}" : {
161
158
  "_index" : "foo",
162
159
  "_type" : "bar",
163
160
  "_id" : "8",
@@ -170,7 +167,18 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
170
167
  }
171
168
  ]
172
169
  }))
170
+ end
171
+
172
+ def test_retry_error_index
173
+ records = []
174
+ error_records = Hash.new(false)
175
+ error_records.merge!({0=>true, 4=>true, 9=>true})
176
+ 10.times do |i|
177
+ records << {time: 12345, record: {"message"=>"record #{i}","_id"=>i,"raise"=>error_records[i]}}
178
+ end
179
+ chunk = MockChunk.new(records)
173
180
 
181
+ response = create_mock_response('create')
174
182
  begin
175
183
  failed = false
176
184
  @handler.handle_error(response, 'atag', chunk, response['items'].length)
@@ -195,6 +203,42 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
195
203
 
196
204
  end
197
205
 
206
+ def test_retry_error_upsert
207
+ @plugin.write_operation = 'upsert'
208
+ records = []
209
+ error_records = Hash.new(false)
210
+ error_records.merge!({0=>true, 4=>true, 9=>true})
211
+ 10.times do |i|
212
+ records << {time: 12345, record: {"message"=>"record #{i}","_id"=>i,"raise"=>error_records[i]}}
213
+ end
214
+ chunk = MockChunk.new(records)
215
+
216
+ response = create_mock_response('update')
217
+ begin
218
+ failed = false
219
+ @handler.handle_error(response, 'atag', chunk, response['items'].length)
220
+ rescue Fluent::ElasticsearchOutput::RetryStreamError=>e
221
+ failed = true
222
+ records = [].tap do |records|
223
+ e.retry_stream.each {|time, record| records << record}
224
+ end
225
+ assert_equal 4, records.length
226
+ assert_equal 2, records[0]['_id']
227
+ # upsert is retried in case of conflict error.
228
+ assert_equal 3, records[1]['_id']
229
+ assert_equal 6, records[2]['_id']
230
+ assert_equal 8, records[3]['_id']
231
+ error_ids = @plugin.error_events.collect {|h| h[:record]['_id']}
232
+ assert_equal 2, error_ids.length
233
+ assert_equal 5, error_ids[0]
234
+ assert_equal 7, error_ids[1]
235
+ @plugin.error_events.collect {|h| h[:error]}.each do |e|
236
+ assert_true e.respond_to?(:backtrace)
237
+ end
238
+ end
239
+ assert_true failed
240
+ end
241
+
198
242
  def test_old_es_1_X_responses
199
243
  records = [{time: 123, record: {"foo" => "bar", '_id' => 'abc'}}]
200
244
  response = parse_response(%({
@@ -0,0 +1,33 @@
1
+ require 'helper'
2
+ require 'fluent/log-ext'
3
+
4
+ class TestFluentLogExtHandler < Test::Unit::TestCase
5
+ def setup
6
+ @log = Fluent::Test::TestLogger.new
7
+ @log.level = "info"
8
+ end
9
+
10
+ def test_trace?
11
+ assert_false @log.respond_to?(:trace?)
12
+ end
13
+
14
+ def test_debug?
15
+ assert_true @log.respond_to?(:debug?)
16
+ end
17
+
18
+ def test_info?
19
+ assert_true @log.respond_to?(:info?)
20
+ end
21
+
22
+ def test_warn?
23
+ assert_true @log.respond_to?(:warn?)
24
+ end
25
+
26
+ def test_error?
27
+ assert_true @log.respond_to?(:error?)
28
+ end
29
+
30
+ def test_fatal?
31
+ assert_true @log.respond_to?(:fatal?)
32
+ end
33
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.18.1
4
+ version: 1.18.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - diogo
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-03-08 00:00:00.000000000 Z
12
+ date: 2019-12-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -144,6 +144,7 @@ files:
144
144
  - README.md
145
145
  - Rakefile
146
146
  - fluent-plugin-elasticsearch.gemspec
147
+ - lib/fluent/log-ext.rb
147
148
  - lib/fluent/plugin/elasticsearch_constants.rb
148
149
  - lib/fluent/plugin/elasticsearch_error_handler.rb
149
150
  - lib/fluent/plugin/elasticsearch_index_template.rb
@@ -157,6 +158,7 @@ files:
157
158
  - test/plugin/test_out_elasticsearch.rb
158
159
  - test/plugin/test_out_elasticsearch_dynamic.rb
159
160
  - test/plugin/test_template.json
161
+ - test/test_log-ext.rb
160
162
  homepage: https://github.com/uken/fluent-plugin-elasticsearch
161
163
  licenses:
162
164
  - Apache-2.0
@@ -176,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
178
  - !ruby/object:Gem::Version
177
179
  version: '0'
178
180
  requirements: []
179
- rubygems_version: 3.0.1
181
+ rubygems_version: 3.0.3
180
182
  signing_key:
181
183
  specification_version: 4
182
184
  summary: Elasticsearch output plugin for Fluent event collector
@@ -187,3 +189,4 @@ test_files:
187
189
  - test/plugin/test_out_elasticsearch.rb
188
190
  - test/plugin/test_out_elasticsearch_dynamic.rb
189
191
  - test/plugin/test_template.json
192
+ - test/test_log-ext.rb