APM跟踪消息的拦截和发送在拦截器中定义,以tomcat request的拦截器为例,在一个around拦截器里,before方法里记录开始信息,在after里记录此次请求的完整信息,之后通过sender发送数据
public class RequestStartAsyncInterceptor implements AroundInterceptor {
@Override
public void before(Object target, Object[] args) {
trace.traceBlockBegin();
}
@Override
public void after(Object target, Object[] args, Object result, Throwable throwable) {
final Trace trace = traceContext.currentTraceObject();
try {
SpanEventRecorder recorder = trace.currentSpanEventRecorder();
recorder.recordApi(descriptor);
recorder.recordException(throwable);
} catch (Throwable t) {
logger.warn("Failed to AFTER process. {}", t.getMessage(), t);
} finally {
trace.traceBlockEnd();
}
}
}
public final class DefaultTrace implements Trace {
@Override
public void traceBlockEnd(int stackId) {
final SpanEvent spanEvent = callStack.pop();
logSpan(spanEvent);
}
private void logSpan(SpanEvent spanEvent) {
this.storage.store(spanEvent);
}
}
public final class SimpleSpanStorage implements Storage {
private final DataSender dataSender;
@Override
public void store(SpanEvent spanEvent) {
this.dataSender.send(spanEvent);
}
}
@Override
public void store(Span span) {
this.dataSender.send(span);
}
}