fluent-plugin-elasticsearch 3.7.1 → 3.8.0

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: 66d34ebe18eabf21cd55dbe1c0f3d4f469298e3ada1072849068c1d490e62650
4
- data.tar.gz: f91f6d38cc821642ddd6bc2fda232534b14d070fa9694db328bdef68d982d93a
3
+ metadata.gz: 28cfb80e32dd25c9d67c582d4d39672515bbc9e0acb6a7b940ee1e36edd35de1
4
+ data.tar.gz: 6c2440335c4a1ebc03939dee6204cbd9fc6265797c9658d728df70fc63e9ba9d
5
5
  SHA512:
6
- metadata.gz: d83715d884fd22a0cb487e0eea16d37679800ce477bfcc888546d1856e48dd8bfa45106826731008b5b3d67cb2408a4d7eca9740a92076ec877a0f999252a512
7
- data.tar.gz: d5e476b7ec45883dceeecffeb529d43c1b5a16a9a6c203139ed42891a8e702bc74861edcced7bfd87340e4f3150de0f5a7f7d9ecff8840d1dab9e1348db11601
6
+ metadata.gz: 7f67a2f892890ff80e34f6cd8aa14c5a61fc04095512f095d05554772eb384ddf54ec222006cf2b021ed08355d0af8575f0020671cd74de422c8b4c1e14989a0
7
+ data.tar.gz: 0d1919231ba8c8a88391a54d1853d992ba531f39c33826ff12ffd7258f9b3087ae5e18e1497edb0b6dac40998641a9ed79e28449cb90e2c9339a7a4e34406e4b
data/History.md CHANGED
@@ -1,6 +1,11 @@
1
1
  ## Changelog [[tags]](https://github.com/uken/fluent-plugin-elasticsearch/tags)
2
2
 
3
3
  ### [Unreleased]
4
+ ### 3.8.0
5
+ - Add FAQ for specifying index.codec (#679)
6
+ - Add FAQ for connect_write timeout reached error (#687)
7
+ - Unblocking buffer overflow with block action (#688)
8
+
4
9
  ### 3.7.1
5
10
  - Make conpatible for Fluentd v1.8 (#677)
6
11
  - Handle flatten_hashes in elasticsearch_dynamic (#675)
data/README.md CHANGED
@@ -103,6 +103,8 @@ Current maintainers: @cosmo0920
103
103
  + [Random 400 - Rejected by Elasticsearch is occured, why?](#random-400---rejected-by-elasticsearch-is-occured-why)
104
104
  + [Fluentd seems to hang if it unable to connect Elasticsearch, why?](#fluentd-seems-to-hang-if-it-unable-to-connect-elasticsearch-why)
105
105
  + [Enable Index Lifecycle Management](#enable-index-lifecycle-management)
106
+ + [How to specify index codec](#how-to-specify-index-codec)
107
+ + [Cannot push logs to Elasticsearch with connect_write timeout reached, why?](#cannot-push-logs-to-elasticsearch-with-connect_write-timeout-reached-why)
106
108
  * [Contact](#contact)
107
109
  * [Contributing](#contributing)
108
110
  * [Running tests](#running-tests)
@@ -1621,6 +1623,82 @@ customize_template {"<<index_prefix>>": "fluentd"}
1621
1623
 
1622
1624
  Note: This plugin only creates rollover-enabled indices, which are aliases pointing to them and index templates, and creates an ILM policy if enabled.
1623
1625
 
1626
+ ### How to specify index codec
1627
+
1628
+ Elasticsearch can handle compression methods for stored data such as LZ4 and best_compression.
1629
+ fluent-plugin-elasticsearch doesn't provide API which specifies compression method.
1630
+
1631
+ Users can specify stored data compression method with template:
1632
+
1633
+ Create `compression.json` as follows:
1634
+
1635
+ ```json
1636
+ {
1637
+ "order": 100,
1638
+ "index_patterns": [
1639
+ "YOUR-INDEX-PATTERN"
1640
+ ],
1641
+ "settings": {
1642
+ "index": {
1643
+ "codec": "best_compression"
1644
+ }
1645
+ }
1646
+ }
1647
+ ```
1648
+
1649
+ Then, specify the above template in your configuration:
1650
+
1651
+ ```aconf
1652
+ template_name best_compression_tmpl
1653
+ template_file compression.json
1654
+ ```
1655
+
1656
+ Elasticsearch will store data with `best_compression`:
1657
+
1658
+ ```
1659
+ % curl -XGET 'http://localhost:9200/logstash-2019.12.06/_settings?pretty'
1660
+ ```
1661
+
1662
+ ```json
1663
+ {
1664
+ "logstash-2019.12.06" : {
1665
+ "settings" : {
1666
+ "index" : {
1667
+ "codec" : "best_compression",
1668
+ "number_of_shards" : "1",
1669
+ "provided_name" : "logstash-2019.12.06",
1670
+ "creation_date" : "1575622843800",
1671
+ "number_of_replicas" : "1",
1672
+ "uuid" : "THE_AWESOMEUUID",
1673
+ "version" : {
1674
+ "created" : "7040100"
1675
+ }
1676
+ }
1677
+ }
1678
+ }
1679
+ }
1680
+ ```
1681
+
1682
+ ### Cannot push logs to Elasticsearch with connect_write timeout reached, why?
1683
+
1684
+ It seems that Elasticsearch cluster is exhausted.
1685
+
1686
+ Usually, Fluentd complains like the following log:
1687
+
1688
+ ```log
1689
+ 2019-12-29 00:23:33 +0000 [warn]: buffer flush took longer time than slow_flush_log_threshold: elapsed_time=27.283766102716327 slow_flush_log_threshold=15.0 plugin_id="object:aaaffaaaaaff"
1690
+ 2019-12-29 00:23:33 +0000 [warn]: buffer flush took longer time than slow_flush_log_threshold: elapsed_time=26.161768959928304 slow_flush_log_threshold=15.0 plugin_id="object:aaaffaaaaaff"
1691
+ 2019-12-29 00:23:33 +0000 [warn]: buffer flush took longer time than slow_flush_log_threshold: elapsed_time=28.713624476008117 slow_flush_log_threshold=15.0 plugin_id="object:aaaffaaaaaff"
1692
+ 2019-12-29 01:39:18 +0000 [warn]: Could not push logs to Elasticsearch, resetting connection and trying again. connect_write timeout reached
1693
+ 2019-12-29 01:39:18 +0000 [warn]: Could not push logs to Elasticsearch, resetting connection and trying again. connect_write timeout reached
1694
+ ```
1695
+
1696
+ This warnings is usually caused by exhaused Elasticsearch cluster due to resource shortage.
1697
+
1698
+ If CPU usage is spiked and Elasticsearch cluster is eating up CPU resource, this issue is caused by CPU resource shortage.
1699
+
1700
+ Check your Elasticsearch cluster health status and resource usage.
1701
+
1624
1702
  ## Contact
1625
1703
 
1626
1704
  If you have a question, [open an Issue](https://github.com/uken/fluent-plugin-elasticsearch/issues).
@@ -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 = '3.7.1'
6
+ s.version = '3.8.0'
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}
@@ -33,6 +33,7 @@ module Fluent::Plugin
33
33
  class ElasticsearchOutput < Output
34
34
  class RecoverableRequestFailure < StandardError; end
35
35
  class UnrecoverableRequestFailure < Fluent::UnrecoverableError; end
36
+ class RetryStreamEmitFailure < StandardError; end
36
37
 
37
38
  # MissingIdFieldError is raised for records that do not
38
39
  # include the field for the unique record identifier
@@ -862,8 +863,15 @@ EOC
862
863
  error.handle_error(response, tag, chunk, bulk_message_count, extracted_values)
863
864
  end
864
865
  rescue RetryStreamError => e
866
+ log.trace "router.emit_stream for retry stream doing..."
865
867
  emit_tag = @retry_tag ? @retry_tag : tag
866
- router.emit_stream(emit_tag, e.retry_stream)
868
+ # check capacity of buffer space
869
+ if retry_stream_retryable?
870
+ router.emit_stream(emit_tag, e.retry_stream)
871
+ else
872
+ raise RetryStreamEmitFailure, "buffer is full."
873
+ end
874
+ log.trace "router.emit_stream for retry stream done."
867
875
  rescue => e
868
876
  ignore = @ignore_exception_classes.any? { |clazz| e.class <= clazz }
869
877
 
@@ -879,6 +887,10 @@ EOC
879
887
  end
880
888
  end
881
889
 
890
+ def retry_stream_retryable?
891
+ @buffer.storable?
892
+ end
893
+
882
894
  def is_existing_connection(host)
883
895
  # check if the host provided match the current connection
884
896
  return false if @_es.nil?
@@ -3175,6 +3175,82 @@ class ElasticsearchOutput < Test::Unit::TestCase
3175
3175
  assert_equal [['retry', 1, sample_record]], driver.events
3176
3176
  end
3177
3177
 
3178
+ class FulfilledBufferRetryStreamTest < self
3179
+ def test_bulk_error_retags_with_error_when_configured_and_fullfilled_buffer
3180
+ def create_driver(conf='', es_version=5, client_version="\"5.0\"")
3181
+ @client_version ||= client_version
3182
+ Fluent::Plugin::ElasticsearchOutput.module_eval(<<-CODE)
3183
+ def retry_stream_retryable?
3184
+ false
3185
+ end
3186
+ CODE
3187
+ # For request stub to detect compatibility.
3188
+ @es_version ||= es_version
3189
+ @client_version ||= client_version
3190
+ if @es_version
3191
+ Fluent::Plugin::ElasticsearchOutput.module_eval(<<-CODE)
3192
+ def detect_es_major_version
3193
+ #{@es_version}
3194
+ end
3195
+ CODE
3196
+ end
3197
+ Fluent::Plugin::ElasticsearchOutput.module_eval(<<-CODE)
3198
+ def client_library_version
3199
+ #{@client_version}
3200
+ end
3201
+ CODE
3202
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::ElasticsearchOutput).configure(conf)
3203
+ end
3204
+ driver = create_driver("retry_tag retry\n")
3205
+ stub_request(:post, 'http://localhost:9200/_bulk')
3206
+ .to_return(lambda do |req|
3207
+ { :status => 200,
3208
+ :headers => { 'Content-Type' => 'json' },
3209
+ :body => %({
3210
+ "took" : 1,
3211
+ "errors" : true,
3212
+ "items" : [
3213
+ {
3214
+ "create" : {
3215
+ "_index" : "foo",
3216
+ "_type" : "bar",
3217
+ "_id" : "abc1",
3218
+ "status" : 403,
3219
+ "error" : {
3220
+ "type" : "cluster_block_exception",
3221
+ "reason":"index [foo] blocked by: [FORBIDDEN/8/index write (api)]"
3222
+ }
3223
+ }
3224
+ },
3225
+ {
3226
+ "create" : {
3227
+ "_index" : "foo",
3228
+ "_type" : "bar",
3229
+ "_id" : "abc2",
3230
+ "status" : 403,
3231
+ "error" : {
3232
+ "type" : "cluster_block_exception",
3233
+ "reason":"index [foo] blocked by: [FORBIDDEN/8/index write (api)]"
3234
+ }
3235
+ }
3236
+ }
3237
+ ]
3238
+ })
3239
+ }
3240
+ end)
3241
+
3242
+ # Check buffer fulfillment condition
3243
+ assert_raise(Fluent::Plugin::ElasticsearchOutput::RetryStreamEmitFailure) do
3244
+ driver.run(default_tag: 'test') do
3245
+ driver.feed(1, sample_record)
3246
+ driver.feed(1, sample_record)
3247
+ end
3248
+ end
3249
+
3250
+ assert_equal [], driver.events
3251
+ end
3252
+ end
3253
+
3178
3254
  def test_create_should_write_records_with_ids_and_skip_those_without
3179
3255
  driver.configure("write_operation create\nid_key my_id\n@log_level debug")
3180
3256
  stub_request(:post, 'http://localhost:9200/_bulk')
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: 3.7.1
4
+ version: 3.8.0
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: 2019-12-04 00:00:00.000000000 Z
13
+ date: 2019-12-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: fluentd