@Override public void after(Object target, Object[] args, Object result, Throwable throwable) { if (isDebug) { logger.afterInterceptor(target, args, result, throwable); } // Unset server markers if (args[0] instanceof AsyncFrameBuffer) { AsyncFrameBuffer frameBuffer = (AsyncFrameBuffer) args[0]; attachMarkersToInputProtocol(frameBuffer.getInputProtocol(), false); } final Trace trace = this.traceContext.currentRawTraceObject(); if (trace == null) { return; } this.traceContext.removeTraceObject(); if (trace.canSampled()) { try { processTraceObject(trace, target, args, throwable); } catch (Throwable t) { logger.warn("Error processing trace object. Cause:{}", t.getMessage(), t); } finally { trace.close(); } } }
@Override public void after(Object target, Object result, Throwable throwable, Object[] args) { if (isDebug) { logger.afterInterceptor(target, args); } final Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } try { SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(methodDescriptor); recorder.recordServiceType(HttpClientConstants.HTTP_CLIENT_INTERNAL); recorder.recordException(throwable); // remove async id. InterceptorGroupInvocation transaction = interceptorGroup.getCurrentInvocation(); if (transaction != null) { // clear transaction.removeAttachment(); } } finally { trace.traceBlockEnd(); } }
private void deleteUserIncludeTrace(final Trace trace) { if (isDebug) { logger.debug("Delete user include trace={}, sampled={}", trace, trace.canSampled()); } traceContext.removeTraceObject(); trace.close(); }
@Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } Trace trace = traceContext.currentRawTraceObject(); if (trace == null) { // create user include trace for standalone entry point. trace = createUserIncludeTrace(); if (trace == null) { return; } } // check user include trace. if (!isUserIncludeTrace(trace)) { return; } // entry scope(default & disable trace). entryUserIncludeTraceScope(trace); // check sampled. if (!trace.canSampled()) { // skip return; } trace.traceBlockBegin(); }
@Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } final Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } SpanEventRecorder recorder = trace.traceBlockBegin(); try { // set asynchronous trace final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); // set async id. InterceptorGroupInvocation transaction = interceptorGroup.getCurrentInvocation(); if (transaction != null) { transaction.setAttachment(asyncTraceId); if (isDebug) { logger.debug("Set asyncTraceId metadata {}", asyncTraceId); } } } catch (Throwable t) { logger.warn("Failed to before process. {}", t.getMessage(), t); } }
@Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } if (!validate(target, args)) { return; } final Trace trace = this.traceContext.currentRawTraceObject(); if (trace == null) { return; } try { ThriftRequestProperty parentTraceInfo = new ThriftRequestProperty(); final boolean shouldSample = trace.canSampled(); if (!shouldSample) { if (isDebug) { logger.debug("set Sampling flag=false"); } parentTraceInfo.setShouldSample(shouldSample); } else { SpanEventRecorder recorder = trace.traceBlockBegin(); Object asyncMethodCallObj = args[0]; // inject async trace info to AsyncMethodCall object final AsyncTraceId asyncTraceId = injectAsyncTraceId(asyncMethodCallObj, trace); recorder.recordServiceType(THRIFT_CLIENT_INTERNAL); // retrieve connection information String remoteAddress = getRemoteAddress(asyncMethodCallObj); final TraceId nextId = asyncTraceId.getNextTraceId(); // Inject nextSpanId as the actual sending of data will be handled asynchronously. final long nextSpanId = nextId.getSpanId(); parentTraceInfo.setSpanId(nextSpanId); parentTraceInfo.setTraceId(nextId.getTransactionId()); parentTraceInfo.setParentSpanId(nextId.getParentSpanId()); parentTraceInfo.setFlags(nextId.getFlags()); parentTraceInfo.setParentApplicationName(this.traceContext.getApplicationName()); parentTraceInfo.setParentApplicationType(this.traceContext.getServerTypeCode()); parentTraceInfo.setAcceptorHost(remoteAddress); this.asyncCallRemoteAddressAccessor.set(asyncMethodCallObj, remoteAddress); this.asyncNextSpanIdAccessor.set(asyncMethodCallObj, nextSpanId); } InterceptorGroupInvocation currentTransaction = this.group.getCurrentInvocation(); currentTransaction.setAttachment(parentTraceInfo); } catch (Throwable t) { logger.warn("before error. Caused:{}", t.getMessage(), t); } }
private AsyncTraceId injectAsyncTraceId(final Object asyncMethodCallObj, final Trace trace) { final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); this.asyncTraceIdAccessor.set(asyncMethodCallObj, asyncTraceId); if (isDebug) { logger.debug("Set asyncTraceId metadata {}", asyncTraceId); } return asyncTraceId; }
@Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } SpanEventRecorder recorder = trace.traceBlockBegin(); recorder.recordServiceType(JacksonConstants.SERVICE_TYPE); }
@Override public void after(Object target, Object result, Throwable throwable, Object[] args) { super.after(target, result, throwable, args); // End async trace block final Trace trace = super.traceContext.currentTraceObject(); // shouldn't be null if (trace == null) { return; } if (trace.isAsync() && trace.isRootStack()) { trace.close(); super.traceContext.removeTraceObject(); } }
@Override public void after(Object target, Object[] args, Object result, Throwable throwable) { if (isDebug) { logger.afterInterceptor(target, args); } final Trace trace = traceContext.currentRawTraceObject(); if (trace == null) { return; } // check user include trace. if (!isUserIncludeTrace(trace)) { return; } // leave scope(default & disable trace). if (!leaveUserIncludeTraceScope(trace)) { logger.warn( "Failed to leave scope of user include trace. trace={}, sampled={}", trace, trace.canSampled()); // delete unstable trace. deleteUserIncludeTrace(trace); return; } // check sampled. if (!trace.canSampled()) { if (isUserIncludeTraceDestination(trace)) { deleteUserIncludeTrace(trace); } return; } try { final SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(descriptor); recorder.recordServiceType(ServiceType.INTERNAL_METHOD); recorder.recordException(throwable); } finally { trace.traceBlockEnd(); if (isUserIncludeTraceDestination(trace)) { deleteUserIncludeTrace(trace); } } }
private void recordCookie(Request request, Trace trace) { for (String cookie : request.headers("Cookie")) { if (cookieSampler.isSampling()) { final SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordAttribute(AnnotationKey.HTTP_COOKIE, StringUtils.drop(cookie, 1024)); } return; } }
private boolean leaveUserIncludeTraceScope(final Trace trace) { final TraceScope scope = trace.getScope(SCOPE_NAME); if (scope != null) { if (scope.canLeave()) { scope.leave(); } else { return false; } } return true; }
private void processTraceObject( final Trace trace, Object target, Object[] args, Throwable throwable) { // end spanEvent try { // TODO Might need a way to collect and record method arguments // trace.recordAttribute(...); SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordException(throwable); recorder.recordApi(this.descriptor); } catch (Throwable t) { logger.warn("Error processing trace object. Cause:{}", t.getMessage(), t); } finally { trace.traceBlockEnd(); } // end root span SpanRecorder recorder = trace.getSpanRecorder(); String methodUri = getMethodUri(target); recorder.recordRpcName(methodUri); }
@Override public void after(Object target, Object[] args, Object result, Throwable throwable) { if (isDebug) { logger.afterInterceptor(target, args, result, throwable); } final Trace trace = this.traceContext.currentTraceObject(); if (trace == null) { return; } try { SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(this.descriptor); recorder.recordException(throwable); } catch (Throwable t) { logger.warn("after error. Caused:{}", t.getMessage(), t); } finally { trace.traceBlockEnd(); } }
private Trace createUserIncludeTrace() { final Trace trace = traceContext.newTraceObject(); if (isDebug) { logger.debug("New user include trace {} and sampled {}", trace, trace.canSampled()); } // add user scope. TraceScope oldScope = trace.addScope(SCOPE_NAME); if (oldScope != null) { // delete corrupted trace. logger.warn("Duplicated user include trace scope={}.", oldScope.getName()); deleteUserIncludeTrace(trace); return null; } if (trace.canSampled()) { // record root span. final SpanRecorder recorder = trace.getSpanRecorder(); recorder.recordServiceType(ServiceType.STAND_ALONE); recorder.recordApi(USER_INCLUDE_METHOD_DESCRIPTOR); } return trace; }
@Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } final Trace trace = traceContext.currentRawTraceObject(); if (trace == null) { return; } if (!validate(target)) { return; } if (!trace.canSampled()) { return; } SpanEventRecorder recorder = trace.traceBlockBegin(); try { final TraceId nextId = trace.getTraceId().getNextTraceId(); recorder.recordNextSpanId(nextId.getSpanId()); recorder.recordServiceType(OK_HTTP_CLIENT); InterceptorGroupInvocation invocation = interceptorGroup.getCurrentInvocation(); if (invocation != null) { invocation.getOrCreateAttachment( new AttachmentFactory() { @Override public Object createAttachment() { return nextId; } }); } } catch (Throwable t) { logger.warn("Failed to BEFORE process. {}", t.getMessage(), t); } }
private void processTraceObject( final Trace trace, Object target, Object[] args, Throwable throwable) { // end spanEvent try { SpanEventRecorder recorder = trace.currentSpanEventRecorder(); // TODO Might need a way to collect and record method arguments // trace.recordAttribute(...); recorder.recordException(throwable); recorder.recordApi(this.descriptor); } catch (Throwable t) { logger.warn("Error processing trace object. Cause:{}", t.getMessage(), t); } finally { trace.traceBlockEnd(); } // end root span SpanRecorder recorder = trace.getSpanRecorder(); String methodUri = getMethodUri(target); recorder.recordRpcName(methodUri); // retrieve connection information String localIpPort = UNKNOWN_ADDRESS; String remoteAddress = UNKNOWN_ADDRESS; if (args.length == 2 && args[0] instanceof TProtocol) { TProtocol inputProtocol = (TProtocol) args[0]; if (this.socketAccessor.isApplicable(inputProtocol.getTransport())) { Socket socket = this.socketAccessor.get(inputProtocol.getTransport()); if (socket != null) { localIpPort = ThriftUtils.getHostPort(socket.getLocalSocketAddress()); remoteAddress = ThriftUtils.getHost(socket.getRemoteSocketAddress()); } } } if (localIpPort != UNKNOWN_ADDRESS) { recorder.recordEndPoint(localIpPort); } if (remoteAddress != UNKNOWN_ADDRESS) { recorder.recordRemoteAddress(remoteAddress); } }
@Override public void after(Object target, Object[] args, Object result, Throwable throwable) { final Trace trace = this.traceContext.currentRawTraceObject(); if (trace == null) { return; } // logging here as some Thrift servers depend on TTransportException being thrown for normal // operations. // log only when current transaction is being traced. if (isDebug) { logger.afterInterceptor(target, args, result, throwable); } this.traceContext.removeTraceObject(); if (trace.canSampled()) { try { processTraceObject(trace, target, args, throwable); } catch (Throwable t) { logger.warn("Error processing trace object. Cause:{}", t.getMessage(), t); } finally { trace.close(); } } }
@Override public void after(Object target, Object result, Throwable throwable, Object[] args) { if (isDebug) { logger.afterInterceptor(target, args); } Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } try { SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(descriptor); recorder.recordException(throwable); if (result != null) { recorder.recordAttribute( JacksonConstants.ANNOTATION_KEY_LENGTH_VALUE, ((String) result).length()); } } finally { trace.traceBlockEnd(); } }
@Override public void after(Object target, Object[] args, Object result, Throwable throwable) { if (isDebug) { logger.afterInterceptor(target, args); } final Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } if (!validate(target)) { return; } try { SpanEventRecorder recorder = trace.currentSpanEventRecorder(); recorder.recordApi(methodDescriptor); recorder.recordException(throwable); Request request = ((UserRequestGetter) target)._$PINPOINT$_getUserRequest(); if (request != null) { recorder.recordAttribute(AnnotationKey.HTTP_URL, request.httpUrl().toString()); recorder.recordDestinationId(request.httpUrl().host() + ":" + request.httpUrl().port()); recordRequest(trace, request, throwable); } // clear attachment. InterceptorGroupInvocation invocation = interceptorGroup.getCurrentInvocation(); if (invocation != null && invocation.getAttachment() != null) { invocation.removeAttachment(); } } finally { trace.traceBlockEnd(); } }
private boolean isUserIncludeTraceDestination(final Trace trace) { final TraceScope scope = trace.getScope(SCOPE_NAME); return scope != null && !scope.isActive(); }
private boolean isUserIncludeTrace(final Trace trace) { final TraceScope scope = trace.getScope(SCOPE_NAME); return scope != null; }
private void entryUserIncludeTraceScope(final Trace trace) { final TraceScope scope = trace.getScope(SCOPE_NAME); if (scope != null) { scope.tryEnter(); } }