fluent-plugin-elasticsearch 2.12.2 → 2.12.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +4 -0
- data/README.md +21 -0
- data/fluent-plugin-elasticsearch.gemspec +1 -1
- data/lib/fluent/plugin/elasticsearch_error_handler.rb +9 -1
- data/lib/fluent/plugin/elasticsearch_index_template.rb +2 -2
- data/lib/fluent/plugin/out_elasticsearch.rb +4 -2
- data/test/plugin/test_elasticsearch_error_handler.rb +45 -1
- data/test/plugin/test_out_elasticsearch.rb +4 -2
- 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: dbe9d45b32f6a3db242d3f41dfa7c9c56ee425c9f36bbea1866c8fe61795f214
|
4
|
+
data.tar.gz: 7070955261a6a34a2d27d97fd7c2b040d03d8ec725d7d58fedcda863a4aaa083
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 220580fb2c1405e355f49a30249ec1c5cb3f3774789d440057f3377f6493e26ca46569cd3081c7dc16493ea8056eb7fd12919d0c11137439e8bff55eb0749611
|
7
|
+
data.tar.gz: c90e537194d8986180fa183c757a19694c638dc324e9edc9b8fb46a355991f06efc08acfac7af47bb3587a3c66fb3b1a969361ae64cf5c9fa589d6aa00f6c7bd
|
data/History.md
CHANGED
data/README.md
CHANGED
@@ -36,6 +36,7 @@ Current maintainers: @cosmo0920
|
|
36
36
|
+ [template_overwrite](#template_overwrite)
|
37
37
|
+ [customize_template](#customize_template)
|
38
38
|
+ [rollover_index](#rollover_index)
|
39
|
+
+ [index_date_pattern](#index_date_pattern)
|
39
40
|
+ [deflector_alias](#deflector_alias)
|
40
41
|
+ [application_name](#application_name)
|
41
42
|
+ [index_prefix](#index_prefix)
|
@@ -76,6 +77,7 @@ Current maintainers: @cosmo0920
|
|
76
77
|
+ [Dynamic configuration](#dynamic-configuration)
|
77
78
|
+ [Placeholders](#placeholders)
|
78
79
|
+ [Multi workers](#multi-workers)
|
80
|
+
+ [log_es_400_reason](#log-es-400-reason)
|
79
81
|
* [Troubleshooting](#troubleshooting)
|
80
82
|
+ [Cannot send events to elasticsearch](#cannot-send-events-to-elasticsearch)
|
81
83
|
+ [Cannot see detailed failure log](#cannot-see-detailed-failure-log)
|
@@ -367,6 +369,19 @@ rollover_index true # defaults to false
|
|
367
369
|
|
368
370
|
If [customize_template](#customize_template) is set, then this parameter will be in effect otherwise ignored.
|
369
371
|
|
372
|
+
### index_date_pattern
|
373
|
+
|
374
|
+
Specify this to override the index date pattern for creating a rollover index. The default is to use "now/d",
|
375
|
+
for example: <logstash-default-{now/d}-000001>. Overriding this changes the rollover time period. Setting
|
376
|
+
"now/w{xxxx.ww}" would create weekly rollover indexes instead of daily.
|
377
|
+
|
378
|
+
This setting only takes effect when combined with the [rollover_index](#rollover_index) setting.
|
379
|
+
```
|
380
|
+
index_date_pattern "now/w{xxxx.ww}" # defaults to "now/d"
|
381
|
+
```
|
382
|
+
|
383
|
+
If [customize_template](#customize_template) is set, then this parameter will be in effect otherwise ignored.
|
384
|
+
|
370
385
|
### deflector_alias
|
371
386
|
|
372
387
|
Specify the deflector alias which would be assigned to the rollover index created. This is useful in case of using the Elasticsearch rollover API
|
@@ -970,6 +985,12 @@ Since Fluentd v0.14, multi workers feature had been implemented to increase thro
|
|
970
985
|
</system>
|
971
986
|
```
|
972
987
|
|
988
|
+
## log_es_400_reason
|
989
|
+
|
990
|
+
By default, the error logger won't record the reason for a 400 error from the Elasticsearch API unless you set log_level to debug. However, this results in a lot of log spam, which isn't desirable if all you want is the 400 error reasons. You can set this `true` to capture the 400 error reasons without all the other debug logs.
|
991
|
+
|
992
|
+
Default value is `false`.
|
993
|
+
|
973
994
|
## Troubleshooting
|
974
995
|
|
975
996
|
### Cannot send events to Elasticsearch
|
@@ -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.12.
|
6
|
+
s.version = '2.12.3'
|
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}
|
@@ -23,6 +23,14 @@ class Fluent::Plugin::ElasticsearchErrorHandler
|
|
23
23
|
unrecoverable_error_types.include?(type)
|
24
24
|
end
|
25
25
|
|
26
|
+
def log_es_400_reason(&block)
|
27
|
+
if @plugin.log_es_400_reason
|
28
|
+
block.call
|
29
|
+
else
|
30
|
+
@plugin.log.on_debug &block
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
26
34
|
def handle_error(response, tag, chunk, bulk_message_count, extracted_values)
|
27
35
|
items = response['items']
|
28
36
|
if items.nil? || !items.is_a?(Array)
|
@@ -74,7 +82,7 @@ class Fluent::Plugin::ElasticsearchErrorHandler
|
|
74
82
|
when 400 == status
|
75
83
|
stats[:bad_argument] += 1
|
76
84
|
reason = ""
|
77
|
-
|
85
|
+
log_es_400_reason do
|
78
86
|
if item[write_operation].has_key?('error') && item[write_operation]['error'].has_key?('type')
|
79
87
|
reason = " [error type]: #{item[write_operation]['error']['type']}"
|
80
88
|
end
|
@@ -68,7 +68,7 @@ module Fluent::ElasticsearchIndexTemplate
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
def template_custom_install(template_name, template_file, overwrite, customize_template, index_prefix, rollover_index, deflector_alias_name, app_name)
|
71
|
+
def template_custom_install(template_name, template_file, overwrite, customize_template, index_prefix, rollover_index, deflector_alias_name, app_name, index_date_pattern)
|
72
72
|
template_custom_name=template_name.downcase
|
73
73
|
if overwrite
|
74
74
|
template_put(template_custom_name, get_custom_template(template_file, customize_template))
|
@@ -83,7 +83,7 @@ module Fluent::ElasticsearchIndexTemplate
|
|
83
83
|
end
|
84
84
|
if rollover_index
|
85
85
|
if !client.indices.exists_alias(:name => deflector_alias_name)
|
86
|
-
index_name_temp='<'+index_prefix.downcase+'-'+app_name.downcase+'-{
|
86
|
+
index_name_temp='<'+index_prefix.downcase+'-'+app_name.downcase+'-{'+index_date_pattern+'}-000001>'
|
87
87
|
indexcreation(index_name_temp)
|
88
88
|
client.indices.put_alias(:index => index_name_temp, :name => deflector_alias_name)
|
89
89
|
log.info("The alias '#{deflector_alias_name}' is created for the index '#{index_name_temp}'")
|
@@ -100,6 +100,7 @@ EOC
|
|
100
100
|
config_param :template_overwrite, :bool, :default => false
|
101
101
|
config_param :customize_template, :hash, :default => nil
|
102
102
|
config_param :rollover_index, :string, :default => false
|
103
|
+
config_param :index_date_pattern, :string, :default => "now/d"
|
103
104
|
config_param :deflector_alias, :string, :default => nil
|
104
105
|
config_param :index_prefix, :string, :default => "logstash"
|
105
106
|
config_param :application_name, :string, :default => "default"
|
@@ -126,6 +127,7 @@ EOC
|
|
126
127
|
config_param :unrecoverable_error_types, :array, :default => ["out_of_memory_error", "es_rejected_execution_exception"]
|
127
128
|
config_param :verify_es_version_at_startup, :bool, :default => true
|
128
129
|
config_param :default_elasticsearch_version, :integer, :default => DEFAULT_ELASTICSEARCH_VERSION
|
130
|
+
config_param :log_es_400_reason, :bool, :default => false
|
129
131
|
|
130
132
|
config_section :buffer do
|
131
133
|
config_set_default :@type, DEFAULT_BUFFER_TYPE
|
@@ -166,14 +168,14 @@ EOC
|
|
166
168
|
end
|
167
169
|
|
168
170
|
raise Fluent::ConfigError, "'max_retry_putting_template' must be positive number." if @max_retry_putting_template < 0
|
169
|
-
|
171
|
+
|
170
172
|
if @template_name && @template_file
|
171
173
|
retry_install(@max_retry_putting_template) do
|
172
174
|
if @customize_template
|
173
175
|
if @rollover_index
|
174
176
|
raise Fluent::ConfigError, "'deflector_alias' must be provided if 'rollover_index' is set true ." if not @deflector_alias
|
175
177
|
end
|
176
|
-
template_custom_install(@template_name, @template_file, @template_overwrite, @customize_template, @index_prefix, @rollover_index, @deflector_alias, @application_name)
|
178
|
+
template_custom_install(@template_name, @template_file, @template_overwrite, @customize_template, @index_prefix, @rollover_index, @deflector_alias, @application_name, @index_date_pattern)
|
177
179
|
else
|
178
180
|
template_install(@template_name, @template_file, @template_overwrite)
|
179
181
|
end
|
@@ -9,11 +9,13 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
|
|
9
9
|
attr_reader :log
|
10
10
|
attr_reader :write_operation, :error_events
|
11
11
|
attr_accessor :unrecoverable_error_types
|
12
|
-
|
12
|
+
attr_accessor :log_es_400_reason
|
13
|
+
def initialize(log, log_es_400_reason = false)
|
13
14
|
@log = log
|
14
15
|
@write_operation = 'index'
|
15
16
|
@error_events = []
|
16
17
|
@unrecoverable_error_types = ["out_of_memory_error", "es_rejected_execution_exception"]
|
18
|
+
@log_es_400_reason = log_es_400_reason
|
17
19
|
end
|
18
20
|
|
19
21
|
def router
|
@@ -101,6 +103,48 @@ class TestElasticsearchErrorHandler < Test::Unit::TestCase
|
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
106
|
+
class TEST400ResponseReasonNoDebug < self
|
107
|
+
def setup
|
108
|
+
Fluent::Test.setup
|
109
|
+
@log_device = Fluent::Test::DummyLogDevice.new
|
110
|
+
dl_opts = {:log_level => ServerEngine::DaemonLogger::INFO}
|
111
|
+
logger = ServerEngine::DaemonLogger.new(@log_device, dl_opts)
|
112
|
+
@log = Fluent::Log.new(logger)
|
113
|
+
@plugin = TestPlugin.new(@log)
|
114
|
+
@handler = Fluent::Plugin::ElasticsearchErrorHandler.new(@plugin)
|
115
|
+
@plugin.log_es_400_reason = true
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_400_responses_reason_log
|
119
|
+
records = [{time: 123, record: {"foo" => "bar", '_id' => 'abc'}}]
|
120
|
+
response = parse_response(%({
|
121
|
+
"took" : 0,
|
122
|
+
"errors" : true,
|
123
|
+
"items" : [
|
124
|
+
{
|
125
|
+
"create" : {
|
126
|
+
"_index" : "foo",
|
127
|
+
"status" : 400,
|
128
|
+
"error" : {
|
129
|
+
"type" : "mapper_parsing_exception",
|
130
|
+
"reason" : "failed to parse"
|
131
|
+
}
|
132
|
+
}
|
133
|
+
}
|
134
|
+
]
|
135
|
+
}))
|
136
|
+
chunk = MockChunk.new(records)
|
137
|
+
dummy_extracted_values = []
|
138
|
+
@handler.handle_error(response, 'atag', chunk, records.length, dummy_extracted_values)
|
139
|
+
assert_equal(1, @plugin.error_events.size)
|
140
|
+
expected_log = "failed to parse"
|
141
|
+
exception_message = @plugin.error_events.first[:error].message
|
142
|
+
assert_true(exception_message.include?(expected_log),
|
143
|
+
"Exception do not contain '#{exception_message}' '#{expected_log}'")
|
144
|
+
assert_true(@plugin.error_events[0][:error].respond_to?(:backtrace))
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
104
148
|
def test_dlq_400_responses
|
105
149
|
records = [{time: 123, record: {"foo" => "bar", '_id' => 'abc'}}]
|
106
150
|
response = parse_response(%({
|
@@ -220,6 +220,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
220
220
|
assert_equal ["out_of_memory_error", "es_rejected_execution_exception"], instance.unrecoverable_error_types
|
221
221
|
assert_true instance.verify_es_version_at_startup
|
222
222
|
assert_equal Fluent::Plugin::ElasticsearchOutput::DEFAULT_ELASTICSEARCH_VERSION, instance.default_elasticsearch_version
|
223
|
+
assert_false instance.log_es_400_reason
|
223
224
|
end
|
224
225
|
|
225
226
|
test 'configure Content-Type' do
|
@@ -418,6 +419,7 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
418
419
|
template_file #{template_file}
|
419
420
|
customize_template {"--appid--": "myapp-logs","--index_prefix--":"mylogs"}
|
420
421
|
rollover_index true
|
422
|
+
index_date_pattern now/w{xxxx.ww}
|
421
423
|
deflector_alias myapp_deflector
|
422
424
|
index_prefix mylogs
|
423
425
|
application_name myapp
|
@@ -433,13 +435,13 @@ class ElasticsearchOutput < Test::Unit::TestCase
|
|
433
435
|
stub_request(:put, "https://john:doe@logs.google.com:777/es//_template/myapp_alias_template").
|
434
436
|
to_return(:status => 200, :body => "", :headers => {})
|
435
437
|
# creation of index which can rollover
|
436
|
-
stub_request(:put, "https://john:doe@logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%
|
438
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E").
|
437
439
|
to_return(:status => 200, :body => "", :headers => {})
|
438
440
|
# check if alias exists
|
439
441
|
stub_request(:head, "https://john:doe@logs.google.com:777/es//_alias/myapp_deflector").
|
440
442
|
to_return(:status => 404, :body => "", :headers => {})
|
441
443
|
# put the alias for the index
|
442
|
-
stub_request(:put, "https://john:doe@logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%
|
444
|
+
stub_request(:put, "https://john:doe@logs.google.com:777/es//%3Cmylogs-myapp-%7Bnow%2Fw%7Bxxxx.ww%7D%7D-000001%3E/_alias/myapp_deflector").
|
443
445
|
to_return(:status => 200, :body => "", :headers => {})
|
444
446
|
|
445
447
|
driver(config)
|
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.12.
|
4
|
+
version: 2.12.3
|
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-
|
12
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|