66package io .opentelemetry .contrib .stacktrace ;
77
88import io .opentelemetry .api .common .AttributeKey ;
9- import io .opentelemetry .contrib .stacktrace .internal .AbstractSimpleChainingSpanProcessor ;
10- import io .opentelemetry .contrib .stacktrace .internal .MutableSpan ;
9+ import io .opentelemetry .context .Context ;
1110import io .opentelemetry .sdk .autoconfigure .spi .ConfigProperties ;
11+ import io .opentelemetry .sdk .trace .ReadWriteSpan ;
1212import io .opentelemetry .sdk .trace .ReadableSpan ;
13- import io .opentelemetry .sdk .trace .SpanProcessor ;
13+ import io .opentelemetry .sdk .trace .internal . ExtendedSpanProcessor ;
1414import java .io .PrintWriter ;
1515import java .io .StringWriter ;
1616import java .time .Duration ;
1717import java .util .function .Predicate ;
1818import java .util .logging .Level ;
1919import java .util .logging .Logger ;
2020
21- public class StackTraceSpanProcessor extends AbstractSimpleChainingSpanProcessor {
21+ public class StackTraceSpanProcessor implements ExtendedSpanProcessor {
2222
2323 private static final String CONFIG_MIN_DURATION =
2424 "otel.java.experimental.span-stacktrace.min.duration" ;
@@ -35,13 +35,11 @@ public class StackTraceSpanProcessor extends AbstractSimpleChainingSpanProcessor
3535 private final Predicate <ReadableSpan > filterPredicate ;
3636
3737 /**
38- * @param next next span processor to invoke
3938 * @param minSpanDurationNanos minimum span duration in ns for stacktrace capture
4039 * @param filterPredicate extra filter function to exclude spans if needed
4140 */
4241 public StackTraceSpanProcessor (
43- SpanProcessor next , long minSpanDurationNanos , Predicate <ReadableSpan > filterPredicate ) {
44- super (next );
42+ long minSpanDurationNanos , Predicate <ReadableSpan > filterPredicate ) {
4543 this .minSpanDurationNanos = minSpanDurationNanos ;
4644 this .filterPredicate = filterPredicate ;
4745 if (minSpanDurationNanos < 0 ) {
@@ -55,47 +53,51 @@ public StackTraceSpanProcessor(
5553 }
5654
5755 /**
58- * @param next next span processor to invoke
5956 * @param config configuration
6057 * @param filterPredicate extra filter function to exclude spans if needed
6158 */
62- public StackTraceSpanProcessor (
63- SpanProcessor next , ConfigProperties config , Predicate <ReadableSpan > filterPredicate ) {
59+ public StackTraceSpanProcessor (ConfigProperties config , Predicate <ReadableSpan > filterPredicate ) {
6460 this (
65- next ,
6661 config .getDuration (CONFIG_MIN_DURATION , CONFIG_MIN_DURATION_DEFAULT ).toNanos (),
6762 filterPredicate );
6863 }
6964
7065 @ Override
71- protected boolean requiresStart () {
66+ public boolean isStartRequired () {
7267 return false ;
7368 }
7469
7570 @ Override
76- protected boolean requiresEnd () {
71+ public void onStart (Context context , ReadWriteSpan readWriteSpan ) {}
72+
73+ @ Override
74+ public boolean isOnEndingRequired () {
7775 return true ;
7876 }
7977
8078 @ Override
81- protected ReadableSpan doOnEnd ( ReadableSpan span ) {
79+ public void onEnding ( ReadWriteSpan span ) {
8280 if (minSpanDurationNanos < 0 || span .getLatencyNanos () < minSpanDurationNanos ) {
83- return span ;
81+ return ;
8482 }
8583 if (span .getAttribute (SPAN_STACKTRACE ) != null ) {
8684 // Span already has a stacktrace, do not override
87- return span ;
85+ return ;
8886 }
8987 if (!filterPredicate .test (span )) {
90- return span ;
88+ return ;
9189 }
92- MutableSpan mutableSpan = MutableSpan .makeMutable (span );
90+ span .setAttribute (SPAN_STACKTRACE , generateSpanEndStacktrace ());
91+ }
9392
94- String stacktrace = generateSpanEndStacktrace ();
95- mutableSpan . setAttribute ( SPAN_STACKTRACE , stacktrace );
96- return mutableSpan ;
93+ @ Override
94+ public boolean isEndRequired () {
95+ return false ;
9796 }
9897
98+ @ Override
99+ public void onEnd (ReadableSpan readableSpan ) {}
100+
99101 private static String generateSpanEndStacktrace () {
100102 Throwable exception = new Throwable ();
101103 StringWriter stringWriter = new StringWriter ();
0 commit comments