package org.stagemonitor.tracing.wrapper;
import io.opentracing.Span;
import io.opentracing.Tracer;
/**
* Provides callbacks for interesting events triggered by calling certain {@link Span} and {@link
* io.opentracing.Tracer.SpanBuilder} methods.
* <p/>
* Use Cases:
* <ul>
* <li>
* Tracking of metrics in {@link #onFinish(SpanWrapper, String, long)} based on the operation name, the
* duration and possibly some tags which are stored in a class variable.
* </li>
* <li>
* Context propagation: set the current span in {@link #onStart(SpanWrapper)} for example into a {@link ThreadLocal}
* {@link java.util.Stack} and pop in in {@link #onFinish(SpanWrapper, String, long)}
* </li>
* <li>
* Populate the {@link org.slf4j.MDC}
* </li>
* <li>
* Implement custom span reporters by leveraging the {@link #onFinish(SpanWrapper, String, long)} method
* </li>
* </ul>
*/
public interface SpanEventListener {
/**
* Called when a {@link Span} is started ({@link Tracer.SpanBuilder#start()}
* <p/>
* Note: when calling <code>spanWrapper.setTag(...)</code>, all registered {@link SpanEventListener}s are notified.
* If you don't want that, call <code>spanWrapper.getDelegate().setTag(...)</code>.
* <p/>
* Note: tags might be set on the span before it has been started
*
* @param spanWrapper the span which was just started
*/
void onStart(SpanWrapper spanWrapper);
/**
* Callback for {@link Span#setTag(String, String)} and {@link Tracer.SpanBuilder#withTag(String, String)}
*
* This method may be called before a span is started.
*
* @param key the tag key
* @param value the tag value
* @return you can modify the value of the tag by returning a different value then the provided one
*/
String onSetTag(String key, String value);
/**
* Callback for {@link Span#setTag(String, boolean)} and {@link Tracer.SpanBuilder#withTag(String, boolean)}
*
* This method may be called before a span is started.
*
* @param key the tag key
* @param value the tag value
* @return you can modify the value of the tag by returning a different value then the provided one
*/
boolean onSetTag(String key, boolean value);
/**
* Callback for {@link Span#setTag(String, Number)} and {@link Tracer.SpanBuilder#withTag(String, Number)}
*
* This method may be called before a span is started.
*
* @param key the tag key
* @param value the tag value
* @return you can modify the value of the tag by returning a different value then the provided one
*/
Number onSetTag(String key, Number value);
/**
* Callback for {@link Span#finish}. The actual span will be finished after all {@link #onFinish} callbacks have
* been executed.
* <p/>
* Note: when calling <code>spanWrapper.setTag(...)</code>, all registered {@link SpanEventListener}s are notified.
* If you don't want that, call <code>spanWrapper.getDelegate().setTag(...)</code>.
*
* @param spanWrapper the span which has just beed finished
* @param operationName the operation name of this span. The operation name is final only on finish because it can
* be set any time via {@link Span#setOperationName(String)}
* @param durationNanos the duration of this span in nanoseconds
*/
void onFinish(SpanWrapper spanWrapper, String operationName, long durationNanos);
}