logstash-filter-grok 3.4.4 → 4.0.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: 8a7d6245f3e543f6bee1730eaa9055caeb392ae193fb9a06269829fe3e30e838
4
- data.tar.gz: cc3a933bfa9dc1cf892743c209500eb9db910b40cb8c15583ec36d6f54672061
3
+ metadata.gz: d06febb2d4c48dd7c02d2d89ecbe2c379c345b980687d10e80542192f3b232d9
4
+ data.tar.gz: ddb45461cff71c3fee2c7cd9e84780e0c0c216b207c23cee42ed39d499be25bf
5
5
  SHA512:
6
- metadata.gz: 04055244f69d3f18a8a7e774c1353dd215c4e2e8900d312d738deb796e00631e060bf1c6fdaccdad4743431bd49c770bc2da07bf377f25110595134bfae7f4ae
7
- data.tar.gz: 645106767ebce79cb04fd509073cc929326b9f3bd9c3b3bf219c227978e46fd5dfd4178d680e99c4f83053b143bf0ef667916d6f8f8237d975aa48702324dafe
6
+ metadata.gz: 7db250b93474764efb1c769aab63fe9e8850fa9eac4e14ad4b5ec82bdb296d6fe6edc92e4604c7f70cc52199929b2ce31b523cd07f75abb7fd781da64f74b385
7
+ data.tar.gz: 55051f431618fa87a944984de8b62ec81daaed169e719fad74d84d323b034d776d76bf26d568f5b587cabd16008ff2154c6b245f640287df36cf26ed7b7a0f9c
@@ -1,3 +1,9 @@
1
+ ## 4.0.0
2
+ - Major performance improvements due to reduced locking
3
+
4
+ ## 3.4.5
5
+ - version yanked due to breaking changes within .patch release cause logstash crashes in < 5.6
6
+
1
7
  ## 3.4.4
2
8
  - Update gemspec summary
3
9
 
@@ -287,19 +287,18 @@
287
287
  @patterns[field] << grok
288
288
  end
289
289
  end # @match.each
290
+ @match_counter = metric.counter(:matches)
291
+ @failure_counter = metric.counter(:failures)
290
292
  end # def register
291
293
 
292
294
  public
293
295
  def filter(event)
294
296
  matched = false
295
- done = false
296
297
 
297
- @logger.debug? and @logger.debug("Running grok filter", :event => event);
298
+ @logger.debug? and @logger.debug("Running grok filter", :event => event)
298
299
 
299
300
  @patterns.each do |field, groks|
300
- success = match(groks, field, event)
301
-
302
- if success
301
+ if match(groks, field, event)
303
302
  matched = true
304
303
  break if @break_on_match
305
304
  end
@@ -307,10 +306,10 @@
307
306
  end # @patterns.each
308
307
 
309
308
  if matched
310
- metric.increment(:matches)
309
+ @match_counter.increment(1)
311
310
  filter_matched(event)
312
311
  else
313
- metric.increment(:failures)
312
+ @failure_counter.increment(1)
314
313
  @tag_on_failure.each {|tag| event.tag(tag)}
315
314
  end
316
315
 
@@ -345,7 +344,7 @@
345
344
  groks.each do |grok|
346
345
  # Convert anything else to string (number, hash, etc)
347
346
 
348
- matched = @timeout_enforcer.grok_till_timeout(event, grok, field, input) { grok.execute(input) }
347
+ matched = @timeout_enforcer.grok_till_timeout(grok, field, input)
349
348
  if matched
350
349
  grok.capture(matched) {|field, value| handle(field, value, event)}
351
350
  break if @break_on_match
@@ -1,5 +1,3 @@
1
- java_import java.util.concurrent.locks.ReentrantLock
2
-
3
1
  class LogStash::Filters::Grok::TimeoutEnforcer
4
2
  attr_reader :running
5
3
 
@@ -10,24 +8,30 @@ class LogStash::Filters::Grok::TimeoutEnforcer
10
8
 
11
9
  # Stores running matches with their start time, this is used to cancel long running matches
12
10
  # Is a map of Thread => start_time
13
- @threads_to_start_time = {}
14
- @state_lock = ReentrantLock.new
11
+ @threads_to_start_time = java.util.concurrent.ConcurrentHashMap.new
12
+ @cancel_mutex = Mutex.new
15
13
  end
16
14
 
17
- def grok_till_timeout(event, grok, field, value)
15
+ def grok_till_timeout(grok, field, value)
18
16
  begin
19
17
  thread = java.lang.Thread.currentThread()
20
18
  start_thread_groking(thread)
21
- yield
19
+ grok.execute(value)
22
20
  rescue InterruptedRegexpError => e
23
21
  raise ::LogStash::Filters::Grok::TimeoutException.new(grok, field, value)
24
22
  ensure
25
- stop_thread_groking(thread)
26
- # Clear any interrupts from any previous invocations that were not caught by Joni
27
- # It may appear that this should go in #stop_thread_groking but that would actually
28
- # break functionality! If this were moved there we would clear the interrupt
29
- # immediately after setting it in #cancel_timed_out, hence this MUST be here
30
- thread.interrupted
23
+ unless stop_thread_groking(thread)
24
+ @cancel_mutex.lock
25
+ begin
26
+ # Clear any interrupts from any previous invocations that were not caught by Joni
27
+ # It may appear that this should go in #stop_thread_groking but that would actually
28
+ # break functionality! If this were moved there we would clear the interrupt
29
+ # immediately after setting it in #cancel_timed_out, hence this MUST be here
30
+ java.lang.Thread.interrupted
31
+ ensure
32
+ @cancel_mutex.unlock
33
+ end
34
+ end
31
35
  end
32
36
  end
33
37
 
@@ -64,44 +68,38 @@ class LogStash::Filters::Grok::TimeoutEnforcer
64
68
 
65
69
  def start_thread_groking(thread)
66
70
  # Clear any interrupts from any previous invocations that were not caught by Joni
67
- thread.interrupted
68
- synchronize do
69
- @threads_to_start_time[thread] = java.lang.System.nanoTime()
70
- end
71
+ java.lang.Thread.interrupted
72
+ @threads_to_start_time.put(thread, java.lang.System.nanoTime)
71
73
  end
72
74
 
75
+ # Returns falsy in case there was no Grok execution in progress for the thread
73
76
  def stop_thread_groking(thread)
74
- synchronize do
75
- @threads_to_start_time.delete(thread)
76
- end
77
+ @threads_to_start_time.remove(thread)
77
78
  end
78
79
 
79
80
  def cancel_timed_out!
80
- synchronize do
81
- @threads_to_start_time.each do |thread,start_time|
82
- now = java.lang.System.nanoTime # save ourselves some nanotime calls
83
- elapsed = java.lang.System.nanoTime - start_time
84
- if elapsed > @timeout_nanos
85
- elapsed_millis = elapsed / 1000
86
- thread.interrupt()
87
- # Ensure that we never attempt to cancel this thread twice in the event
88
- # of weird races
89
- stop_thread_groking(thread)
81
+ now = java.lang.System.nanoTime # save ourselves some nanotime calls
82
+ @threads_to_start_time.entry_set.each do |entry|
83
+ start_time = entry.get_value
84
+ if start_time < now && now - start_time > @timeout_nanos
85
+ thread = entry.get_key
86
+ # Ensure that we never attempt to cancel this thread unless a Grok execution is in progress
87
+ # Theoretically there is a race condition here in case the entry's grok action changed
88
+ # between evaluating the above condition on the start_time and calling stop_thread_groking
89
+ # Practically this is impossible, since it would require a whole loop of writing to an
90
+ # output, pulling new input events and starting a new Grok execution in worker thread
91
+ # in between the above `if start_time < now && now - start_time > @timeout_nanos` and
92
+ # the call to `stop_thread_groking`.
93
+ if stop_thread_groking(thread)
94
+ @cancel_mutex.lock
95
+ begin
96
+ thread.interrupt()
97
+ ensure
98
+ @cancel_mutex.unlock
99
+ end
90
100
  end
91
101
  end
92
102
  end
93
103
  end
94
104
 
95
- # We use this instead of a Mutex because JRuby mutexes are interruptible
96
- # We actually don't want that behavior since we always clear the interrupt in
97
- # grok_till_timeout
98
- def synchronize
99
- # The JRuby Mutex uses lockInterruptibly which is what we DO NOT want
100
- @state_lock.lock()
101
- yield
102
- ensure
103
- @state_lock.unlock()
104
- end
105
-
106
-
107
105
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-grok'
4
- s.version = '3.4.4'
4
+ s.version = '4.0.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Parses unstructured event data into fields"
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/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -21,10 +21,11 @@ Gem::Specification.new do |s|
21
21
 
22
22
  # Gem dependencies
23
23
  s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
24
+ s.add_runtime_dependency "logstash-core", ">= 5.6.0"
24
25
 
25
26
  s.add_runtime_dependency 'jls-grok', '~> 0.11.3'
26
27
  s.add_runtime_dependency 'stud', '~> 0.0.22'
27
28
  s.add_runtime_dependency 'logstash-patterns-core'
28
29
 
29
- s.add_development_dependency 'logstash-devutils'
30
+ s.add_development_dependency 'logstash-devutils', '= 1.3.6'
30
31
  end
@@ -889,7 +889,7 @@ describe LogStash::Filters::Grok do
889
889
  insist { subject.to_json } =~ %r|"@version":"1"|
890
890
  insist { subject.to_json } =~ %r|"username"|i
891
891
  insist { subject.to_json } =~ %r|"testuser"|
892
- insist { subject.to_json } =~ %r|"tags":\["ssh_failure"\]}|
892
+ insist { subject.to_json } =~ %r|"tags":\["ssh_failure"\]|
893
893
  end
894
894
  end
895
895
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-grok
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.4
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-07 00:00:00.000000000 Z
11
+ date: 2017-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - "<="
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.99'
33
+ - !ruby/object:Gem::Dependency
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: 5.6.0
39
+ name: logstash-core
40
+ prerelease: false
41
+ type: :runtime
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 5.6.0
33
47
  - !ruby/object:Gem::Dependency
34
48
  requirement: !ruby/object:Gem::Requirement
35
49
  requirements:
@@ -75,17 +89,17 @@ dependencies:
75
89
  - !ruby/object:Gem::Dependency
76
90
  requirement: !ruby/object:Gem::Requirement
77
91
  requirements:
78
- - - ">="
92
+ - - '='
79
93
  - !ruby/object:Gem::Version
80
- version: '0'
94
+ version: 1.3.6
81
95
  name: logstash-devutils
82
96
  prerelease: false
83
97
  type: :development
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
- - - ">="
100
+ - - '='
87
101
  - !ruby/object:Gem::Version
88
- version: '0'
102
+ version: 1.3.6
89
103
  description: This gem is a Logstash plugin required to be installed on top of the
90
104
  Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
91
105
  gem is not a stand-alone program
@@ -128,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
142
  version: '0'
129
143
  requirements: []
130
144
  rubyforge_project:
131
- rubygems_version: 2.6.11
145
+ rubygems_version: 2.6.13
132
146
  signing_key:
133
147
  specification_version: 4
134
148
  summary: Parses unstructured event data into fields