fluent-plugin-concat 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee5e1936b898d90227550ba4baadba4f3d64d31577a1b0923aa634a0b3a49e6c
4
- data.tar.gz: 59be67a9067f3589e9728702a4b4a8bb9f25e8915eedd4aa308dc297e710ba46
3
+ metadata.gz: d906b3c9372b21adec5b1515e4820b037d90a0fa83a32f01dad1a8d6e5e0f79c
4
+ data.tar.gz: 9685f06e791e53ae0fcb3bb3e71991f812405298084c31cb4cc61a4181e17d6c
5
5
  SHA512:
6
- metadata.gz: 2827392627d1d6d1eba547bb1d167fd86d9ebb88cb0c5aa98db6cb124a254da0af841de55a9ef4f437548a6c4175202f8bd751647ee711d40b2fd3607400f829
7
- data.tar.gz: c827c2d9b14b509abd801428ac9aae29f34d99b12e6359e2152eb4b4716a7204dddf3638a9e9124da0eaee0d17fb8edd5e2ff18e6c3ff7fba5be4b000fad097f
6
+ metadata.gz: 1683fcfe93f86fedbc89334dde6565b48fad41800631a5624ebfd26f89f8c725c0cff1aed9ef3733d863bf1ec3fb2e0e62676ce78a68dc40d332b08f80209748
7
+ data.tar.gz: 6bec85d758dfce0dbced83a03413d2e1c2cef6d73a9c30ccb07f03c62d5d211d13559fdd7703f373f72af6d3c631ecf753451b93737777e82b2fc053ae5cb0ef
@@ -4,6 +4,11 @@ AllCops:
4
4
  Exclude:
5
5
  - "vendor/**/*"
6
6
 
7
+ Layout/MultilineMethodCallIndentation:
8
+ EnforcedStyle: indented
9
+ Layout/SpaceInsideBlockBraces:
10
+ EnforcedStyle: space
11
+ SpaceBeforeBlockParameters: false
7
12
  Lint/UnderscorePrefixedVariableName:
8
13
  Enabled: false
9
14
  Lint/UnusedMethodArgument:
@@ -19,6 +24,9 @@ Metrics/ParameterLists:
19
24
  Metrics/MethodLength:
20
25
  Max: 30
21
26
 
27
+ Naming/FileName:
28
+ Enabled: false
29
+
22
30
  Style/AsciiComments:
23
31
  Enabled: false
24
32
  Style/HashSyntax:
@@ -29,11 +37,11 @@ Style/FrozenStringLiteralComment:
29
37
  Enabled: false
30
38
  Style/StringLiterals:
31
39
  EnforcedStyle: double_quotes
32
- Style/TrailingCommaInLiteral:
40
+ Style/TrailingCommaInArrayLiteral:
33
41
  Enabled: false
34
- Style/TrailingCommaInArguments:
42
+ Style/TrailingCommaInHashLiteral:
35
43
  Enabled: false
36
- Style/FileName:
44
+ Style/TrailingCommaInArguments:
37
45
  Enabled: false
38
46
  Style/Documentation:
39
47
  Enabled: false
@@ -41,13 +49,8 @@ Style/WordArray:
41
49
  Enabled: false
42
50
  Style/BarePercentLiterals:
43
51
  EnforcedStyle: percent_q
44
- Style/SpaceInsideBlockBraces:
45
- EnforcedStyle: space
46
- SpaceBeforeBlockParameters: false
47
52
  Style/BracesAroundHashParameters:
48
53
  Enabled: false
49
- Style/MultilineMethodCallIndentation:
50
- EnforcedStyle: indented
51
54
  Style/DoubleNegation:
52
55
  Enabled: false
53
56
  Style/EmptyCaseCondition:
@@ -9,13 +9,11 @@ notifications:
9
9
  on_failure: always
10
10
  on_start: never
11
11
 
12
- rvm:
13
- - 2.1
14
- - 2.2
15
- - 2.3
16
- - 2.4.3
17
- - 2.5.0
18
-
19
- gemfile:
20
- - Gemfile
21
- - gemfiles/fluentd_v0.14.gemfile
12
+ matrix:
13
+ include:
14
+ - rvm: 2.4.5
15
+ gemfile: Gemfile
16
+ - rvm: 2.5.5
17
+ gemfile: Gemfile
18
+ - rvm: 2.6.2
19
+ gemfile: Gemfile
data/Appraisals CHANGED
@@ -1,3 +0,0 @@
1
- appraise "fluentd v0.14" do
2
- gem "fluentd", "~> 0.14.0"
3
- end
data/README.md CHANGED
@@ -33,58 +33,69 @@ Or install it yourself as:
33
33
 
34
34
  The key for part of multiline log.
35
35
 
36
- **separator** (string)
36
+ **separator** (string) (optional)
37
37
 
38
38
  The separator of lines.
39
39
  Default value is `"\n"`.
40
40
 
41
- **n\_lines** (integer)
41
+ **n\_lines** (integer) (optional)
42
42
 
43
43
  The number of lines.
44
44
  This is exclusive with `multiline_start_regex`.
45
45
 
46
- **multiline\_start\_regexp**
46
+ **multiline\_start\_regexp** (string) (optional)
47
47
 
48
48
  The regexp to match beginning of multiline.
49
49
  This is exclusive with `n_lines.`
50
50
 
51
- **multiline\_end\_regexp**
51
+ **multiline\_end\_regexp** (string) (optional)
52
52
 
53
53
  The regexp to match ending of multiline.
54
54
  This is exclusive with `n_lines.`
55
55
 
56
- **continuous\_line\_regexp**
56
+ **continuous\_line\_regexp** (string) (optional)
57
57
 
58
58
  The regexp to match continuous lines.
59
59
  This is exclusive with `n_lines.`
60
60
 
61
- **stream\_identity\_key** (string)
61
+ **stream\_identity\_key** (string) (optional)
62
62
 
63
63
  The key to determine which stream an event belongs to.
64
64
 
65
- **flush\_interval** (integer)
65
+ **flush\_interval** (integer) (optional)
66
66
 
67
67
  The number of seconds after which the last received event log will be flushed.
68
68
  If specified 0, wait for next line forever.
69
69
 
70
- **use\_first\_timestamp** (bool)
70
+ **timeout\_label** (string) (optional)
71
+
72
+ The label name to handle events caused by timeout.
73
+
74
+ **use\_first\_timestamp** (bool) (optional)
71
75
 
72
76
  Use timestamp of first record when buffer is flushed.
73
77
  Default value is `false`.
74
78
 
75
- **partial\_key** (string)
79
+ **partial\_key** (string) (optional)
76
80
 
77
81
  The field name that is the reference to concatenate records
78
82
 
79
- **partial\_value** (string)
83
+ **partial\_value** (string) (optional)
80
84
 
81
85
  The value stored in the field specified by partial_key that represent partial log
82
86
 
83
- **keep\_partial\_key** (bool)
87
+ **keep\_partial\_key** (bool) (optional)
84
88
 
85
89
  If true, keep partial_key in concatenated records
86
90
  Default value is `false`.
87
91
 
92
+ **use\_partial\_metadata** (bool) (optional)
93
+
94
+ Use partial metadata to concatenate multiple records
95
+
96
+ **keep\_partial\_metadata** (bool) (optional)
97
+
98
+ If true, keep partial metadata
88
99
 
89
100
  ## Usage
90
101
 
@@ -152,7 +163,7 @@ Handle single line JSON from Docker containers.
152
163
  </filter>
153
164
  ```
154
165
 
155
- Handle Docker's `partial_message`.
166
+ Handle Docker logs splitted in several parts (using `partial_message`), and do not add new line between parts.
156
167
 
157
168
  ```aconf
158
169
  <filter>
@@ -160,6 +171,18 @@ Handle Docker's `partial_message`.
160
171
  key message
161
172
  partial_key partial_message
162
173
  partial_value true
174
+ separator ""
175
+ </filter>
176
+ ```
177
+
178
+ Handle Docker logs splitted in several parts (using newline detection), and do not add new line between parts (prior to Docker 18.06).
179
+
180
+ ```aconf
181
+ <filter **>
182
+ @type concat
183
+ key log
184
+ multiline_end_regexp /\\n$/
185
+ separator ""
163
186
  </filter>
164
187
  ```
165
188
 
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-concat"
7
- spec.version = "2.3.0"
7
+ spec.version = "2.4.0"
8
8
  spec.authors = ["Kenji Okimoto"]
9
9
  spec.email = ["okimoto@clear-code.com"]
10
10
 
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.add_runtime_dependency "fluentd", ">= 0.14.0", "< 2"
20
- spec.add_development_dependency "bundler", "~> 1.11"
20
+ spec.add_development_dependency "bundler"
21
21
  spec.add_development_dependency "rake", "~> 12.0"
22
22
  spec.add_development_dependency "test-unit", ">= 3.1.0"
23
23
  spec.add_development_dependency "test-unit-rr"
@@ -32,6 +32,10 @@ module Fluent::Plugin
32
32
  config_param :partial_value, :string, default: nil
33
33
  desc "If true, keep partial_key in concatenated records"
34
34
  config_param :keep_partial_key, :bool, default: false
35
+ desc "Use partial metadata to concatenate multiple records"
36
+ config_param :use_partial_metadata, :bool, default: false
37
+ desc "If true, keep partial metadata"
38
+ config_param :keep_partial_metadata, :bool, default: false
35
39
 
36
40
  class TimeoutError < StandardError
37
41
  end
@@ -49,12 +53,12 @@ module Fluent::Plugin
49
53
  def configure(conf)
50
54
  super
51
55
 
56
+ if @n_lines.nil? && @multiline_start_regexp.nil? && @multiline_end_regexp.nil? && @partial_key.nil? && !@use_partial_metadata
57
+ raise Fluent::ConfigError, "Either n_lines, multiline_start_regexp, multiline_end_regexp, partial_key or use_partial_metadata is required"
58
+ end
52
59
  if @n_lines && (@multiline_start_regexp || @multiline_end_regexp)
53
60
  raise Fluent::ConfigError, "n_lines and multiline_start_regexp/multiline_end_regexp are exclusive"
54
61
  end
55
- if @n_lines.nil? && @multiline_start_regexp.nil? && @multiline_end_regexp.nil? && @partial_key.nil?
56
- raise Fluent::ConfigError, "Either n_lines or multiline_start_regexp or multiline_end_regexp is required"
57
- end
58
62
  if @partial_key && @n_lines
59
63
  raise Fluent::ConfigError, "partial_key and n_lines are exclusive"
60
64
  end
@@ -64,6 +68,15 @@ module Fluent::Plugin
64
68
  if @partial_key && @partial_value.nil?
65
69
  raise Fluent::ConfigError, "partial_value is required when partial_key is specified"
66
70
  end
71
+ if @use_partial_metadata && @n_lines
72
+ raise Fluent::ConfigError, "user_partial_metadata and n_lines are exclusive"
73
+ end
74
+ if @use_partial_metadata && (@multiline_start_regexp || @multiline_end_regexp)
75
+ raise Fluent::ConfigError, "user_partial_metadata and multiline_start_regexp/multiline_end_regexp are exclusive"
76
+ end
77
+ if @use_partial_metadata && @partial_key
78
+ raise Fluent::ConfigError, "user_partial_metadata and partial_key are exclusive"
79
+ end
67
80
 
68
81
  @mode = nil
69
82
  case
@@ -71,6 +84,8 @@ module Fluent::Plugin
71
84
  @mode = :line
72
85
  when @partial_key
73
86
  @mode = :partial
87
+ when @use_partial_metadata
88
+ @mode = :partial_metadata
74
89
  when @multiline_start_regexp || @multiline_end_regexp
75
90
  @mode = :regexp
76
91
  if @multiline_start_regexp
@@ -108,13 +123,35 @@ module Fluent::Plugin
108
123
  new_es.add(time, record)
109
124
  next
110
125
  end
126
+ if @mode == :partial
127
+ unless record.key?(@partial_key)
128
+ new_es.add(time, record)
129
+ next
130
+ end
131
+ end
132
+ if @mode == :partial_metadata
133
+ unless record.key?("partial_message")
134
+ new_es.add(time, record)
135
+ next
136
+ end
137
+ end
111
138
  begin
112
139
  flushed_es = process(tag, time, record)
113
140
  unless flushed_es.empty?
114
141
  flushed_es.each do |_time, new_record|
115
142
  time = _time if @use_first_timestamp
116
143
  merged_record = record.merge(new_record)
117
- merged_record.delete(@partial_key) unless @keep_partial_key
144
+ case @mode
145
+ when :partial
146
+ merged_record.delete(@partial_key) unless @keep_partial_key
147
+ when :partial_metadata
148
+ unless @keep_partial_metadata
149
+ merged_record.delete("partial_message")
150
+ merged_record.delete("partial_id")
151
+ merged_record.delete("partial_ordinal")
152
+ merged_record.delete("partial_last")
153
+ end
154
+ end
118
155
  new_es.add(time, merged_record)
119
156
  end
120
157
  end
@@ -136,10 +173,18 @@ module Fluent::Plugin
136
173
  end
137
174
 
138
175
  def process(tag, time, record)
139
- if @stream_identity_key
140
- stream_identity = "#{tag}:#{record[@stream_identity_key]}"
176
+ if @mode == :partial_metadata
177
+ if @stream_identity_key
178
+ stream_identity = %Q(#{tag}:#{record[@stream_identity_key]}#{record["partial_id"]})
179
+ else
180
+ stream_identity = %Q(#{tag}:#{record["partial_id"]})
181
+ end
141
182
  else
142
- stream_identity = "#{tag}:default"
183
+ if @stream_identity_key
184
+ stream_identity = "#{tag}:#{record[@stream_identity_key]}"
185
+ else
186
+ stream_identity = "#{tag}:default"
187
+ end
143
188
  end
144
189
  @timeout_map_mutex.synchronize do
145
190
  @timeout_map[stream_identity] = Fluent::Engine.now
@@ -149,6 +194,8 @@ module Fluent::Plugin
149
194
  process_line(stream_identity, tag, time, record)
150
195
  when :partial
151
196
  process_partial(stream_identity, tag, time, record)
197
+ when :partial_metadata
198
+ process_partial_metadata(stream_identity, tag, time, record)
152
199
  when :regexp
153
200
  process_regexp(stream_identity, tag, time, record)
154
201
  end
@@ -177,6 +224,18 @@ module Fluent::Plugin
177
224
  new_es
178
225
  end
179
226
 
227
+ def process_partial_metadata(stream_identity, tag, time, record)
228
+ new_es = Fluent::MultiEventStream.new
229
+ @buffer[stream_identity] << [tag, time, record]
230
+ if record["partial_last"] == "true"
231
+ new_time, new_record = flush_buffer(stream_identity)
232
+ time = new_time if @use_first_timestamp
233
+ new_record.delete(@partial_key)
234
+ new_es.add(time, new_record)
235
+ end
236
+ new_es
237
+ end
238
+
180
239
  def process_regexp(stream_identity, tag, time, record)
181
240
  new_es = Fluent::MultiEventStream.new
182
241
  case
@@ -245,7 +304,13 @@ module Fluent::Plugin
245
304
  end
246
305
 
247
306
  def flush_buffer(stream_identity, new_element = nil)
248
- lines = @buffer[stream_identity].map {|_tag, _time, record| record[@key] }
307
+ lines = if @mode == :partial_metadata
308
+ @buffer[stream_identity]
309
+ .sort_by {|_tag, _time, record| record["partial_ordinal"].to_i }
310
+ .map {|_tag, _time, record| record[@key] }
311
+ else
312
+ @buffer[stream_identity].map {|_tag, _time, record| record[@key] }
313
+ end
249
314
  _tag, time, first_record = @buffer[stream_identity].first
250
315
  new_record = {
251
316
  @key => lines.join(@separator)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-concat
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenji Okimoto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-23 00:00:00.000000000 Z
11
+ date: 2019-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -34,16 +34,16 @@ dependencies:
34
34
  name: bundler
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: '1.11'
39
+ version: '0'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
44
+ - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: '1.11'
46
+ version: '0'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +118,6 @@ files:
118
118
  - README.md
119
119
  - Rakefile
120
120
  - fluent-plugin-concat.gemspec
121
- - gemfiles/fluentd_v0.14.gemfile
122
121
  - lib/fluent/plugin/filter_concat.rb
123
122
  homepage: https://github.com/fluent-plugins-nursery/fluent-plugin-concat
124
123
  licenses:
@@ -139,8 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
138
  - !ruby/object:Gem::Version
140
139
  version: '0'
141
140
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.7.6
141
+ rubygems_version: 3.0.3
144
142
  signing_key:
145
143
  specification_version: 4
146
144
  summary: Fluentd Filter plugin to concat multiple event messages
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "fluentd", "~> 0.14.0"
6
-
7
- gemspec :path => "../"