fluent-plugin-elasticsearch 5.1.1 → 5.1.5
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 +16 -1
- data/README.md +16 -1
- data/fluent-plugin-elasticsearch.gemspec +1 -1
- data/lib/fluent/plugin/out_elasticsearch.rb +2 -2
- data/lib/fluent/plugin/out_elasticsearch_data_stream.rb +39 -25
- data/test/plugin/test_out_elasticsearch_data_stream.rb +241 -29
- metadata +3 -5
- data/.travis.yml +0 -40
- data/appveyor.yml +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ae6214f54783c402097e26276b9247f1d58866b08cdc80be47d3b4638516d54
|
4
|
+
data.tar.gz: b69af374d04f84b2b1137189916c2b78f25eae71c2294d9a0cc196c30c09db29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29173c2331bc0e533aa1d3aa66aa555bad7802e5fbb4207641b11aebc0a18c0d4e44ebed0b167c8fe4bddf403d2dd5a61349afeffecfc28a65359c3bb4cce26b
|
7
|
+
data.tar.gz: 7fdf58624182bdd4e354cad2d4f9ba001cff5a8c8c0ba02ac043607a87e2372311deb85bc0306d3aa167e98170a6049f33f3203b202ebcf25eac75e65dc23a17
|
data/History.md
CHANGED
@@ -2,8 +2,23 @@
|
|
2
2
|
|
3
3
|
### [Unreleased]
|
4
4
|
|
5
|
+
### 5.1.5
|
6
|
+
- Make retryable DataStreams creation at configure phase (#943)
|
7
|
+
- Handle @hosts parameter on data_stream plugin (#942)
|
8
|
+
- allow specifying custom ILM policies for data streams (#933)
|
9
|
+
|
10
|
+
### 5.1.4
|
11
|
+
- Handle ES8 or above more strictly (#931)
|
12
|
+
- fixing double "\_policy" in index lifecycle management policy for elasticsearch\_data\_stream output (#930)
|
13
|
+
|
14
|
+
### 5.1.3
|
15
|
+
- fixing execution order for dynamic data stream creation (#928)
|
16
|
+
|
17
|
+
### 5.1.2
|
18
|
+
- Fix default values of datastream parameters (#926)
|
19
|
+
|
5
20
|
### 5.1.1
|
6
|
-
-
|
21
|
+
- Report appropriate error for data_stream parameters (#922)
|
7
22
|
- Add ILM and template parameters for data streams (#920)
|
8
23
|
- Support Buffer in Data Stream Output (#917)
|
9
24
|
|
data/README.md
CHANGED
@@ -1521,7 +1521,7 @@ You can enable this feature by specifying `@type elasticsearch_data_stream`.
|
|
1521
1521
|
data_stream_name test
|
1522
1522
|
```
|
1523
1523
|
|
1524
|
-
When `@type elasticsearch_data_stream` is used, unless specified with `data_stream_ilm_name` and `data_stream_template_name`, ILM default policy is set to the specified data stream.
|
1524
|
+
When `@type elasticsearch_data_stream` is used, unless specified with `data_stream_ilm_name` and `data_stream_template_name` or `data_stream_ilm_policy`, ILM default policy is set to the specified data stream.
|
1525
1525
|
Then, the matching index template is also created automatically.
|
1526
1526
|
|
1527
1527
|
### data_stream_name
|
@@ -1545,6 +1545,21 @@ There are some limitations about naming rule.
|
|
1545
1545
|
|
1546
1546
|
In more detail, please refer to the [Path parameters](https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-create-data-stream.html#indices-create-data-stream-api-path-params).
|
1547
1547
|
|
1548
|
+
|
1549
|
+
### data_stream_ilm_policy
|
1550
|
+
|
1551
|
+
You can specify the ILM policy contents as hash. If not present, it will apply the ILM default policy.
|
1552
|
+
|
1553
|
+
**NOTE:** This parameter requests to install elasticsearch-xpack gem.
|
1554
|
+
|
1555
|
+
### data_stream_ilm_policy_overwrite
|
1556
|
+
|
1557
|
+
Specify whether the data stream ILM policy should be overwritten.
|
1558
|
+
|
1559
|
+
Default value is `false`.
|
1560
|
+
|
1561
|
+
**NOTE:** This parameter requests to install elasticsearch-xpack gem.
|
1562
|
+
|
1548
1563
|
## Troubleshooting
|
1549
1564
|
|
1550
1565
|
See [Troubleshooting document](README.Troubleshooting.md)
|
@@ -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 = '5.1.
|
6
|
+
s.version = '5.1.5'
|
7
7
|
s.authors = ['diogo', 'pitr', 'Hiroshi Hatake']
|
8
8
|
s.email = ['pitr.vern@gmail.com', 'me@diogoterror.com', 'cosmo0920.wp@gmail.com']
|
9
9
|
s.description = %q{Elasticsearch output plugin for Fluent event collector}
|
@@ -987,12 +987,12 @@ EOC
|
|
987
987
|
elsif @last_seen_major_version == 7
|
988
988
|
log.warn "Detected ES 7.x: `_doc` will be used as the document `_type`."
|
989
989
|
target_type = '_doc'.freeze
|
990
|
-
elsif @last_seen_major_version >=8
|
990
|
+
elsif @last_seen_major_version >= 8
|
991
991
|
log.debug "Detected ES 8.x or above: document type will not be used."
|
992
992
|
target_type = nil
|
993
993
|
end
|
994
994
|
else
|
995
|
-
if @suppress_type_name && @last_seen_major_version
|
995
|
+
if @suppress_type_name && @last_seen_major_version == 7
|
996
996
|
target_type = nil
|
997
997
|
elsif @last_seen_major_version == 7 && @type_name != DEFAULT_TYPE_NAME_ES_7x
|
998
998
|
log.warn "Detected ES 7.x: `_doc` will be used as the document `_type`."
|
@@ -9,8 +9,11 @@ module Fluent::Plugin
|
|
9
9
|
helpers :event_emitter
|
10
10
|
|
11
11
|
config_param :data_stream_name, :string
|
12
|
-
config_param :data_stream_ilm_name, :string, :default =>
|
13
|
-
config_param :data_stream_template_name, :string, :default =>
|
12
|
+
config_param :data_stream_ilm_name, :string, :default => nil
|
13
|
+
config_param :data_stream_template_name, :string, :default => nil
|
14
|
+
config_param :data_stream_ilm_policy, :string, :default => nil
|
15
|
+
config_param :data_stream_ilm_policy_overwrite, :bool, :default => false
|
16
|
+
|
14
17
|
# Elasticsearch 7.9 or later always support new style of index template.
|
15
18
|
config_set_default :use_legacy_template, false
|
16
19
|
|
@@ -27,6 +30,10 @@ module Fluent::Plugin
|
|
27
30
|
raise Fluent::ConfigError, "'elasticsearch/api', 'elasticsearch/xpack' are required for <@elasticsearch_data_stream>."
|
28
31
|
end
|
29
32
|
|
33
|
+
@data_stream_ilm_name = "#{@data_stream_name}_policy" if @data_stream_ilm_name.nil?
|
34
|
+
@data_stream_template_name = "#{@data_stream_name}_template" if @data_stream_template_name.nil?
|
35
|
+
@data_stream_ilm_policy = File.read(File.join(File.dirname(__FILE__), "default-ilm-policy.json")) if @data_stream_ilm_policy.nil?
|
36
|
+
|
30
37
|
# ref. https://www.elastic.co/guide/en/elasticsearch/reference/master/indices-create-data-stream.html
|
31
38
|
unless placeholder?(:data_stream_name_placeholder, @data_stream_name)
|
32
39
|
validate_data_stream_parameters
|
@@ -35,13 +42,16 @@ module Fluent::Plugin
|
|
35
42
|
@data_stream_names = []
|
36
43
|
end
|
37
44
|
|
38
|
-
@client = client
|
39
45
|
unless @use_placeholder
|
40
46
|
begin
|
41
47
|
@data_stream_names = [@data_stream_name]
|
42
|
-
|
43
|
-
|
44
|
-
|
48
|
+
retry_operate(@max_retry_putting_template,
|
49
|
+
@fail_on_putting_template_retry_exceed,
|
50
|
+
@catch_transport_exception_on_retry) do
|
51
|
+
create_ilm_policy(@data_stream_name, @data_stream_template_name, @data_stream_ilm_name)
|
52
|
+
create_index_template(@data_stream_name, @data_stream_template_name, @data_stream_ilm_name)
|
53
|
+
create_data_stream(@data_stream_name)
|
54
|
+
end
|
45
55
|
rescue => e
|
46
56
|
raise Fluent::ConfigError, "Failed to create data stream: <#{@data_stream_name}> #{e.message}"
|
47
57
|
end
|
@@ -73,27 +83,30 @@ module Fluent::Plugin
|
|
73
83
|
end
|
74
84
|
end
|
75
85
|
|
76
|
-
def create_ilm_policy(datastream_name, template_name, ilm_name, host)
|
77
|
-
|
86
|
+
def create_ilm_policy(datastream_name, template_name, ilm_name, host = nil)
|
87
|
+
unless @data_stream_ilm_policy_overwrite
|
88
|
+
return if data_stream_exist?(datastream_name, host) or template_exists?(template_name, host) or ilm_policy_exists?(ilm_name, host)
|
89
|
+
end
|
90
|
+
|
78
91
|
params = {
|
79
|
-
policy_id:
|
80
|
-
body:
|
92
|
+
policy_id: ilm_name,
|
93
|
+
body: @data_stream_ilm_policy
|
81
94
|
}
|
82
95
|
retry_operate(@max_retry_putting_template,
|
83
96
|
@fail_on_putting_template_retry_exceed,
|
84
97
|
@catch_transport_exception_on_retry) do
|
85
|
-
|
98
|
+
client(host).xpack.ilm.put_policy(params)
|
86
99
|
end
|
87
100
|
end
|
88
101
|
|
89
|
-
def create_index_template(datastream_name, template_name, ilm_name, host)
|
90
|
-
return if data_stream_exist?(datastream_name) or template_exists?(template_name, host)
|
102
|
+
def create_index_template(datastream_name, template_name, ilm_name, host = nil)
|
103
|
+
return if data_stream_exist?(datastream_name, host) or template_exists?(template_name, host)
|
91
104
|
body = {
|
92
105
|
"index_patterns" => ["#{datastream_name}*"],
|
93
106
|
"data_stream" => {},
|
94
107
|
"template" => {
|
95
108
|
"settings" => {
|
96
|
-
"index.lifecycle.name" => "#{ilm_name}
|
109
|
+
"index.lifecycle.name" => "#{ilm_name}"
|
97
110
|
}
|
98
111
|
}
|
99
112
|
}
|
@@ -104,16 +117,16 @@ module Fluent::Plugin
|
|
104
117
|
retry_operate(@max_retry_putting_template,
|
105
118
|
@fail_on_putting_template_retry_exceed,
|
106
119
|
@catch_transport_exception_on_retry) do
|
107
|
-
|
120
|
+
client(host).indices.put_index_template(params)
|
108
121
|
end
|
109
122
|
end
|
110
123
|
|
111
|
-
def data_stream_exist?(datastream_name)
|
124
|
+
def data_stream_exist?(datastream_name, host = nil)
|
112
125
|
params = {
|
113
126
|
name: datastream_name
|
114
127
|
}
|
115
128
|
begin
|
116
|
-
response =
|
129
|
+
response = client(host).indices.get_data_stream(params)
|
117
130
|
return (not response.is_a?(Elasticsearch::Transport::Transport::Errors::NotFound))
|
118
131
|
rescue Elasticsearch::Transport::Transport::Errors::NotFound => e
|
119
132
|
log.info "Specified data stream does not exist. Will be created: <#{e}>"
|
@@ -121,21 +134,21 @@ module Fluent::Plugin
|
|
121
134
|
end
|
122
135
|
end
|
123
136
|
|
124
|
-
def create_data_stream(datastream_name)
|
125
|
-
return if data_stream_exist?(datastream_name)
|
137
|
+
def create_data_stream(datastream_name, host = nil)
|
138
|
+
return if data_stream_exist?(datastream_name, host)
|
126
139
|
params = {
|
127
140
|
name: datastream_name
|
128
141
|
}
|
129
142
|
retry_operate(@max_retry_putting_template,
|
130
143
|
@fail_on_putting_template_retry_exceed,
|
131
144
|
@catch_transport_exception_on_retry) do
|
132
|
-
|
145
|
+
client(host).indices.create_data_stream(params)
|
133
146
|
end
|
134
147
|
end
|
135
148
|
|
136
|
-
def ilm_policy_exists?(policy_id)
|
149
|
+
def ilm_policy_exists?(policy_id, host = nil)
|
137
150
|
begin
|
138
|
-
|
151
|
+
client(host).ilm.get_policy(policy_id: policy_id)
|
139
152
|
true
|
140
153
|
rescue
|
141
154
|
false
|
@@ -189,16 +202,17 @@ module Fluent::Plugin
|
|
189
202
|
data_stream_name = @data_stream_name
|
190
203
|
data_stream_template_name = @data_stream_template_name
|
191
204
|
data_stream_ilm_name = @data_stream_ilm_name
|
192
|
-
host =
|
205
|
+
host = nil
|
193
206
|
if @use_placeholder
|
207
|
+
host = extract_placeholders(@host, chunk)
|
194
208
|
data_stream_name = extract_placeholders(@data_stream_name, chunk)
|
195
209
|
data_stream_template_name = extract_placeholders(@data_stream_template_name, chunk)
|
196
210
|
data_stream_ilm_name = extract_placeholders(@data_stream_ilm_name, chunk)
|
197
211
|
unless @data_stream_names.include?(data_stream_name)
|
198
212
|
begin
|
199
|
-
create_data_stream(data_stream_name)
|
200
213
|
create_ilm_policy(data_stream_name, data_stream_template_name, data_stream_ilm_name, host)
|
201
214
|
create_index_template(data_stream_name, data_stream_template_name, data_stream_ilm_name, host)
|
215
|
+
create_data_stream(data_stream_name)
|
202
216
|
@data_stream_names << data_stream_name
|
203
217
|
rescue => e
|
204
218
|
raise Fluent::ConfigError, "Failed to create data stream: <#{data_stream_name}> #{e.message}"
|
@@ -227,7 +241,7 @@ module Fluent::Plugin
|
|
227
241
|
body: bulk_message
|
228
242
|
}
|
229
243
|
begin
|
230
|
-
response =
|
244
|
+
response = client(host).bulk(params)
|
231
245
|
if response['errors']
|
232
246
|
log.error "Could not bulk insert to Data Stream: #{data_stream_name} #{response}"
|
233
247
|
end
|
@@ -62,56 +62,61 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
62
62
|
DUPLICATED_DATA_STREAM_EXCEPTION = {"error": {}, "status": 400}
|
63
63
|
NONEXISTENT_DATA_STREAM_EXCEPTION = {"error": {}, "status": 404}
|
64
64
|
|
65
|
-
def stub_ilm_policy(name="
|
66
|
-
stub_request(:put, "
|
65
|
+
def stub_ilm_policy(name="foo_ilm_policy", url="http://localhost:9200")
|
66
|
+
stub_request(:put, "#{url}/_ilm/policy/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
67
67
|
end
|
68
68
|
|
69
|
-
def stub_index_template(name="foo_tpl")
|
70
|
-
stub_request(:put, "
|
69
|
+
def stub_index_template(name="foo_tpl", url="http://localhost:9200")
|
70
|
+
stub_request(:put, "#{url}/_index_template/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
71
71
|
end
|
72
72
|
|
73
|
-
def stub_data_stream(name="foo")
|
74
|
-
stub_request(:put, "
|
73
|
+
def stub_data_stream(name="foo", url="http://localhost:9200")
|
74
|
+
stub_request(:put, "#{url}/_data_stream/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
75
75
|
end
|
76
76
|
|
77
|
-
def stub_existent_data_stream?(name="foo")
|
78
|
-
stub_request(:get, "
|
77
|
+
def stub_existent_data_stream?(name="foo", url="http://localhost:9200")
|
78
|
+
stub_request(:get, "#{url}/_data_stream/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
79
79
|
end
|
80
80
|
|
81
|
-
def stub_existent_ilm?(name="
|
82
|
-
stub_request(:get, "
|
81
|
+
def stub_existent_ilm?(name="foo_ilm_policy", url="http://localhost:9200")
|
82
|
+
stub_request(:get, "#{url}/_ilm/policy/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
83
83
|
end
|
84
84
|
|
85
|
-
def stub_existent_template?(name="foo_tpl")
|
86
|
-
stub_request(:get, "
|
85
|
+
def stub_existent_template?(name="foo_tpl", url="http://localhost:9200")
|
86
|
+
stub_request(:get, "#{url}/_index_template/#{name}").to_return(:status => [200, RESPONSE_ACKNOWLEDGED])
|
87
87
|
end
|
88
88
|
|
89
|
-
def stub_nonexistent_data_stream?(name="foo")
|
90
|
-
stub_request(:get, "
|
89
|
+
def stub_nonexistent_data_stream?(name="foo", url="http://localhost:9200")
|
90
|
+
stub_request(:get, "#{url}/_data_stream/#{name}").to_return(:status => [404, Elasticsearch::Transport::Transport::Errors::NotFound])
|
91
91
|
end
|
92
92
|
|
93
|
-
def stub_nonexistent_ilm?(name="
|
94
|
-
stub_request(:get, "
|
93
|
+
def stub_nonexistent_ilm?(name="foo_ilm_policy", url="http://localhost:9200")
|
94
|
+
stub_request(:get, "#{url}/_ilm/policy/#{name}").to_return(:status => [404, Elasticsearch::Transport::Transport::Errors::NotFound])
|
95
95
|
end
|
96
96
|
|
97
|
-
def stub_nonexistent_template?(name="foo_tpl")
|
98
|
-
stub_request(:get, "
|
97
|
+
def stub_nonexistent_template?(name="foo_tpl", url="http://localhost:9200")
|
98
|
+
stub_request(:get, "#{url}/_index_template/#{name}").to_return(:status => [404, Elasticsearch::Transport::Transport::Errors::NotFound])
|
99
99
|
end
|
100
100
|
|
101
|
-
def
|
102
|
-
stub_request(:
|
101
|
+
def stub_nonexistent_template_retry?(name="foo_tpl", url="http://localhost:9200")
|
102
|
+
stub_request(:get, "#{url}/_index_template/#{name}").
|
103
|
+
to_return({ status: 500, body: 'Internal Server Error' }, { status: 404, body: '{}' })
|
104
|
+
end
|
105
|
+
|
106
|
+
def stub_bulk_feed(datastream_name="foo", ilm_name="foo_ilm_policy", template_name="foo_tpl", url="http://localhost:9200")
|
107
|
+
stub_request(:post, "#{url}/#{datastream_name}/_bulk").with do |req|
|
103
108
|
# bulk data must be pair of OP and records
|
104
109
|
# {"create": {}}\nhttp://localhost:9200/_ilm/policy/foo_ilm_bar
|
105
110
|
# {"@timestamp": ...}
|
106
111
|
@bulk_records += req.body.split("\n").size / 2
|
107
112
|
end
|
108
|
-
stub_request(:post, "
|
113
|
+
stub_request(:post, "#{url}/#{ilm_name}/_bulk").with do |req|
|
109
114
|
# bulk data must be pair of OP and records
|
110
115
|
# {"create": {}}\nhttp://localhost:9200/_ilm/policy/foo_ilm_bar
|
111
116
|
# {"@timestamp": ...}
|
112
117
|
@bulk_records += req.body.split("\n").size / 2
|
113
118
|
end
|
114
|
-
stub_request(:post, "
|
119
|
+
stub_request(:post, "#{url}/#{template_name}/_bulk").with do |req|
|
115
120
|
# bulk data must be pair of OP and records
|
116
121
|
# {"create": {}}\nhttp://localhost:9200/_ilm/policy/foo_ilm_bar
|
117
122
|
# {"@timestamp": ...}
|
@@ -119,12 +124,12 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
119
124
|
end
|
120
125
|
end
|
121
126
|
|
122
|
-
def stub_elastic_info(url="http://localhost:9200/", version="7.9.0")
|
127
|
+
def stub_elastic_info(url="http://localhost:9200/", version="7.9.0", headers={})
|
123
128
|
body ="{\"version\":{\"number\":\"#{version}\", \"build_flavor\":\"default\"},\"tagline\" : \"You Know, for Search\"}"
|
124
|
-
stub_request(:get, url).to_return({:status => 200, :body => body, :headers => { 'Content-Type' => 'json' } })
|
129
|
+
stub_request(:get, url).to_return({:status => 200, :body => body, :headers => { 'Content-Type' => 'json' }.merge(headers) })
|
125
130
|
end
|
126
131
|
|
127
|
-
def stub_default(datastream_name="foo", ilm_name="
|
132
|
+
def stub_default(datastream_name="foo", ilm_name="foo_ilm_policy", template_name="foo_tpl", host="http://localhost:9200")
|
128
133
|
stub_elastic_info(host)
|
129
134
|
stub_nonexistent_ilm?(ilm_name)
|
130
135
|
stub_ilm_policy(ilm_name)
|
@@ -431,12 +436,62 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
431
436
|
'ROOT', '', {
|
432
437
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
433
438
|
'data_stream_name' => 'foo',
|
434
|
-
'data_stream_ilm_name' => "
|
439
|
+
'data_stream_ilm_name' => "foo_ilm_policy",
|
435
440
|
'data_stream_template_name' => "foo_tpl"
|
436
441
|
})
|
437
442
|
assert_equal "foo", driver(conf).instance.data_stream_name
|
438
443
|
end
|
439
444
|
|
445
|
+
def test_datastream_configure_retry
|
446
|
+
stub_elastic_info
|
447
|
+
stub_nonexistent_ilm?
|
448
|
+
stub_ilm_policy
|
449
|
+
stub_nonexistent_template_retry?
|
450
|
+
stub_index_template
|
451
|
+
stub_nonexistent_data_stream?
|
452
|
+
stub_data_stream
|
453
|
+
conf = config_element(
|
454
|
+
'ROOT', '', {
|
455
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
456
|
+
'data_stream_name' => 'foo',
|
457
|
+
'data_stream_ilm_name' => "foo_ilm_policy",
|
458
|
+
'data_stream_template_name' => "foo_tpl"
|
459
|
+
})
|
460
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
461
|
+
end
|
462
|
+
|
463
|
+
def test_hosts_list_configure
|
464
|
+
config = %{
|
465
|
+
hosts https://john:password@host1:443/elastic/,http://host2
|
466
|
+
path /default_path
|
467
|
+
user default_user
|
468
|
+
password default_password
|
469
|
+
data_stream_name default
|
470
|
+
}
|
471
|
+
stub_elastic_info("https://host1:443/elastic//", "7.9.0",
|
472
|
+
{'Authorization'=>"Basic #{Base64.encode64('john:password').split.first}"})
|
473
|
+
stub_elastic_info("http://host2/default_path/_data_stream/default", "7.9.0",
|
474
|
+
{'Authorization'=>"Basic #{Base64.encode64('john:password').split.first}"})
|
475
|
+
stub_existent_data_stream?("default", "https://host1/elastic/")
|
476
|
+
instance = driver(config).instance
|
477
|
+
|
478
|
+
assert_equal 2, instance.get_connection_options[:hosts].length
|
479
|
+
host1, host2 = instance.get_connection_options[:hosts]
|
480
|
+
|
481
|
+
assert_equal 'host1', host1[:host]
|
482
|
+
assert_equal 443, host1[:port]
|
483
|
+
assert_equal 'https', host1[:scheme]
|
484
|
+
assert_equal 'john', host1[:user]
|
485
|
+
assert_equal 'password', host1[:password]
|
486
|
+
assert_equal '/elastic/', host1[:path]
|
487
|
+
|
488
|
+
assert_equal 'host2', host2[:host]
|
489
|
+
assert_equal 'http', host2[:scheme]
|
490
|
+
assert_equal 'default_user', host2[:user]
|
491
|
+
assert_equal 'default_password', host2[:password]
|
492
|
+
assert_equal '/default_path', host2[:path]
|
493
|
+
end
|
494
|
+
|
440
495
|
def test_existent_data_stream
|
441
496
|
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
442
497
|
|
@@ -449,10 +504,65 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
449
504
|
'ROOT', '', {
|
450
505
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
451
506
|
'data_stream_name' => 'foo',
|
452
|
-
'data_stream_ilm_name' => "
|
507
|
+
'data_stream_ilm_name' => "foo_ilm_policy",
|
508
|
+
'data_stream_template_name' => "foo_tpl"
|
509
|
+
})
|
510
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
511
|
+
end
|
512
|
+
|
513
|
+
def test_template_unset
|
514
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
515
|
+
|
516
|
+
stub_ilm_policy
|
517
|
+
stub_index_template
|
518
|
+
stub_existent_data_stream?
|
519
|
+
stub_data_stream
|
520
|
+
stub_elastic_info
|
521
|
+
conf = config_element(
|
522
|
+
'ROOT', '', {
|
523
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
524
|
+
'data_stream_name' => 'foo',
|
525
|
+
'data_stream_ilm_name' => "foo_ilm_policy",
|
526
|
+
})
|
527
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
528
|
+
assert_equal "foo_ilm_policy", driver(conf).instance.data_stream_ilm_name
|
529
|
+
assert_equal "foo_template", driver(conf).instance.data_stream_template_name
|
530
|
+
end
|
531
|
+
|
532
|
+
def test_ilm_unset
|
533
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
534
|
+
|
535
|
+
stub_ilm_policy
|
536
|
+
stub_index_template
|
537
|
+
stub_existent_data_stream?
|
538
|
+
stub_data_stream
|
539
|
+
stub_elastic_info
|
540
|
+
conf = config_element(
|
541
|
+
'ROOT', '', {
|
542
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
543
|
+
'data_stream_name' => 'foo',
|
453
544
|
'data_stream_template_name' => "foo_tpl"
|
454
545
|
})
|
455
546
|
assert_equal "foo", driver(conf).instance.data_stream_name
|
547
|
+
assert_equal "foo_tpl", driver(conf).instance.data_stream_template_name
|
548
|
+
end
|
549
|
+
|
550
|
+
def test_template_and_ilm_unset
|
551
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
552
|
+
|
553
|
+
stub_ilm_policy
|
554
|
+
stub_index_template
|
555
|
+
stub_existent_data_stream?
|
556
|
+
stub_data_stream
|
557
|
+
stub_elastic_info
|
558
|
+
conf = config_element(
|
559
|
+
'ROOT', '', {
|
560
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
561
|
+
'data_stream_name' => 'foo',
|
562
|
+
})
|
563
|
+
assert_equal "foo", driver(conf).instance.data_stream_name
|
564
|
+
assert_equal "foo_template", driver(conf).instance.data_stream_template_name
|
565
|
+
assert_equal "foo_policy", driver(conf).instance.data_stream_ilm_name
|
456
566
|
end
|
457
567
|
|
458
568
|
def test_placeholder
|
@@ -476,6 +586,26 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
476
586
|
assert_equal 1, @bulk_records
|
477
587
|
end
|
478
588
|
|
589
|
+
def test_placeholder_params_unset
|
590
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
591
|
+
|
592
|
+
dsname = "foo_test"
|
593
|
+
ilmname = "foo_test_policy"
|
594
|
+
tplname = "foo_test_template"
|
595
|
+
stub_default(dsname, ilmname, tplname)
|
596
|
+
stub_bulk_feed(dsname, ilmname, tplname)
|
597
|
+
conf = config_element(
|
598
|
+
'ROOT', '', {
|
599
|
+
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
600
|
+
'data_stream_name' => 'foo_${tag}',
|
601
|
+
})
|
602
|
+
driver(conf).run(default_tag: 'test') do
|
603
|
+
driver.feed(sample_record)
|
604
|
+
end
|
605
|
+
assert_equal 1, @bulk_records
|
606
|
+
end
|
607
|
+
|
608
|
+
|
479
609
|
def test_time_placeholder
|
480
610
|
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
481
611
|
|
@@ -540,7 +670,7 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
540
670
|
'ROOT', '', {
|
541
671
|
'@type' => ELASTIC_DATA_STREAM_TYPE,
|
542
672
|
'data_stream_name' => 'foo',
|
543
|
-
'data_stream_ilm_name' => '
|
673
|
+
'data_stream_ilm_name' => 'foo_ilm_policy',
|
544
674
|
'data_stream_template_name' => 'foo_tpl'
|
545
675
|
})
|
546
676
|
driver(conf).run(default_tag: 'test') do
|
@@ -560,7 +690,7 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
560
690
|
port 778
|
561
691
|
scheme https
|
562
692
|
data_stream_name foo
|
563
|
-
data_stream_ilm_name
|
693
|
+
data_stream_ilm_name foo_ilm_policy
|
564
694
|
data_stream_template_name foo_tpl
|
565
695
|
user john
|
566
696
|
password doe
|
@@ -584,4 +714,86 @@ class ElasticsearchOutputDataStreamTest < Test::Unit::TestCase
|
|
584
714
|
|
585
715
|
assert_equal(4, connection_resets)
|
586
716
|
end
|
717
|
+
|
718
|
+
def test_doesnt_update_ilm_policy_if_overwrite_unset
|
719
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
720
|
+
|
721
|
+
config = %{
|
722
|
+
data_stream_name foo
|
723
|
+
data_stream_ilm_name foo_ilm_policy
|
724
|
+
data_stream_ilm_policy {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"15d"}}}}}}
|
725
|
+
}
|
726
|
+
|
727
|
+
stub_elastic_info
|
728
|
+
stub_index_template
|
729
|
+
stub_existent_data_stream?
|
730
|
+
stub_existent_ilm?
|
731
|
+
stub_data_stream
|
732
|
+
|
733
|
+
stub_request(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy").
|
734
|
+
to_return(:status => 200, :body => "", :headers => {})
|
735
|
+
|
736
|
+
assert_nothing_raised {
|
737
|
+
driver(config)
|
738
|
+
}
|
739
|
+
assert_requested(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy", times: 0)
|
740
|
+
end
|
741
|
+
|
742
|
+
def test_updates_ilm_policy_if_overwrite_set
|
743
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
744
|
+
|
745
|
+
config = %{
|
746
|
+
data_stream_name foo
|
747
|
+
data_stream_ilm_name foo_ilm_policy
|
748
|
+
data_stream_ilm_policy {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"15d"}}}}}}
|
749
|
+
data_stream_ilm_policy_overwrite true
|
750
|
+
}
|
751
|
+
|
752
|
+
stub_elastic_info
|
753
|
+
stub_index_template
|
754
|
+
stub_existent_data_stream?
|
755
|
+
stub_existent_ilm?
|
756
|
+
stub_data_stream
|
757
|
+
|
758
|
+
stub_request(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy").
|
759
|
+
to_return(:status => 200, :body => "", :headers => {})
|
760
|
+
|
761
|
+
assert_nothing_raised {
|
762
|
+
driver(config)
|
763
|
+
}
|
764
|
+
|
765
|
+
assert_requested(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy", times: 1)
|
766
|
+
assert_requested(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy",
|
767
|
+
body: '{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"15d"}}}}}}',
|
768
|
+
times: 1)
|
769
|
+
end
|
770
|
+
|
771
|
+
def test_creates_custom_ilm_policy_if_none_exists
|
772
|
+
omit REQUIRED_ELASTIC_MESSAGE unless data_stream_supported?
|
773
|
+
|
774
|
+
config = %{
|
775
|
+
data_stream_name foo
|
776
|
+
data_stream_ilm_name foo_ilm_policy
|
777
|
+
data_stream_ilm_policy {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"15d"}}}}}}
|
778
|
+
}
|
779
|
+
|
780
|
+
stub_elastic_info
|
781
|
+
stub_index_template("foo_template")
|
782
|
+
stub_data_stream
|
783
|
+
stub_nonexistent_data_stream?
|
784
|
+
stub_nonexistent_ilm?
|
785
|
+
stub_nonexistent_template?("foo_template")
|
786
|
+
|
787
|
+
stub_request(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy").
|
788
|
+
to_return(:status => 200, :body => "", :headers => {})
|
789
|
+
|
790
|
+
assert_nothing_raised {
|
791
|
+
driver(config)
|
792
|
+
}
|
793
|
+
|
794
|
+
assert_requested(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy", times: 1)
|
795
|
+
assert_requested(:put, "http://localhost:9200/_ilm/policy/foo_ilm_policy",
|
796
|
+
body: '{"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"15d"}}}}}}',
|
797
|
+
times: 1)
|
798
|
+
end
|
587
799
|
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: 5.1.
|
4
|
+
version: 5.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- diogo
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fluentd
|
@@ -156,7 +156,6 @@ files:
|
|
156
156
|
- ".github/workflows/macos.yml"
|
157
157
|
- ".github/workflows/windows.yml"
|
158
158
|
- ".gitignore"
|
159
|
-
- ".travis.yml"
|
160
159
|
- CONTRIBUTING.md
|
161
160
|
- Gemfile
|
162
161
|
- History.md
|
@@ -168,7 +167,6 @@ files:
|
|
168
167
|
- README.Troubleshooting.md
|
169
168
|
- README.md
|
170
169
|
- Rakefile
|
171
|
-
- appveyor.yml
|
172
170
|
- fluent-plugin-elasticsearch.gemspec
|
173
171
|
- gemfiles/Gemfile.elasticsearch.v6
|
174
172
|
- lib/fluent/log-ext.rb
|
@@ -223,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
221
|
- !ruby/object:Gem::Version
|
224
222
|
version: '0'
|
225
223
|
requirements: []
|
226
|
-
rubygems_version: 3.2.
|
224
|
+
rubygems_version: 3.2.30
|
227
225
|
signing_key:
|
228
226
|
specification_version: 4
|
229
227
|
summary: Elasticsearch output plugin for Fluent event collector
|
data/.travis.yml
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
|
3
|
-
jobs:
|
4
|
-
include:
|
5
|
-
- rvm: 2.4.6
|
6
|
-
gemfile: Gemfile
|
7
|
-
os: linux
|
8
|
-
arch: amd64
|
9
|
-
- rvm: 2.5.5
|
10
|
-
gemfile: Gemfile
|
11
|
-
os: linux
|
12
|
-
arch: amd64
|
13
|
-
- rvm: 2.6.3
|
14
|
-
gemfile: gemfiles/Gemfile.elasticsearch.v6
|
15
|
-
os: linux
|
16
|
-
arch: amd64
|
17
|
-
- rvm: 2.6.3
|
18
|
-
gemfile: Gemfile
|
19
|
-
os: linux
|
20
|
-
arch: amd64
|
21
|
-
- rvm: 2.6.3
|
22
|
-
gemfile: Gemfile
|
23
|
-
os: linux
|
24
|
-
arch: arm64
|
25
|
-
- rvm: 2.6.3
|
26
|
-
gemfile: Gemfile
|
27
|
-
os: osx
|
28
|
-
osx_image: xcode11.3
|
29
|
-
- rvm: 2.7.0
|
30
|
-
gemfile: Gemfile
|
31
|
-
os: linux
|
32
|
-
arch: amd64
|
33
|
-
|
34
|
-
gemfile:
|
35
|
-
- Gemfile
|
36
|
-
|
37
|
-
before_install:
|
38
|
-
- gem update --system=2.7.8
|
39
|
-
|
40
|
-
script: bundle exec rake test
|
data/appveyor.yml
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
version: '{build}'
|
2
|
-
install:
|
3
|
-
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
4
|
-
- ridk.cmd enable
|
5
|
-
- ruby --version
|
6
|
-
- gem --version
|
7
|
-
- bundle install
|
8
|
-
build: off
|
9
|
-
test_script:
|
10
|
-
- bundle exec rake test
|
11
|
-
|
12
|
-
# https://www.appveyor.com/docs/installed-software/#ruby
|
13
|
-
environment:
|
14
|
-
matrix:
|
15
|
-
- ruby_version: "26-x64"
|
16
|
-
- ruby_version: "26"
|
17
|
-
- ruby_version: "25-x64"
|
18
|
-
- ruby_version: "25"
|
19
|
-
- ruby_version: "24-x64"
|
20
|
-
- ruby_version: "24"
|