fluent-plugin-concat 0.2.1 → 0.3.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
  SHA1:
3
- metadata.gz: ab2756baf7697fc5f22d31a25bc1d93206dbc7e3
4
- data.tar.gz: de0b4dfce0995316546e180ad3454453c2af476f
3
+ metadata.gz: 7b95595a2254d2e9f69c9962e78a80fc180a823d
4
+ data.tar.gz: f66346b750f623cf21619185a3ab786b486d02f3
5
5
  SHA512:
6
- metadata.gz: a5e9dfa61b84279df61639b4698fb0a762301dc427c2ee95a6d314a7e6804fdc799a3c35cd7988781c8ab1c24607b2617bac18976c74634fa8f3a31d8f669581
7
- data.tar.gz: 05b1ba5590e8581db137768bc91bcc34f9b8358d4741758d8283c26d1b7b40b0d6b0b33ad4a218977dc50a47eb1cd6be6e8c76408f3e33afcd99cf92352c0c4e
6
+ metadata.gz: a16c79ae6dd8c57f033ffe9f82624987e9eeaf6a4ff291e30c1c73be72f38ddc862804bc67fd557da82d3496f9743de9bfa1c965fae0f60f6d32eaecd0199647
7
+ data.tar.gz: f4bd47413c823f36775d6c5ecc2a533dd801ece990b2a39da86b74308c873ad664b1478656bd48c8e8b9a194417223741f01128380eeff082710bcd5e17cb18a
data/README.md CHANGED
@@ -41,6 +41,10 @@ This is exclusive with `multiline_start_regex`.
41
41
  The regexp to match beginning of multiline.
42
42
  This is exclusive with `n_lines.`
43
43
 
44
+ **multiline\_end\_regexp**
45
+
46
+ The regexp to match ending of multiline.
47
+
44
48
  **stream\_identity\_key**
45
49
 
46
50
  The key to determine which stream an event belongs to.
@@ -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 = "0.2.1"
7
+ spec.version = "0.3.0"
8
8
  spec.authors = ["Kenji Okimoto"]
9
9
  spec.email = ["okimoto@clear-code.com"]
10
10
 
@@ -10,6 +10,8 @@ module Fluent
10
10
  config_param :n_lines, :integer, default: nil
11
11
  desc "The regexp to match beginning of multiline"
12
12
  config_param :multiline_start_regexp, :string, default: nil
13
+ desc "The regexp to match ending of multiline"
14
+ config_param :multiline_end_regexp, :string, default: nil
13
15
  desc "The key to determine which stream an event belongs to"
14
16
  config_param :stream_identity_key, :string, default: nil
15
17
 
@@ -34,16 +36,24 @@ module Fluent
34
36
  when @n_lines
35
37
  @mode = :line
36
38
  when @multiline_start_regexp
37
- @multiline_start_regexp = Regexp.compile(@multiline_start_regexp[1..-2])
38
39
  @mode = :regexp
40
+ @multiline_start_regexp = Regexp.compile(@multiline_start_regexp[1..-2])
41
+ if @multiline_end_regexp
42
+ @multiline_end_regexp = Regexp.compile(@multiline_end_regexp[1..-2])
43
+ end
39
44
  end
40
45
  end
41
46
 
47
+ def shutdown
48
+ super
49
+ flush_all_buffer
50
+ end
51
+
42
52
  def filter_stream(tag, es)
43
53
  new_es = MultiEventStream.new
44
54
  es.each do |time, record|
45
55
  begin
46
- new_record = process(record)
56
+ new_record = process(tag, time, record)
47
57
  new_es.add(time, record.merge(new_record)) if new_record
48
58
  rescue => e
49
59
  router.emit_error_event(tag, time, record, e)
@@ -54,7 +64,7 @@ module Fluent
54
64
 
55
65
  private
56
66
 
57
- def process(record)
67
+ def process(tag, time, record)
58
68
  if @stream_identity_key
59
69
  stream_identity = record[@stream_identity_key]
60
70
  else
@@ -62,19 +72,23 @@ module Fluent
62
72
  end
63
73
  case @mode
64
74
  when :line
65
- @buffer[stream_identity] << record[@key]
66
- if @n_lines && @buffer[stream_identity].size >= @n_lines
75
+ @buffer[stream_identity] << [tag, time, record]
76
+ if @buffer[stream_identity].size >= @n_lines
67
77
  return flush_buffer(stream_identity)
68
78
  end
69
79
  when :regexp
70
- if firstline?(record[@key])
80
+ case
81
+ when firstline?(record[@key])
71
82
  if @buffer[stream_identity].empty?
72
- @buffer[stream_identity] << record[@key]
83
+ @buffer[stream_identity] << [tag, time, record]
73
84
  else
74
- return flush_buffer(stream_identity, record[@key])
85
+ return flush_buffer(stream_identity, [tag, time, record])
75
86
  end
87
+ when lastline?(record[@key])
88
+ @buffer[stream_identity] << [tag, time, record]
89
+ return flush_buffer(stream_identity)
76
90
  else
77
- @buffer[stream_identity] << record[@key]
91
+ @buffer[stream_identity] << [tag, time, record]
78
92
  end
79
93
  end
80
94
  nil
@@ -84,12 +98,33 @@ module Fluent
84
98
  !!@multiline_start_regexp.match(text)
85
99
  end
86
100
 
87
- def flush_buffer(stream_identity, new_message = nil)
88
- new_record = {}
89
- new_record[@key] = @buffer[stream_identity].join(@separator)
101
+ def lastline?(text)
102
+ @multiline_end_regexp && !!@multiline_end_regexp.match(text)
103
+ end
104
+
105
+ def flush_buffer(stream_identity, new_element = nil)
106
+ lines = @buffer[stream_identity].map{|_tag, _time, record| record[@key] }
107
+ new_record = {
108
+ @key => lines.join(@separator)
109
+ }
90
110
  @buffer[stream_identity] = []
91
- @buffer[stream_identity] << new_message if new_message
111
+ @buffer[stream_identity] << new_element if new_element
92
112
  new_record
93
113
  end
114
+
115
+ def flush_all_buffer
116
+ @buffer.each do |stream_identity, elements|
117
+ next if elements.empty?
118
+ es = MultiEventStream.new
119
+ lines = elements.map{|_tag, _time, record| record[@key] }
120
+ new_record = {
121
+ @key => lines.join(@separator)
122
+ }
123
+ tag, time, record = elements.last
124
+ es.add(time, record.merge(new_record))
125
+ router.emit_stream(tag, es)
126
+ end
127
+ @buffer.clear
128
+ end
94
129
  end
95
130
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-concat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenji Okimoto