1313# limitations under the License.
1414#
1515module 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 , /\b panic: / , :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
0 commit comments