fluent-plugin-elasticsearch 5.0.2 → 5.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa89d08181943944c6bda419dcf34ef9f1bbe94b67bb270c293d8a0fa03dced0
4
- data.tar.gz: d276c5a35783d83608032740c69e2d33e9b6462f507b83e4ff393feb4ed1d151
3
+ metadata.gz: 6eb418d889b91bf79c37c1cd72789981eb4133bcfc34e21b26e79bb919462272
4
+ data.tar.gz: 168ddc77fb73216da63f1ce65ed673cf12ab13d6db549fc3e2da81956c938990
5
5
  SHA512:
6
- metadata.gz: 28c78fb744db4ae40a31f27a4d25fed52d278cfc8cf39c5d5bcbcf129302c1a2157e609179ecfa6693465454c131834bb04d6f40b42a46c6cdf45e71f3036291
7
- data.tar.gz: f19746088603311f3aa06787fcc219e810ef97762ae72563b557a00ad29518a06f4c641a951913be3865b86cae7cda2329856c4d2317a0a8a2360109aa8ffca5
6
+ metadata.gz: 5c4a2a8f63b25ea8785e0d4ef291043a93a86fea8f42638caaf46dd3efe29fd0a12919dd339d8a28c97aef65494ba054a3ff3312a122ab2cd89cb54cb069055c
7
+ data.tar.gz: 6b13851ce29b2a6f2083ebc57ae733a9ca00d79a9fd09ac4c7630d99a9c6d2da302c48f2e0cd901810e0a851911e14f8355fc336e21afd97d3f33fe205b0c78a
data/History.md CHANGED
@@ -1,6 +1,9 @@
1
1
  ## Changelog [[tags]](https://github.com/uken/fluent-plugin-elasticsearch/tags)
2
2
 
3
3
  ### [Unreleased]
4
+ - Fix use_legacy_template documentation (#880)
5
+ - Add FAQ for dynamic index/template (#878)
6
+ - Handle IPv6 address string on host and hosts parameters (#877)
4
7
 
5
8
  ### 5.0.2
6
9
  - GitHub Actions: Tweak Ruby versions on test (#875)
@@ -10,6 +10,7 @@
10
10
  + [Random 400 - Rejected by Elasticsearch is occured, why?](#random-400---rejected-by-elasticsearch-is-occured-why)
11
11
  + [Fluentd seems to hang if it unable to connect Elasticsearch, why?](#fluentd-seems-to-hang-if-it-unable-to-connect-elasticsearch-why)
12
12
  + [Enable Index Lifecycle Management](#enable-index-lifecycle-management)
13
+ + [Configuring for dynamic index or template](#configuring-for-dynamic-index-or-template)
13
14
  + [How to specify index codec](#how-to-specify-index-codec)
14
15
  + [Cannot push logs to Elasticsearch with connect_write timeout reached, why?](#cannot-push-logs-to-elasticsearch-with-connect_write-timeout-reached-why)
15
16
 
@@ -524,6 +525,96 @@ template_name your-fluentd-template
524
525
  template_file /path/to/fluentd-template.json
525
526
  ```
526
527
 
528
+ #### Configuring for dynamic index or template
529
+
530
+ Some users want to setup ILM for dynamic index/template.
531
+ `index_petterns` and `template.settings.index.lifecycle.name` in Elasticsearch template will be overwritten by Elasticsearch plugin:
532
+
533
+ ```json
534
+ {
535
+ "index_patterns": ["mock"],
536
+ "template": {
537
+ "settings": {
538
+ "index": {
539
+ "lifecycle": {
540
+ "name": "mock",
541
+ "rollover_alias": "mock"
542
+ },
543
+ "number_of_shards": "<<shard>>",
544
+ "number_of_replicas": "<<replica>>"
545
+ }
546
+ }
547
+ }
548
+ }
549
+ ```
550
+
551
+ This template will be handled with:
552
+
553
+ ```aconf
554
+ <source>
555
+ @type http
556
+ port 5004
557
+ bind 0.0.0.0
558
+ body_size_limit 32m
559
+ keepalive_timeout 10s
560
+ <parse>
561
+ @type json
562
+ </parse>
563
+ </source>
564
+
565
+ <match kubernetes.var.log.containers.**etl-webserver**.log>
566
+ @type elasticsearch
567
+ @id out_es_etl_webserver
568
+ @log_level info
569
+ include_tag_key true
570
+ host $HOST
571
+ port $PORT
572
+ path "#{ENV['FLUENT_ELASTICSEARCH_PATH']}"
573
+ request_timeout "#{ENV['FLUENT_ELASTICSEARCH_REQUEST_TIMEOUT'] || '30s'}"
574
+ scheme "#{ENV['FLUENT_ELASTICSEARCH_SCHEME'] || 'http'}"
575
+ ssl_verify "#{ENV['FLUENT_ELASTICSEARCH_SSL_VERIFY'] || 'true'}"
576
+ ssl_version "#{ENV['FLUENT_ELASTICSEARCH_SSL_VERSION'] || 'TLSv1'}"
577
+ reload_connections "#{ENV['FLUENT_ELASTICSEARCH_RELOAD_CONNECTIONS'] || 'false'}"
578
+ reconnect_on_error "#{ENV['FLUENT_ELASTICSEARCH_RECONNECT_ON_ERROR'] || 'true'}"
579
+ reload_on_failure "#{ENV['FLUENT_ELASTICSEARCH_RELOAD_ON_FAILURE'] || 'true'}"
580
+ log_es_400_reason "#{ENV['FLUENT_ELASTICSEARCH_LOG_ES_400_REASON'] || 'false'}"
581
+ logstash_prefix "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_PREFIX'] || 'etl-webserver'}"
582
+ logstash_format "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_FORMAT'] || 'false'}"
583
+ index_name "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_INDEX_NAME'] || 'etl-webserver'}"
584
+ type_name "#{ENV['FLUENT_ELASTICSEARCH_LOGSTASH_TYPE_NAME'] || 'fluentd'}"
585
+ time_key "#{ENV['FLUENT_ELASTICSEARCH_TIME_KEY'] || '@timestamp'}"
586
+ include_timestamp "#{ENV['FLUENT_ELASTICSEARCH_INCLUDE_TIMESTAMP'] || 'true'}"
587
+
588
+ # ILM Settings - WITH ROLLOVER support
589
+ # https://github.com/uken/fluent-plugin-elasticsearch#enable-index-lifecycle-management
590
+ application_name "etl-webserver"
591
+ index_date_pattern ""
592
+ # Policy configurations
593
+ enable_ilm true
594
+ ilm_policy_id etl-webserver
595
+ ilm_policy_overwrite true
596
+ ilm_policy {"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_age": "5m","max_size": "3gb"},"set_priority": {"priority": 100}}},"delete": {"min_age": "30d","actions": {"delete": {"delete_searchable_snapshot": true}}}}}}
597
+ use_legacy_template false
598
+ template_name etl-webserver
599
+ template_file /configs/index-template.json
600
+ template_overwrite true
601
+ customize_template {"<<shard>>": "3","<<replica>>": "0"}
602
+
603
+ <buffer>
604
+ flush_thread_count "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_FLUSH_THREAD_COUNT'] || '8'}"
605
+ flush_interval "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_FLUSH_INTERVAL'] || '5s'}"
606
+ chunk_limit_size "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_CHUNK_LIMIT_SIZE'] || '8MB'}"
607
+ total_limit_size "#{ENV['FLUENT_ELASTICSEARCH_TOTAL_LIMIT_SIZE'] || '450MB'}"
608
+ queue_limit_length "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_QUEUE_LIMIT_LENGTH'] || '32'}"
609
+ retry_max_interval "#{ENV['FLUENT_ELASTICSEARCH_BUFFER_RETRY_MAX_INTERVAL'] || '60s'}"
610
+ retry_forever false
611
+ </buffer>
612
+ </match>
613
+ ```
614
+
615
+ For more details, please refer the discussion:
616
+ https://github.com/uken/fluent-plugin-elasticsearch/issues/867
617
+
527
618
  ### How to specify index codec
528
619
 
529
620
  Elasticsearch can handle compression methods for stored data such as LZ4 and best_compression.
data/README.md CHANGED
@@ -171,6 +171,24 @@ You can specify Elasticsearch host by this parameter.
171
171
 
172
172
  **Note:** Since v3.3.2, `host` parameter supports builtin placeholders. If you want to send events dynamically into different hosts at runtime with `elasticsearch_dynamic` output plugin, please consider to switch to use plain `elasticsearch` output plugin. In more detail for builtin placeholders, please refer to [Placeholders](#placeholders) section.
173
173
 
174
+ To use IPv6 address on `host` parameter, you can use the following styles:
175
+
176
+ #### string style
177
+
178
+ To use string style, you must quote IPv6 address due to prevent to be interpreted as JSON:
179
+
180
+ ```
181
+ host "[2404:7a80:d440:3000:192a:a292:bd7f:ca10]"
182
+ ```
183
+
184
+ #### raw style
185
+
186
+ You can also specify raw IPv6 address. This will be handled as `[specified IPv6 address]`:
187
+
188
+ ```
189
+ host 2404:7a80:d440:3000:192a:a292:bd7f:ca10
190
+ ```
191
+
174
192
  ### port
175
193
 
176
194
  ```
@@ -237,6 +255,16 @@ hosts host1:port1,host2:port2,host3 # port3 is 9200
237
255
 
238
256
  **Note:** Up until v2.8.5, it was allowed to embed the username/password in the URL. However, this syntax is deprecated as of v2.8.6 because it was found to cause serious connection problems (See #394). Please migrate your settings to use the `user` and `password` field (described below) instead.
239
257
 
258
+ #### IPv6 addresses
259
+
260
+ When you want to specify IPv6 addresses, you must specify schema together:
261
+
262
+ ```
263
+ hosts http://[2404:7a80:d440:3000:de:7311:6329:2e6c]:port1,http://[2404:7a80:d440:3000:de:7311:6329:1e6c]:port2,http://[2404:7a80:d440:3000:de:6311:6329:2e6c]:port3
264
+ ```
265
+
266
+ If you don't specify hosts with schema together, Elasticsearch plugin complains Invalid URI for them.
267
+
240
268
  ### user, password, path, scheme, ssl_verify
241
269
 
242
270
  ```
@@ -1325,9 +1353,9 @@ Default value is `nil`.
1325
1353
 
1326
1354
  Use legacy template or not.
1327
1355
 
1328
- Elasticsearch 7.8 or later supports the brand new composable templates.
1356
+ For Elasticsearch 7.8 or later, users can specify this parameter as `false` if their [template_file](#template_file) contains a composable index template.
1329
1357
 
1330
- For Elasticsearch 7.7 or older, users should specify this parameter as `false`.
1358
+ For Elasticsearch 7.7 or older, users should specify this parameter as `true`.
1331
1359
 
1332
1360
  Composable template documentation is [Put Index Template API | Elasticsearch Reference](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html) and legacy template documentation is [Index Templates | Elasticsearch Reference](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates-v1.html).
1333
1361
 
@@ -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.0.2'
6
+ s.version = '5.0.3'
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}
@@ -13,6 +13,7 @@ begin
13
13
  require 'strptime'
14
14
  rescue LoadError
15
15
  end
16
+ require 'resolv'
16
17
 
17
18
  require 'fluent/plugin/output'
18
19
  require 'fluent/event'
@@ -668,7 +669,11 @@ EOC
668
669
  end
669
670
  end.compact
670
671
  else
671
- [{host: @host, port: @port, scheme: @scheme.to_s}]
672
+ if Resolv::IPv6::Regex.match(@host)
673
+ [{host: "[#{@host}]", scheme: @scheme.to_s, port: @port}]
674
+ else
675
+ [{host: @host, port: @port, scheme: @scheme.to_s}]
676
+ end
672
677
  end.each do |host|
673
678
  host.merge!(user: @user, password: @password) if !host[:user] && @user
674
679
  host.merge!(path: @path) if !host[:path] && @path
@@ -3612,6 +3612,74 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
3612
3612
  assert_equal '/default_path', host2[:path]
3613
3613
  end
3614
3614
 
3615
+ class IPv6AdressStringHostsTest < self
3616
+ def test_legacy_hosts_list
3617
+ config = %{
3618
+ hosts "[2404:7a80:d440:3000:192a:a292:bd7f:ca19]:50,host2:100,host3"
3619
+ scheme https
3620
+ path /es/
3621
+ port 123
3622
+ }
3623
+ instance = driver(config).instance
3624
+
3625
+ assert_raise(URI::InvalidURIError) do
3626
+ instance.get_connection_options[:hosts].length
3627
+ end
3628
+ end
3629
+
3630
+ def test_hosts_list
3631
+ config = %{
3632
+ hosts https://john:password@[2404:7a80:d440:3000:192a:a292:bd7f:ca19]:443/elastic/,http://host2
3633
+ path /default_path
3634
+ user default_user
3635
+ password default_password
3636
+ }
3637
+ instance = driver(config).instance
3638
+
3639
+ assert_equal 2, instance.get_connection_options[:hosts].length
3640
+ host1, host2 = instance.get_connection_options[:hosts]
3641
+
3642
+ assert_equal '[2404:7a80:d440:3000:192a:a292:bd7f:ca19]', host1[:host]
3643
+ assert_equal 443, host1[:port]
3644
+ assert_equal 'https', host1[:scheme]
3645
+ assert_equal 'john', host1[:user]
3646
+ assert_equal 'password', host1[:password]
3647
+ assert_equal '/elastic/', host1[:path]
3648
+
3649
+ assert_equal 'host2', host2[:host]
3650
+ assert_equal 'http', host2[:scheme]
3651
+ assert_equal 'default_user', host2[:user]
3652
+ assert_equal 'default_password', host2[:password]
3653
+ assert_equal '/default_path', host2[:path]
3654
+ end
3655
+
3656
+ def test_hosts_list_with_escape_placeholders
3657
+ config = %{
3658
+ hosts https://%{j+hn}:%{passw@rd}@[2404:7a80:d440:3000:192a:a292:bd7f:ca19]:443/elastic/,http://host2
3659
+ path /default_path
3660
+ user default_user
3661
+ password default_password
3662
+ }
3663
+ instance = driver(config).instance
3664
+
3665
+ assert_equal 2, instance.get_connection_options[:hosts].length
3666
+ host1, host2 = instance.get_connection_options[:hosts]
3667
+
3668
+ assert_equal '[2404:7a80:d440:3000:192a:a292:bd7f:ca19]', host1[:host]
3669
+ assert_equal 443, host1[:port]
3670
+ assert_equal 'https', host1[:scheme]
3671
+ assert_equal 'j%2Bhn', host1[:user]
3672
+ assert_equal 'passw%40rd', host1[:password]
3673
+ assert_equal '/elastic/', host1[:path]
3674
+
3675
+ assert_equal 'host2', host2[:host]
3676
+ assert_equal 'http', host2[:scheme]
3677
+ assert_equal 'default_user', host2[:user]
3678
+ assert_equal 'default_password', host2[:password]
3679
+ assert_equal '/default_path', host2[:path]
3680
+ end
3681
+ end
3682
+
3615
3683
  def test_single_host_params_and_defaults
3616
3684
  config = %{
3617
3685
  host logs.google.com
@@ -3665,6 +3733,46 @@ class ElasticsearchOutputTest < Test::Unit::TestCase
3665
3733
  assert(ports.none? { |p| p == 9200 })
3666
3734
  end
3667
3735
 
3736
+ class IPv6AdressStringHostTest < self
3737
+ def test_single_host_params_and_defaults
3738
+ config = %{
3739
+ host 2404:7a80:d440:3000:192a:a292:bd7f:ca19
3740
+ user john
3741
+ password doe
3742
+ }
3743
+ instance = driver(config).instance
3744
+
3745
+ assert_equal 1, instance.get_connection_options[:hosts].length
3746
+ host1 = instance.get_connection_options[:hosts][0]
3747
+
3748
+ assert_equal '[2404:7a80:d440:3000:192a:a292:bd7f:ca19]', host1[:host]
3749
+ assert_equal 9200, host1[:port]
3750
+ assert_equal 'http', host1[:scheme]
3751
+ assert_equal 'john', host1[:user]
3752
+ assert_equal 'doe', host1[:password]
3753
+ assert_equal nil, host1[:path]
3754
+ end
3755
+
3756
+ def test_single_host_params_and_defaults_with_escape_placeholders
3757
+ config = %{
3758
+ host 2404:7a80:d440:3000:192a:a292:bd7f:ca19
3759
+ user %{j+hn}
3760
+ password %{d@e}
3761
+ }
3762
+ instance = driver(config).instance
3763
+
3764
+ assert_equal 1, instance.get_connection_options[:hosts].length
3765
+ host1 = instance.get_connection_options[:hosts][0]
3766
+
3767
+ assert_equal '[2404:7a80:d440:3000:192a:a292:bd7f:ca19]', host1[:host]
3768
+ assert_equal 9200, host1[:port]
3769
+ assert_equal 'http', host1[:scheme]
3770
+ assert_equal 'j%2Bhn', host1[:user]
3771
+ assert_equal 'd%40e', host1[:password]
3772
+ assert_equal nil, host1[:path]
3773
+ end
3774
+ end
3775
+
3668
3776
  def test_password_is_required_if_specify_user
3669
3777
  config = %{
3670
3778
  user john
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.0.2
4
+ version: 5.0.3
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: 2021-03-19 00:00:00.000000000 Z
13
+ date: 2021-04-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: fluentd