fluent-plugin-elasticsearch 2.10.0 → 2.10.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 +4 -4
- data/History.md +4 -0
- data/README.md +16 -0
- data/fluent-plugin-elasticsearch.gemspec +1 -1
- data/lib/fluent/plugin/elasticsearch_error_handler.rb +2 -2
- data/lib/fluent/plugin/out_elasticsearch.rb +3 -1
- data/test/plugin/test_elasticsearch_error_handler.rb +11 -7
- data/test/plugin/test_out_elasticsearch.rb +34 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e64450e9c4dca90c39c52e6c9bd2a6b3bc3958644f608fde7444c2024f68b62
|
4
|
+
data.tar.gz: 05a52be8643cacf7e5301d50a6d545c7105acd84ffca1ba417551929d4c0fed4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e6c52a7f807205e3f851039710b207f0afccdafd3fe9337a471e65752bc9aa8a5737790b33d0dc2e1a09569cad282cdc97450e3cffb23bef16907b9680cf521
|
7
|
+
data.tar.gz: af806e72ce8af92c9486432feca7d2a5fc1f5c241d98de54af6301321864fb29a88c2a81be1c487bb81292947d9d970df10d95b6b683434910b0c52b82bbb589
|
data/History.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
### [Unreleased]
|
4
4
|
|
5
|
+
### 2.10.1
|
6
|
+
- Uplift Merge pull request #419 from jcantrill/retry_prefix (#421)
|
7
|
+
- Uplift Merge pull request #418 from jcantrill/emit_exception (#420)
|
8
|
+
|
5
9
|
### 2.10.0
|
6
10
|
- Uplift Merge pull request #405 from jcantrill/sanitize_bulk (#414)
|
7
11
|
|
data/README.md
CHANGED
@@ -47,6 +47,7 @@ Current maintainers: @cosmo0920
|
|
47
47
|
+ [remove_keys](#remove_keys)
|
48
48
|
+ [remove_keys_on_update](#remove_keys_on_update)
|
49
49
|
+ [remove_keys_on_update_key](#remove_keys_on_update_key)
|
50
|
+
+ [retry_tag](#retry_tag)
|
50
51
|
+ [write_operation](#write_operation)
|
51
52
|
+ [time_parse_error_tag](#time_parse_error_tag)
|
52
53
|
+ [reconnect_on_error](#reconnect_on_error)
|
@@ -526,6 +527,21 @@ present in the record then the keys in record are used, if the `remove_keys_on_u
|
|
526
527
|
remove_keys_on_update_key keys_to_skip
|
527
528
|
```
|
528
529
|
|
530
|
+
### retry_tag
|
531
|
+
|
532
|
+
This setting allows custom routing of messages in response to bulk request failures. The default behavior is to emit
|
533
|
+
failed records using the same tag that was provided. When set to a value other then `nil`, failed messages are emitted
|
534
|
+
with the specified tag:
|
535
|
+
|
536
|
+
```
|
537
|
+
retry_tag 'retry_es'
|
538
|
+
```
|
539
|
+
**NOTE:** `retry_tag` is optional. If you would rather use labels to reroute retries, add a label (e.g '@label @SOMELABEL') to your fluent
|
540
|
+
elasticsearch plugin configuration. Retry records are, by default, submitted for retry to the ROOT label, which means
|
541
|
+
records will flow through your fluentd pipeline from the beginning. This may nor may not be a problem if the pipeline
|
542
|
+
is idempotent - that is - you can process a record again with no changes. Use tagging or labeling to ensure your retry
|
543
|
+
records are not processed again by your fluentd processing pipeline.
|
544
|
+
|
529
545
|
### write_operation
|
530
546
|
|
531
547
|
The write_operation can be any of:
|
@@ -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 = '2.10.
|
6
|
+
s.version = '2.10.1'
|
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}
|
@@ -61,7 +61,7 @@ class Fluent::Plugin::ElasticsearchErrorHandler
|
|
61
61
|
stats[:duplicates] += 1
|
62
62
|
when 400 == status
|
63
63
|
stats[:bad_argument] += 1
|
64
|
-
@plugin.router.emit_error_event(tag, time, rawrecord, '400 - Rejected by Elasticsearch')
|
64
|
+
@plugin.router.emit_error_event(tag, time, rawrecord, ElasticsearchError.new('400 - Rejected by Elasticsearch'))
|
65
65
|
else
|
66
66
|
if item[write_operation].has_key?('error') && item[write_operation]['error'].has_key?('type')
|
67
67
|
type = item[write_operation]['error']['type']
|
@@ -71,7 +71,7 @@ class Fluent::Plugin::ElasticsearchErrorHandler
|
|
71
71
|
# When we don't have a type field, something changed in the API
|
72
72
|
# expected return values (ES 2.x)
|
73
73
|
stats[:errors_bad_resp] += 1
|
74
|
-
@plugin.router.emit_error_event(tag, time, rawrecord, "#{status} - No error type provided in the response")
|
74
|
+
@plugin.router.emit_error_event(tag, time, rawrecord, ElasticsearchError.new("#{status} - No error type provided in the response"))
|
75
75
|
next
|
76
76
|
end
|
77
77
|
stats[type] += 1
|
@@ -67,6 +67,7 @@ EOC
|
|
67
67
|
config_param :request_timeout, :time, :default => 5
|
68
68
|
config_param :reload_connections, :bool, :default => true
|
69
69
|
config_param :reload_on_failure, :bool, :default => false
|
70
|
+
config_param :retry_tag, :string, :default=>nil
|
70
71
|
config_param :resurrect_after, :time, :default => 60
|
71
72
|
config_param :time_key, :string, :default => nil
|
72
73
|
config_param :time_key_exclude_timestamp, :bool, :default => false
|
@@ -510,7 +511,8 @@ EOC
|
|
510
511
|
error.handle_error(response, tag, chunk, bulk_message_count, extracted_values)
|
511
512
|
end
|
512
513
|
rescue RetryStreamError => e
|
513
|
-
|
514
|
+
emit_tag = @retry_tag ? @retry_tag : tag
|
515
|
+
router.emit_stream(emit_tag, e.retry_stream)
|
514
516
|
rescue *client.transport.host_unreachable_exceptions => e
|
515
517
|
if retries < 2
|
516
518
|
retries += 1
|
@@ -11,7 +11,7 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
|
|
11
11
|
def initialize(log)
|
12
12
|
@log = log
|
13
13
|
@write_operation = 'index'
|
14
|
-
@error_events =
|
14
|
+
@error_events = []
|
15
15
|
end
|
16
16
|
|
17
17
|
def router
|
@@ -19,7 +19,7 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def emit_error_event(tag, time, record, e)
|
22
|
-
@error_events
|
22
|
+
@error_events << {:tag => tag, :time=>time, :record=>record, :error=>e}
|
23
23
|
end
|
24
24
|
|
25
25
|
def process_message(tag, meta, header, time, record, bulk_message, extracted_values)
|
@@ -72,7 +72,8 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
|
|
72
72
|
chunk = MockChunk.new(records)
|
73
73
|
dummy_extracted_values = []
|
74
74
|
@handler.handle_error(response, 'atag', chunk, records.length, dummy_extracted_values)
|
75
|
-
assert_equal(1, @plugin.error_events.
|
75
|
+
assert_equal(1, @plugin.error_events.size)
|
76
|
+
assert_true(@plugin.error_events[0][:error].respond_to?(:backtrace))
|
76
77
|
end
|
77
78
|
|
78
79
|
def test_retry_error
|
@@ -179,10 +180,13 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
|
|
179
180
|
assert_equal 2, records[0]['_id']
|
180
181
|
assert_equal 6, records[1]['_id']
|
181
182
|
assert_equal 8, records[2]['_id']
|
182
|
-
|
183
|
-
assert_equal 2,
|
184
|
-
assert_equal 5,
|
185
|
-
assert_equal 7,
|
183
|
+
error_ids = @plugin.error_events.collect {|h| h[:record]['_id']}
|
184
|
+
assert_equal 2, error_ids.length
|
185
|
+
assert_equal 5, error_ids[0]
|
186
|
+
assert_equal 7, error_ids[1]
|
187
|
+
@plugin.error_events.collect {|h| h[:error]}.each do |e|
|
188
|
+
assert_true e.respond_to?(:backtrace)
|
189
|
+
end
|
186
190
|
end
|
187
191
|
assert_true failed
|
188
192
|
|
@@ -1718,6 +1718,40 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
1718
1718
|
assert_equal(connection_resets, 1)
|
1719
1719
|
end
|
1720
1720
|
|
1721
|
+
def test_bulk_error_retags_when_configured
|
1722
|
+
driver.configure("retry_tag retry\n")
|
1723
|
+
stub_elastic_ping
|
1724
|
+
stub_request(:post, 'http://localhost:9200/_bulk')
|
1725
|
+
.to_return(lambda do |req|
|
1726
|
+
{ :status => 200,
|
1727
|
+
:headers => { 'Content-Type' => 'json' },
|
1728
|
+
:body => %({
|
1729
|
+
"took" : 1,
|
1730
|
+
"errors" : true,
|
1731
|
+
"items" : [
|
1732
|
+
{
|
1733
|
+
"create" : {
|
1734
|
+
"_index" : "foo",
|
1735
|
+
"_type" : "bar",
|
1736
|
+
"_id" : "abc",
|
1737
|
+
"status" : 500,
|
1738
|
+
"error" : {
|
1739
|
+
"type" : "some unrecognized type",
|
1740
|
+
"reason":"some error to cause version mismatch"
|
1741
|
+
}
|
1742
|
+
}
|
1743
|
+
}
|
1744
|
+
]
|
1745
|
+
})
|
1746
|
+
}
|
1747
|
+
end)
|
1748
|
+
|
1749
|
+
driver.run(default_tag: 'test') do
|
1750
|
+
driver.feed(1, sample_record)
|
1751
|
+
end
|
1752
|
+
|
1753
|
+
assert_equal [['retry', 1, sample_record]], driver.events
|
1754
|
+
end
|
1721
1755
|
|
1722
1756
|
def test_bulk_error
|
1723
1757
|
stub_elastic_ping
|
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: 2.10.
|
4
|
+
version: 2.10.1
|
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: 2018-05-
|
12
|
+
date: 2018-05-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|