logstash-codec-multiline 0.1.6 → 0.1.7

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: 92893cfcb592a522435a2dbded2f18d00ccdb9f1
4
- data.tar.gz: 6f8c081d02ace21b428c25fdcfb6034ca793eac3
3
+ metadata.gz: 40099b6b6fa37c2e7eada7dd7bd49097f67267ba
4
+ data.tar.gz: d0fb10c0893b4a736bd2913c9b8b9207fc3a9536
5
5
  SHA512:
6
- metadata.gz: 5770dc96a99122f8884b8e09595607554c4cfeb9abd98207177f8db8f7ec6519777dc9b9320ca01896ef1533e35f30c09f47d89863084be0c58a63caceece602
7
- data.tar.gz: 8d62c67ee9c287ad77912367be4fdcd1bac28edde23ae7b500dc66e0167928d029049b00cb4437290cef52e239f5c7a10f6e2f9733ca838b3a41e5f4eef184ec
6
+ metadata.gz: 9847d7a7c4be62cec6527062cbf0ec663015221c0f27ec1e54238622d4d1fd96d52d28c1263be91848b83f90d4852975f760611d7eb90a377fc318dbd42f3c57
7
+ data.tar.gz: c097ad89ff4b7853f016c75d7e8ac4270dfe83e766a4df88ce23fc93b45ba46ccba94a4cd1a616e0fac9809b11b9359f5c48bdcc0583e626c46f9f04053d6f4a
@@ -114,10 +114,23 @@ class LogStash::Codecs::Multiline < LogStash::Codecs::Base
114
114
  # to events that actually have multiple lines in them.
115
115
  config :multiline_tag, :validate => :string, :default => "multiline"
116
116
 
117
+ # The accumulation of events can make logstash exit with an out of memory error
118
+ # if event boundaries are not correctly defined. This settings make sure to flush
119
+ # multiline events after reaching a number of lines, it is used in combination
120
+ # max_bytes.
121
+ config :max_lines, :validate => :number, :default => 500
122
+
123
+ # The accumulation of events can make logstash exit with an out of memory error
124
+ # if event boundaries are not correctly defined. This settings make sure to flush
125
+ # multiline events after reaching a number of bytes, it is used in combination
126
+ # max_lines.
127
+ config :max_bytes, :validate => :bytes, :default => "10 MiB"
128
+
117
129
  public
118
130
  def register
119
131
  require "grok-pure" # rubygem 'jls-grok'
120
132
  require 'logstash/patterns/core'
133
+
121
134
  # Detect if we are running from a jarfile, pick the right path.
122
135
  patterns_path = []
123
136
  patterns_path += [LogStash::Patterns::Core.path]
@@ -139,14 +152,14 @@ class LogStash::Codecs::Multiline < LogStash::Codecs::Base
139
152
  @grok.compile(@pattern)
140
153
  @logger.debug("Registered multiline plugin", :type => @type, :config => @config)
141
154
 
142
- @buffer = []
155
+ reset_buffer
156
+
143
157
  @handler = method("do_#{@what}".to_sym)
144
158
 
145
159
  @converter = LogStash::Util::Charset.new(@charset)
146
160
  @converter.logger = @logger
147
161
  end # def register
148
162
 
149
- public
150
163
  def decode(text, &block)
151
164
  text = @converter.convert(text)
152
165
 
@@ -163,31 +176,52 @@ class LogStash::Codecs::Multiline < LogStash::Codecs::Base
163
176
 
164
177
  def buffer(text)
165
178
  @time = LogStash::Timestamp.now if @buffer.empty?
179
+ @buffer_bytes += text.bytesize
166
180
  @buffer << text
167
181
  end
168
182
 
169
183
  def flush(&block)
170
- if @buffer.any?
171
- event = LogStash::Event.new(LogStash::Event::TIMESTAMP => @time, "message" => @buffer.join(NL))
172
- # Tag multiline events
173
- event.tag @multiline_tag if @multiline_tag && @buffer.size > 1
174
-
175
- yield event
176
- @buffer = []
184
+ if @buffer.any?
185
+ yield merge_events
186
+ reset_buffer
177
187
  end
178
188
  end
179
189
 
190
+ def merge_events
191
+ event = LogStash::Event.new(LogStash::Event::TIMESTAMP => @time, "message" => @buffer.join(NL))
192
+ event.tag @multiline_tag if @multiline_tag && @buffer.size > 1
193
+ event.tag "multiline_codec_max_bytes_reached" if over_maximun_bytes?
194
+ event.tag "multiline_codec_max_lines_reached" if over_maximun_lines?
195
+ event
196
+ end
197
+
198
+ def reset_buffer
199
+ @buffer = []
200
+ @buffer_bytes = 0
201
+ end
202
+
180
203
  def do_next(text, matched, &block)
181
204
  buffer(text)
182
- flush(&block) if !matched
205
+ flush(&block) if !matched || buffer_over_limits?
183
206
  end
184
207
 
185
208
  def do_previous(text, matched, &block)
186
- flush(&block) if !matched
209
+ flush(&block) if !matched || buffer_over_limits?
187
210
  buffer(text)
188
211
  end
189
212
 
190
- public
213
+ def over_maximun_lines?
214
+ @buffer.size > @max_lines
215
+ end
216
+
217
+ def over_maximun_bytes?
218
+ @buffer_bytes >= @max_bytes
219
+ end
220
+
221
+ def buffer_over_limits?
222
+ over_maximun_lines? || over_maximun_bytes?
223
+ end
224
+
191
225
  def encode(event)
192
226
  # Nothing to do.
193
227
  @on_event.call(event, event)
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-codec-multiline'
4
- s.version = '0.1.6'
4
+ s.version = '0.1.7'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "The multiline codec will collapse multiline messages and merge them into a single event."
7
7
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
-
3
2
  require "logstash/codecs/multiline"
4
3
  require "logstash/event"
5
4
  require "insist"
5
+ require_relative "../supports/helpers.rb"
6
6
 
7
7
  describe LogStash::Codecs::Multiline do
8
8
  context "#decode" do
@@ -171,4 +171,51 @@ describe LogStash::Codecs::Multiline do
171
171
 
172
172
  end
173
173
  end
174
+
175
+ context "with non closed multiline events" do
176
+ let(:random_number_of_events) { rand(300..1000) }
177
+ let(:sample_event) { "- Sample event" }
178
+ let(:events) { decode_events }
179
+ let(:unmerged_events_count) { events.collect { |event| event["message"].split(LogStash::Codecs::Multiline::NL).size }.inject(&:+) }
180
+
181
+ context "break on maximum_lines" do
182
+ let(:max_lines) { rand(10..100) }
183
+ let(:options) {
184
+ {
185
+ "pattern" => "^-",
186
+ "what" => "previous",
187
+ "max_lines" => max_lines,
188
+ "max_bytes" => "2 mb"
189
+ }
190
+ }
191
+
192
+ it "flushes on a maximum lines" do
193
+ expect(unmerged_events_count).to eq(random_number_of_events)
194
+ end
195
+
196
+ it "tags the event" do
197
+ expect(events.first["tags"]).to include("multiline_codec_max_lines_reached")
198
+ end
199
+ end
200
+
201
+ context "break on maximum bytes" do
202
+ let(:max_bytes) { rand(30..100) }
203
+ let(:options) {
204
+ {
205
+ "pattern" => "^-",
206
+ "what" => "previous",
207
+ "max_lines" => 20000,
208
+ "max_bytes" => max_bytes
209
+ }
210
+ }
211
+
212
+ it "flushes on a maximum bytes size" do
213
+ expect(unmerged_events_count).to eq(random_number_of_events)
214
+ end
215
+
216
+ it "tags the event" do
217
+ expect(events.first["tags"]).to include("multiline_codec_max_bytes_reached")
218
+ end
219
+ end
220
+ end
174
221
  end
@@ -0,0 +1,14 @@
1
+ require "lib/logstash/codecs/multiline"
2
+
3
+ def decode_events
4
+ multiline = LogStash::Codecs::Multiline.new(options)
5
+
6
+ events = []
7
+ random_number_of_events.times do |n|
8
+ multiline.decode(sample_event) { |event| events << event }
9
+ end
10
+
11
+ # Grab the in-memory-event
12
+ multiline.flush { |event| events << event }
13
+ events
14
+ end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-codec-multiline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elasticsearch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-26 00:00:00.000000000 Z
11
+ date: 2015-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- requirement: !ruby/object:Gem::Requirement
14
+ name: logstash-core
15
+ version_requirements: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - '>='
17
18
  - !ruby/object:Gem::Version
@@ -19,10 +20,7 @@ dependencies:
19
20
  - - <
20
21
  - !ruby/object:Gem::Version
21
22
  version: 2.0.0
22
- name: logstash-core
23
- prerelease: false
24
- type: :runtime
25
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: !ruby/object:Gem::Requirement
26
24
  requirements:
27
25
  - - '>='
28
26
  - !ruby/object:Gem::Version
@@ -30,48 +28,50 @@ dependencies:
30
28
  - - <
31
29
  - !ruby/object:Gem::Version
32
30
  version: 2.0.0
31
+ prerelease: false
32
+ type: :runtime
33
33
  - !ruby/object:Gem::Dependency
34
+ name: logstash-patterns-core
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
34
40
  requirement: !ruby/object:Gem::Requirement
35
41
  requirements:
36
42
  - - '>='
37
43
  - !ruby/object:Gem::Version
38
44
  version: '0'
39
- name: logstash-patterns-core
40
45
  prerelease: false
41
46
  type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ name: jls-grok
42
49
  version_requirements: !ruby/object:Gem::Requirement
43
50
  requirements:
44
- - - '>='
51
+ - - ~>
45
52
  - !ruby/object:Gem::Version
46
- version: '0'
47
- - !ruby/object:Gem::Dependency
53
+ version: 0.11.1
48
54
  requirement: !ruby/object:Gem::Requirement
49
55
  requirements:
50
56
  - - ~>
51
57
  - !ruby/object:Gem::Version
52
58
  version: 0.11.1
53
- name: jls-grok
54
59
  prerelease: false
55
60
  type: :runtime
61
+ - !ruby/object:Gem::Dependency
62
+ name: logstash-devutils
56
63
  version_requirements: !ruby/object:Gem::Requirement
57
64
  requirements:
58
- - - ~>
65
+ - - '>='
59
66
  - !ruby/object:Gem::Version
60
- version: 0.11.1
61
- - !ruby/object:Gem::Dependency
67
+ version: '0'
62
68
  requirement: !ruby/object:Gem::Requirement
63
69
  requirements:
64
70
  - - '>='
65
71
  - !ruby/object:Gem::Version
66
72
  version: '0'
67
- name: logstash-devutils
68
73
  prerelease: false
69
74
  type: :development
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - '>='
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
75
  description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
76
76
  email: info@elasticsearch.com
77
77
  executables: []
@@ -87,6 +87,7 @@ files:
87
87
  - lib/logstash/codecs/multiline.rb
88
88
  - logstash-codec-multiline.gemspec
89
89
  - spec/codecs/multiline_spec.rb
90
+ - spec/supports/helpers.rb
90
91
  homepage: http://www.elasticsearch.org/guide/en/logstash/current/index.html
91
92
  licenses:
92
93
  - Apache License (2.0)
@@ -109,9 +110,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
110
  version: '0'
110
111
  requirements: []
111
112
  rubyforge_project:
112
- rubygems_version: 2.4.5
113
+ rubygems_version: 2.1.9
113
114
  signing_key:
114
115
  specification_version: 4
115
116
  summary: The multiline codec will collapse multiline messages and merge them into a single event.
116
117
  test_files:
117
118
  - spec/codecs/multiline_spec.rb
119
+ - spec/supports/helpers.rb