1515import io .opentelemetry .javaagent .extension .instrumentation .TypeTransformer ;
1616import io .opentelemetry .javaagent .instrumentation .jsf .jakarta .JsfRequest ;
1717import jakarta .faces .event .ActionEvent ;
18+ import javax .annotation .Nullable ;
1819import net .bytebuddy .asm .Advice ;
1920import net .bytebuddy .description .type .TypeDescription ;
2021import net .bytebuddy .matcher .ElementMatcher ;
@@ -36,34 +37,48 @@ public void transform(TypeTransformer transformer) {
3637 @ SuppressWarnings ("unused" )
3738 public static class ProcessActionAdvice {
3839
39- @ Advice .OnMethodEnter (suppress = Throwable .class )
40- public static void onEnter (
41- @ Advice .Argument (0 ) ActionEvent event ,
42- @ Advice .Local ("otelRequest" ) JsfRequest request ,
43- @ Advice .Local ("otelContext" ) Context context ,
44- @ Advice .Local ("otelScope" ) Scope scope ) {
45- Context parentContext = Java8BytecodeBridge .currentContext ();
40+ public static class AdviceScope {
41+ private final JsfRequest request ;
42+ private final Context context ;
43+ private final Scope scope ;
44+
45+ private AdviceScope (JsfRequest request , Context context , Scope scope ) {
46+ this .request = request ;
47+ this .context = context ;
48+ this .scope = scope ;
49+ }
4650
47- request = new JsfRequest (event );
48- if (!request .shouldStartSpan () || !instrumenter ().shouldStart (parentContext , request )) {
49- return ;
51+ @ Nullable
52+ public static AdviceScope start (@ Advice .Argument (0 ) ActionEvent event ) {
53+ Context parentContext = Java8BytecodeBridge .currentContext ();
54+ JsfRequest request = new JsfRequest (event );
55+ if (!request .shouldStartSpan () || !instrumenter ().shouldStart (parentContext , request )) {
56+ return null ;
57+ }
58+ Context context = instrumenter ().start (parentContext , request );
59+ Scope scope = context .makeCurrent ();
60+ return new AdviceScope (request , context , scope );
5061 }
5162
52- context = instrumenter ().start (parentContext , request );
53- scope = context .makeCurrent ();
63+ public void end (Throwable throwable ) {
64+ scope .close ();
65+ instrumenter ().end (context , request , null , throwable );
66+ }
67+ }
68+
69+ @ Nullable
70+ @ Advice .OnMethodEnter (suppress = Throwable .class )
71+ public static AdviceScope onEnter (@ Advice .Argument (0 ) ActionEvent event ) {
72+ return AdviceScope .start (event );
5473 }
5574
5675 @ Advice .OnMethodExit (onThrowable = Throwable .class , suppress = Throwable .class )
5776 public static void stopSpan (
58- @ Advice .Thrown Throwable throwable ,
59- @ Advice .Local ("otelRequest" ) JsfRequest request ,
60- @ Advice .Local ("otelContext" ) Context context ,
61- @ Advice .Local ("otelScope" ) Scope scope ) {
62- if (scope == null ) {
63- return ;
77+ @ Advice .Thrown @ Nullable Throwable throwable ,
78+ @ Advice .Enter @ Nullable AdviceScope adviceScope ) {
79+ if (adviceScope != null ) {
80+ adviceScope .end (throwable );
6481 }
65- scope .close ();
66- instrumenter ().end (context , request , null , throwable );
6782 }
6883 }
6984}
0 commit comments