Skip to content

Commit 1e54284

Browse files
Allow multiple start states for a rule. Support nested Java exceptions. Handle Java logback. (#52)
1 parent c953df6 commit 1e54284

File tree

3 files changed

+55
-13
lines changed

3 files changed

+55
-13
lines changed

.rubocop.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ Metrics/AbcSize:
1414
Metrics/ClassLength:
1515
Max: 1300
1616

17+
# Offense count: 1
18+
# Configuration parameters: CountComments.
19+
Metrics/ModuleLength:
20+
Max: 150
21+
1722
# Offense count: 3
1823
Metrics/CyclomaticComplexity:
1924
Max: 50

lib/fluent/plugin/exception_detector.rb

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414
#
1515
module Fluent
16-
Struct.new('Rule', :from_state, :pattern, :to_state)
16+
Struct.new('Rule', :from_states, :pattern, :to_state)
1717

1818
# Configuration of the state machine that detects exceptions.
1919
module ExceptionDetectorConfig
@@ -41,21 +41,28 @@ def state
4141
end
4242
end
4343

44-
def self.rule(from_state, pattern, to_state)
45-
Struct::Rule.new(from_state, pattern, to_state)
44+
def self.rule(from_state_or_states, pattern, to_state)
45+
from_state_or_states = [from_state_or_states] unless
46+
from_state_or_states.is_a?(Array)
47+
Struct::Rule.new(from_state_or_states, pattern, to_state)
4648
end
4749

4850
def self.supported
4951
RULES_BY_LANG.keys
5052
end
5153

5254
JAVA_RULES = [
53-
rule(:start_state,
55+
rule([:start_state, :java_start_exception],
5456
/(?:Exception|Error|Throwable|V8 errors stack trace)[:\r\n]/,
55-
:java),
56-
rule(:java, /^[\t ]+(?:eval )?at /, :java),
57-
rule(:java, /^[\t ]*(?:Caused by|Suppressed):/, :java),
58-
rule(:java, /^[\t ]*... \d+\ more/, :java)
57+
:java_after_exception),
58+
rule(:java_after_exception, /^[\t ]*nested exception is:[\t ]*/,
59+
:java_start_exception),
60+
rule(:java_after_exception, /^[\r\n]*$/, :java_after_exception),
61+
rule([:java_after_exception, :java], /^[\t ]+(?:eval )?at /, :java),
62+
rule([:java_after_exception, :java], /^[\t ]*(?:Caused by|Suppressed):/,
63+
:java_after_exception),
64+
rule([:java_after_exception, :java],
65+
/^[\t ]*... \d+ (?:more|common frames omitted)/, :java)
5966
].freeze
6067

6168
PYTHON_RULES = [
@@ -76,13 +83,12 @@ def self.supported
7683

7784
GO_RULES = [
7885
rule(:start_state, /\bpanic: /, :go_after_panic),
79-
rule(:go_after_panic, /^$/, :go_goroutine),
86+
rule([:go_after_panic, :go_after_signal, :go_frame_1],
87+
/^$/, :go_goroutine),
8088
rule(:go_after_panic, /^\[signal /, :go_after_signal),
81-
rule(:go_after_signal, /^$/, :go_goroutine),
8289
rule(:go_goroutine, /^goroutine \d+ \[[^\]]+\]:$/, :go_frame_1),
8390
rule(:go_frame_1, /^(?:[^\s.:]+\.)*[^\s.():]+\(|^created by /,
8491
:go_frame_2),
85-
rule(:go_frame_1, /^$/, :go_goroutine),
8692
rule(:go_frame_2, /^\s/, :go_frame_1)
8793
].freeze
8894

@@ -169,7 +175,9 @@ def initialize(*languages)
169175
rule_config.each do |r|
170176
target = ExceptionDetectorConfig::RuleTarget.new(r[:pattern],
171177
r[:to_state])
172-
@rules[r[:from_state]] << target
178+
r[:from_states].each do |from_state|
179+
@rules[from_state] << target
180+
end
173181
end
174182
end
175183

test/plugin/test_exception_detector.rb

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,35 @@ class ExceptionDetectorTest < Test::Unit::TestCase
5959
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
6060
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
6161
at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30)
62-
... 27 more
62+
... 27 common frames omitted
63+
END
64+
65+
NESTED_JAVA_EXC = <<END.freeze
66+
java.lang.RuntimeException: javax.mail.SendFailedException: Invalid Addresses;
67+
nested exception is:
68+
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 <[REDACTED_EMAIL_ADDRESS]>... Relaying denied
69+
70+
at com.nethunt.crm.api.server.adminsync.AutomaticEmailFacade.sendWithSmtp(AutomaticEmailFacade.java:236)
71+
at com.nethunt.crm.api.server.adminsync.AutomaticEmailFacade.sendSingleEmail(AutomaticEmailFacade.java:285)
72+
at com.nethunt.crm.api.server.adminsync.AutomaticEmailFacade.lambda$sendSingleEmail$3(AutomaticEmailFacade.java:254)
73+
at java.util.Optional.ifPresent(Optional.java:159)
74+
at com.nethunt.crm.api.server.adminsync.AutomaticEmailFacade.sendSingleEmail(AutomaticEmailFacade.java:253)
75+
at com.nethunt.crm.api.server.adminsync.AutomaticEmailFacade.sendSingleEmail(AutomaticEmailFacade.java:249)
76+
at com.nethunt.crm.api.email.EmailSender.lambda$notifyPerson$0(EmailSender.java:80)
77+
at com.nethunt.crm.api.util.ManagedExecutor.lambda$execute$0(ManagedExecutor.java:36)
78+
at com.nethunt.crm.api.util.RequestContextActivator.lambda$withRequestContext$0(RequestContextActivator.java:36)
79+
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
80+
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
81+
at java.base/java.lang.Thread.run(Thread.java:748)
82+
Caused by: javax.mail.SendFailedException: Invalid Addresses;
83+
nested exception is:
84+
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 <[REDACTED_EMAIL_ADDRESS]>... Relaying denied
85+
86+
at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:2064)
87+
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1286)
88+
at com.nethunt.crm.api.server.adminsync.AutomaticEmailFacade.sendWithSmtp(AutomaticEmailFacade.java:229)
89+
... 12 more
90+
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 <[REDACTED_EMAIL_ADDRESS]>... Relaying denied
6391
END
6492

6593
NODE_JS_EXC = <<END.freeze
@@ -531,6 +559,7 @@ def check_exception(exception, detects_end)
531559
def test_java
532560
check_exception(JAVA_EXC, false)
533561
check_exception(COMPLEX_JAVA_EXC, false)
562+
check_exception(NESTED_JAVA_EXC, false)
534563
end
535564

536565
def test_js

0 commit comments

Comments
 (0)