diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/SpanEventRecorder.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanEventRecorder.java similarity index 96% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/context/SpanEventRecorder.java rename to bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanEventRecorder.java index c19649234a07..43054c379a16 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/SpanEventRecorder.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanEventRecorder.java @@ -1,4 +1,4 @@ -package com.navercorp.pinpoint.profiler.context; +package com.navercorp.pinpoint.bootstrap.context; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; import com.navercorp.pinpoint.common.trace.AnnotationKey; diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/SpanRecorder.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanRecorder.java similarity index 92% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/context/SpanRecorder.java rename to bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanRecorder.java index ab49bfc32c6c..efeee7f8f06c 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/SpanRecorder.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/SpanRecorder.java @@ -1,4 +1,4 @@ -package com.navercorp.pinpoint.profiler.context; +package com.navercorp.pinpoint.bootstrap.context; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; import com.navercorp.pinpoint.common.trace.AnnotationKey; @@ -6,6 +6,10 @@ public interface SpanRecorder { + boolean canSampled(); + + boolean isRoot(); + void markBeforeTime(); void markAfterTime(); diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/StackOperation.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/StackOperation.java index d497e7784b6d..8efa97514055 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/StackOperation.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/StackOperation.java @@ -20,18 +20,19 @@ * @author emeroad */ public interface StackOperation { - public static final int DEFAULT_STACKID = -1; + public static final int ROOT_STACKID = 0; - void traceBlockBegin(); + SpanEventRecorder traceBlockBegin(); - void traceBlockBegin(int stackId); + SpanEventRecorder traceBlockBegin(int stackId); void traceBlockEnd(); void traceBlockEnd(int stackId); + boolean isRootStack(); + int getStackFrameId(); - -} +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/Trace.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/Trace.java index 9186053abc08..ce055286fb7d 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/Trace.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/context/Trace.java @@ -31,8 +31,11 @@ public interface Trace extends StackOperation { boolean isAsync(); - long getTraceStartTime(); - + long getTraceStartTime(); + + SpanRecorder getSpanRecorder(); + + SpanEventRecorder getSpanEventRecorder(); void close(); -} +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/BasicMethodInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/BasicMethodInterceptor.java index 64ad19d22ccb..50400dee3e87 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/BasicMethodInterceptor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/BasicMethodInterceptor.java @@ -16,6 +16,7 @@ package com.navercorp.pinpoint.bootstrap.interceptor; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.logging.PLogger; @@ -57,10 +58,9 @@ public void before(Object target, Object[] args) { return; } - trace.traceBlockBegin(); - trace.markBeforeTime(); - - trace.recordServiceType(serviceType); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); + recorder.recordServiceType(serviceType); } @Override @@ -75,12 +75,12 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { - trace.recordApi(descriptor); - trace.recordException(throwable); - - trace.markAfterTime(); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordApi(descriptor); + recorder.recordException(throwable); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } } -} +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanAsyncEventSimpleAroundInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanAsyncEventSimpleAroundInterceptor.java index b93e5824607a..5fbb2442e3af 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanAsyncEventSimpleAroundInterceptor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanAsyncEventSimpleAroundInterceptor.java @@ -2,6 +2,7 @@ import com.navercorp.pinpoint.bootstrap.MetadataAccessor; import com.navercorp.pinpoint.bootstrap.context.AsyncTraceId; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; @@ -48,13 +49,13 @@ public void before(Object target, Object[] args) { if(isDebug) { logger.debug("Continue async trace. {}", asyncTraceId); } - + traceFirstBlockBegin(trace); } try { - trace.traceBlockBegin(); - doInBeforeTrace(trace, asyncTraceId, target, args); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + doInBeforeTrace(recorder, asyncTraceId, target, args); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("before. Caused:{}", th.getMessage(), th); @@ -64,17 +65,14 @@ public void before(Object target, Object[] args) { private void traceFirstBlockBegin(final Trace trace) { // first block - trace.markBeforeTime(); - trace.recordServiceType(ServiceType.ASYNC); - trace.recordApi(asyncMethodDescriptor); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.markBeforeTime(); + recorder.recordServiceType(ServiceType.ASYNC); + recorder.recordApi(asyncMethodDescriptor); } - private void traceFirstBlockEnd(final Trace trace) { - // first block - trace.markAfterTime(); - } - protected abstract void doInBeforeTrace(Trace trace, AsyncTraceId asyncTraceId, Object target, Object[] args); + protected abstract void doInBeforeTrace(SpanEventRecorder recorder, AsyncTraceId asyncTraceId, Object target, Object[] args); @Override public void after(Object target, Object[] args, Object result, Throwable throwable) { @@ -93,7 +91,8 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { - doInAfterTrace(trace, target, args, result, throwable); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + doInAfterTrace(recorder, target, args, result, throwable); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("after error. Caused:{}", th.getMessage(), th); @@ -112,7 +111,13 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } } - protected abstract void doInAfterTrace(Trace trace, Object target, Object[] args, Object result, Throwable throwable); + private void traceFirstBlockEnd(final Trace trace) { + // first block + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.markAfterTime(); + } + + protected abstract void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable); public class AsyncMethodDescriptor implements MethodDescriptor { diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptor.java index 7a6d103efd2e..8661df8c58b7 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptor.java @@ -16,7 +16,7 @@ package com.navercorp.pinpoint.bootstrap.interceptor; -import com.navercorp.pinpoint.bootstrap.context.RecordableTrace; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.logging.PLogger; @@ -24,6 +24,7 @@ /** * @author emeroad + * @author jaehong.kim */ public abstract class SpanEventSimpleAroundInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { protected final PLogger logger; @@ -50,9 +51,10 @@ public void before(Object target, Object[] args) { if (trace == null) { return; } + try { - trace.traceBlockBegin(); - doInBeforeTrace(trace, target, args); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + doInBeforeTrace(recorder, target, args); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("before. Caused:{}", th.getMessage(), th); @@ -68,7 +70,7 @@ protected void prepareBeforeTrace(Object target, Object[] args) { } - protected abstract void doInBeforeTrace(final RecordableTrace trace, final Object target, final Object[] args); + protected abstract void doInBeforeTrace(final SpanEventRecorder recorder, final Object target, final Object[] args); @Override @@ -83,8 +85,10 @@ public void after(Object target, Object[] args, Object result, Throwable throwab if (trace == null) { return; } + try { - doInAfterTrace(trace, target, args, result, throwable); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + doInAfterTrace(recorder, target, args, result, throwable); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("after error. Caused:{}", th.getMessage(), th); @@ -99,10 +103,9 @@ protected void logAfterInterceptor(Object target, Object[] args, Object result, } protected void prepareAfterTrace(Object target, Object[] args, Object result, Throwable throwable) { - } - protected abstract void doInAfterTrace(final RecordableTrace trace, final Object target, final Object[] args, final Object result, Throwable throwable); + protected abstract void doInAfterTrace(final SpanEventRecorder recorder, final Object target, final Object[] args, final Object result, Throwable throwable); @Override @@ -123,4 +126,4 @@ public void setTraceContext(TraceContext traceContext) { public TraceContext getTraceContext() { return traceContext; } -} +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptorForPlugin.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptorForPlugin.java index 52d577382e8c..4e62e05294aa 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptorForPlugin.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanEventSimpleAroundInterceptorForPlugin.java @@ -16,7 +16,7 @@ package com.navercorp.pinpoint.bootstrap.interceptor; -import com.navercorp.pinpoint.bootstrap.context.RecordableTrace; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.logging.PLogger; @@ -24,6 +24,7 @@ /** * @author emeroad + * @author jaehong.kim */ public abstract class SpanEventSimpleAroundInterceptorForPlugin implements SimpleAroundInterceptor { protected final PLogger logger = PLoggerFactory.getLogger(getClass()); @@ -49,9 +50,10 @@ public void before(Object target, Object[] args) { if (trace == null) { return; } + try { - trace.traceBlockBegin(); - doInBeforeTrace(trace, target, args); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + doInBeforeTrace(recorder, target, args); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("before. Caused:{}", th.getMessage(), th); @@ -67,8 +69,7 @@ protected void prepareBeforeTrace(Object target, Object[] args) { } - protected abstract void doInBeforeTrace(final RecordableTrace trace, final Object target, final Object[] args); - + protected abstract void doInBeforeTrace(final SpanEventRecorder recorder, final Object target, final Object[] args); @Override public void after(Object target, Object[] args, Object result, Throwable throwable) { @@ -83,7 +84,8 @@ public void after(Object target, Object[] args, Object result, Throwable throwab return; } try { - doInAfterTrace(trace, target, args, result, throwable); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + doInAfterTrace(recorder, target, args, result, throwable); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("after error. Caused:{}", th.getMessage(), th); @@ -98,10 +100,9 @@ protected void logAfterInterceptor(Object target, Object[] args, Object result, } protected void prepareAfterTrace(Object target, Object[] args, Object result, Throwable throwable) { - } - protected abstract void doInAfterTrace(final RecordableTrace trace, final Object target, final Object[] args, final Object result, Throwable throwable); + protected abstract void doInAfterTrace(final SpanEventRecorder recorder, final Object target, final Object[] args, final Object result, Throwable throwable); protected MethodDescriptor getMethodDescriptor() { return methodDescriptor; @@ -110,4 +111,4 @@ protected MethodDescriptor getMethodDescriptor() { protected TraceContext getTraceContext() { return traceContext; } -} +} \ No newline at end of file diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanSimpleAroundInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanSimpleAroundInterceptor.java index 27ea95ce8dda..85e50a13ca4e 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanSimpleAroundInterceptor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SpanSimpleAroundInterceptor.java @@ -16,7 +16,7 @@ package com.navercorp.pinpoint.bootstrap.interceptor; -import com.navercorp.pinpoint.bootstrap.context.RecordableTrace; +import com.navercorp.pinpoint.bootstrap.context.SpanRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.logging.PLogger; @@ -55,7 +55,8 @@ public void before(Object target, Object[] args) { return; } // ------------------------------------------------------ - doInBeforeTrace(trace, target, args); + final SpanRecorder recorder = trace.getSpanRecorder(); + doInBeforeTrace(recorder, target, args); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("before. Caused:{}", th.getMessage(), th); @@ -63,7 +64,7 @@ public void before(Object target, Object[] args) { } } - protected abstract void doInBeforeTrace(final RecordableTrace trace, Object target, final Object[] args); + protected abstract void doInBeforeTrace(final SpanRecorder recorder, Object target, final Object[] args); protected abstract Trace createTrace(final Object target, final Object[] args); @@ -85,7 +86,8 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } // ------------------------------------------------------ try { - doInAfterTrace(trace, target, args, result, throwable); + final SpanRecorder recorder = trace.getSpanRecorder(); + doInAfterTrace(recorder, target, args, result, throwable); } catch (Throwable th) { if (logger.isWarnEnabled()) { logger.warn("after. Caused:{}", th.getMessage(), th); @@ -96,7 +98,7 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } } - protected abstract void doInAfterTrace(final RecordableTrace trace, final Object target, final Object[] args, final Object result, Throwable throwable); + protected abstract void doInAfterTrace(final SpanRecorder recorder, final Object target, final Object[] args, final Object result, Throwable throwable); protected void deleteTrace(final Trace trace, final Object target, final Object[] args, final Object result, Throwable throwable) { trace.close(); diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java index adaa0c9ea000..da4d829ff9ae 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java @@ -23,10 +23,14 @@ import com.navercorp.pinpoint.bootstrap.MetadataAccessor; import com.navercorp.pinpoint.bootstrap.context.AsyncTraceId; -import com.navercorp.pinpoint.bootstrap.context.RecordableTrace; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; +import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; -import com.navercorp.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptorForPlugin; +import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; +import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.navercorp.pinpoint.bootstrap.logging.PLogger; +import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; import com.navercorp.pinpoint.bootstrap.plugin.annotation.Group; import com.navercorp.pinpoint.bootstrap.plugin.annotation.Name; import com.navercorp.pinpoint.common.trace.ServiceType; @@ -37,24 +41,32 @@ * @author emeroad */ @Group(ArcusConstants.ARCUS_SCOPE) -public class ApiInterceptor extends SpanEventSimpleAroundInterceptorForPlugin implements ArcusConstants { - private final boolean traceKey; - private final int keyIndex; - +public class ApiInterceptor implements SimpleAroundInterceptor, ArcusConstants { + protected final PLogger logger = PLoggerFactory.getLogger(getClass()); + protected final boolean isDebug = logger.isDebugEnabled(); + + protected final MethodDescriptor methodDescriptor; + protected final TraceContext traceContext; + private final MetadataAccessor serviceCodeAccessor; private final MetadataAccessor operationAccessor; private final MetadataAccessor asyncTraceIdAccessor; - - public ApiInterceptor(TraceContext context, MethodInfo targetMethod, - @Name(METADATA_ASYNC_TRACE_ID) MetadataAccessor asyncTraceIdAccessor, @Name(METADATA_SERVICE_CODE) MetadataAccessor serviceCodeAccessor, @Name(METADATA_OPERATION) MetadataAccessor operationAccessor, boolean traceKey) { - super(context, targetMethod.getDescriptor()); - + + private final boolean traceKey; + private final int keyIndex; + + public ApiInterceptor(TraceContext context, MethodInfo targetMethod, @Name(METADATA_ASYNC_TRACE_ID) MetadataAccessor asyncTraceIdAccessor, @Name(METADATA_SERVICE_CODE) MetadataAccessor serviceCodeAccessor, + @Name(METADATA_OPERATION) MetadataAccessor operationAccessor, boolean traceKey) { + + this.traceContext = context; + this.methodDescriptor = targetMethod.getDescriptor(); + if (traceKey) { int index = ParameterUtils.findFirstString(targetMethod, 3); - + if (index != -1) { this.traceKey = true; - this.keyIndex = index; + this.keyIndex = index; } else { this.traceKey = false; this.keyIndex = -1; @@ -63,79 +75,112 @@ public ApiInterceptor(TraceContext context, MethodInfo targetMethod, this.traceKey = false; this.keyIndex = -1; } - + this.serviceCodeAccessor = serviceCodeAccessor; this.operationAccessor = operationAccessor; this.asyncTraceIdAccessor = asyncTraceIdAccessor; } @Override - public void doInBeforeTrace(RecordableTrace trace, final Object target, Object[] args) { - trace.markBeforeTime(); + public void before(Object target, Object[] args) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + final Trace trace = traceContext.currentTraceObject(); + if (trace == null) { + return; + } + + try { + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); + } catch (Throwable th) { + if (logger.isWarnEnabled()) { + logger.warn("before. Caused:{}", th.getMessage(), th); + } + } } @Override - public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - if (traceKey) { - final Object recordObject = args[keyIndex]; - trace.recordApi(getMethodDescriptor(), recordObject, keyIndex); - } else { - trace.recordApi(getMethodDescriptor()); + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (isDebug) { + logger.afterInterceptor(target, args, result, throwable); } - trace.recordException(throwable); - - // find the target node - if (result instanceof Future && operationAccessor.isApplicable(result)) { - Operation op = operationAccessor.get(result); - - if (op != null) { - MemcachedNode handlingNode = op.getHandlingNode(); - SocketAddress socketAddress = handlingNode.getSocketAddress(); - - if (socketAddress instanceof InetSocketAddress) { - InetSocketAddress address = (InetSocketAddress) socketAddress; - trace.recordEndPoint(address.getHostName() + ":" + address.getPort()); - } + + final Trace trace = traceContext.currentTraceObject(); + if (trace == null) { + return; + } + try { + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + if (traceKey) { + final Object recordObject = args[keyIndex]; + recorder.recordApi(methodDescriptor, recordObject, keyIndex); } else { - logger.info("operation not found"); + recorder.recordApi(methodDescriptor); } - } + recorder.recordException(throwable); + + // find the target node + if (result instanceof Future && operationAccessor.isApplicable(result)) { + Operation op = operationAccessor.get(result); - if(serviceCodeAccessor.isApplicable(target)) { - // determine the service type - String serviceCode = serviceCodeAccessor.get(target); - if (serviceCode != null) { - trace.recordDestinationId(serviceCode); - trace.recordServiceType(ARCUS); + if (op != null) { + MemcachedNode handlingNode = op.getHandlingNode(); + SocketAddress socketAddress = handlingNode.getSocketAddress(); + + if (socketAddress instanceof InetSocketAddress) { + InetSocketAddress address = (InetSocketAddress) socketAddress; + recorder.recordEndPoint(address.getHostName() + ":" + address.getPort()); + } + } else { + logger.info("operation not found"); + } + } + + if (serviceCodeAccessor.isApplicable(target)) { + // determine the service type + String serviceCode = serviceCodeAccessor.get(target); + if (serviceCode != null) { + recorder.recordDestinationId(serviceCode); + recorder.recordServiceType(ARCUS); + } else { + recorder.recordDestinationId("MEMCACHED"); + recorder.recordServiceType(ServiceType.MEMCACHED); + } } else { - trace.recordDestinationId("MEMCACHED"); - trace.recordServiceType(ServiceType.MEMCACHED); + recorder.recordDestinationId("MEMCACHED"); + recorder.recordServiceType(ServiceType.MEMCACHED); } - } else { - trace.recordDestinationId("MEMCACHED"); - trace.recordServiceType(ServiceType.MEMCACHED); - } - - try { - if(isAsynchronousInvocation(target, args, result, throwable)) { - // set asynchronous trace - final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); - trace.recordNextAsyncId(asyncTraceId.getAsyncId()); - asyncTraceIdAccessor.set(result, asyncTraceId); - if (isDebug) { - logger.debug("Set asyncTraceId metadata {}", asyncTraceId); + try { + if (isAsynchronousInvocation(target, args, result, throwable)) { + // set asynchronous trace + this.traceContext.getAsyncId(); + final AsyncTraceId asyncTraceId = trace.getAsyncTraceId(); + recorder.recordNextAsyncId(asyncTraceId.getAsyncId()); + asyncTraceIdAccessor.set(result, asyncTraceId); + if (isDebug) { + logger.debug("Set asyncTraceId metadata {}", asyncTraceId); + } } + } catch (Throwable t) { + logger.warn("Failed to before process. {}", t.getMessage(), t); + } + + recorder.markAfterTime(); + } catch (Throwable th) { + if (logger.isWarnEnabled()) { + logger.warn("after error. Caused:{}", th.getMessage(), th); } - } catch(Throwable t) { - logger.warn("Failed to before process. {}", t.getMessage(), t); + } finally { + trace.traceBlockEnd(); } - - trace.markAfterTime(); } - + private boolean isAsynchronousInvocation(final Object target, final Object[] args, Object result, Throwable throwable) { - if(throwable != null || result == null) { + if (throwable != null || result == null) { return false; } diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java index 4d79f368bd58..8b0d294eba73 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java @@ -15,6 +15,7 @@ package com.navercorp.pinpoint.plugin.arcus.interceptor; import com.navercorp.pinpoint.bootstrap.MetadataAccessor; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; @@ -54,9 +55,9 @@ public void before(Object target, Object[] args) { if (trace == null) { return; } - - trace.traceBlockBegin(); - trace.markBeforeTime(); + + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); } @Override @@ -71,22 +72,17 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { - trace.recordApi(methodDescriptor); - -// String cacheKey = (String) getCacheKey.invoke(target); -// if (cacheKey != null) { -// // annotate it. -// } - + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordApi(methodDescriptor); String cacheName = cacheNameAccessor.get(target); if (cacheName != null) { - trace.recordDestinationId(cacheName); + recorder.recordDestinationId(cacheName); } - trace.recordServiceType(ARCUS_EHCACHE_FUTURE_GET); - trace.markAfterTime(); + recorder.recordServiceType(ARCUS_EHCACHE_FUTURE_GET); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } } -} +} \ No newline at end of file diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java index 1266f2e54d6b..8c93ada631a7 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java @@ -22,13 +22,10 @@ import com.navercorp.pinpoint.bootstrap.MetadataAccessor; import com.navercorp.pinpoint.bootstrap.context.AsyncTraceId; -import com.navercorp.pinpoint.bootstrap.context.Trace; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.navercorp.pinpoint.bootstrap.interceptor.SpanAsyncEventSimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; import com.navercorp.pinpoint.bootstrap.plugin.annotation.Group; import com.navercorp.pinpoint.bootstrap.plugin.annotation.Name; import com.navercorp.pinpoint.common.trace.ServiceType; @@ -53,12 +50,12 @@ public FutureGetInterceptor(MethodDescriptor methodDescriptor, TraceContext trac } @Override - protected void doInBeforeTrace(Trace trace, AsyncTraceId asyncTraceId, Object target, Object[] args) { - trace.markBeforeTime(); + protected void doInBeforeTrace(SpanEventRecorder recorder, AsyncTraceId asyncTraceId, Object target, Object[] args) { + recorder.markBeforeTime(); } @Override - protected void doInAfterTrace(Trace trace, Object target, Object[] args, Object result, Throwable throwable) { + protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { // find the target node final Operation op = operationAccessor.get(target); if (op != null) { @@ -67,7 +64,7 @@ protected void doInAfterTrace(Trace trace, Object target, Object[] args, Object SocketAddress socketAddress = handlingNode.getSocketAddress(); if (socketAddress instanceof InetSocketAddress) { InetSocketAddress address = (InetSocketAddress) socketAddress; - trace.recordEndPoint(address.getHostName() + ":" + address.getPort()); + recorder.recordEndPoint(address.getHostName() + ":" + address.getPort()); } } else { logger.info("no handling node"); @@ -79,17 +76,17 @@ protected void doInAfterTrace(Trace trace, Object target, Object[] args, Object // determine the service type String serviceCode = serviceCodeAccessor.get(op); if (serviceCode != null) { - trace.recordDestinationId(serviceCode); - trace.recordServiceType(ARCUS_FUTURE_GET); + recorder.recordDestinationId(serviceCode); + recorder.recordServiceType(ARCUS_FUTURE_GET); } else { - trace.recordDestinationId("MEMCACHED"); - trace.recordServiceType(ServiceType.MEMCACHED_FUTURE_GET); + recorder.recordDestinationId("MEMCACHED"); + recorder.recordServiceType(ServiceType.MEMCACHED_FUTURE_GET); } if (op != null) { - trace.recordException(op.getException()); + recorder.recordException(op.getException()); } - trace.recordApi(methodDescriptor); - trace.markAfterTime(); + recorder.recordApi(methodDescriptor); + recorder.markAfterTime(); } } diff --git a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureInternalMethodInterceptor.java b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureInternalMethodInterceptor.java index 3eebcbcb1a31..ca406538c906 100644 --- a/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureInternalMethodInterceptor.java +++ b/plugins/arcus/src/main/java/com/navercorp/pinpoint/plugin/arcus/interceptor/FutureInternalMethodInterceptor.java @@ -16,7 +16,7 @@ import com.navercorp.pinpoint.bootstrap.MetadataAccessor; import com.navercorp.pinpoint.bootstrap.context.AsyncTraceId; -import com.navercorp.pinpoint.bootstrap.context.Trace; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; import com.navercorp.pinpoint.bootstrap.interceptor.SpanAsyncEventSimpleAroundInterceptor; @@ -36,15 +36,15 @@ public FutureInternalMethodInterceptor(MethodDescriptor methodDescriptor, TraceC } @Override - protected void doInBeforeTrace(Trace trace, AsyncTraceId asyncTraceId, Object target, Object[] args) { - trace.markBeforeTime(); + protected void doInBeforeTrace(SpanEventRecorder recorder, AsyncTraceId asyncTraceId, Object target, Object[] args) { + recorder.markBeforeTime(); } @Override - protected void doInAfterTrace(Trace trace, Object target, Object[] args, Object result, Throwable throwable) { - trace.recordServiceType(ARCUS_INTERNAL); - trace.recordException(throwable); - trace.recordApi(methodDescriptor); - trace.markAfterTime(); + protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { + recorder.recordServiceType(ARCUS_INTERNAL); + recorder.recordException(throwable); + recorder.recordApi(methodDescriptor); + recorder.markAfterTime(); } } \ No newline at end of file diff --git a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/ExecuteInterceptor.java b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/ExecuteInterceptor.java index efcbd9291cb5..52a47b2ce341 100644 --- a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/ExecuteInterceptor.java +++ b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/ExecuteInterceptor.java @@ -32,6 +32,7 @@ import com.navercorp.pinpoint.bootstrap.config.DumpType; import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig; import com.navercorp.pinpoint.bootstrap.context.Header; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.context.TraceId; @@ -126,12 +127,12 @@ public void before(Object target, Object[] args) { return; } - trace.traceBlockBegin(); - trace.markBeforeTime(); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); TraceId nextId = trace.getTraceId().getNextTraceId(); - trace.recordNextSpanId(nextId.getSpanId()); - trace.recordServiceType(ServiceType.HTTP_CLIENT); + recorder.recordNextSpanId(nextId.getSpanId()); + recorder.recordServiceType(ServiceType.HTTP_CLIENT); if (httpMethod != null) { httpMethod.setRequestHeader(Header.HTTP_TRACE_ID.toString(), nextId.getTransactionId()); @@ -169,13 +170,14 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); HttpMethod httpMethod = getHttpMethod(args); if (httpMethod != null) { try { final URI uri = httpMethod.getURI(); String uriString = uri.getURI(); - trace.recordAttribute(AnnotationKey.HTTP_URL, uriString); - trace.recordDestinationId(getEndpoint(uri.getHost(), uri.getPort())); + recorder.recordAttribute(AnnotationKey.HTTP_URL, uriString); + recorder.recordDestinationId(getEndpoint(uri.getHost(), uri.getPort())); } catch (URIException e) { logger.error("Fail get URI", e); } @@ -184,12 +186,12 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } if (result != null) { - trace.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, result); + recorder.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, result); } - trace.recordApi(descriptor); - trace.recordException(throwable); - trace.markAfterTime(); + recorder.recordApi(descriptor); + recorder.recordException(throwable); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } @@ -236,7 +238,8 @@ private void recordEntity(HttpMethod httpMethod, Trace trace) { entityValue = entity.getClass() + " (ContentType:" + entity.getContentType() + ")"; } - trace.recordAttribute(AnnotationKey.HTTP_PARAM_ENTITY, entityValue); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordAttribute(AnnotationKey.HTTP_PARAM_ENTITY, entityValue); } catch (Exception e) { logger.debug("HttpEntityEnclosingRequest entity record fail. Caused:{}", e.getMessage(), e); } @@ -275,7 +278,8 @@ private void recordCookie(HttpMethod httpMethod, Trace trace) { if (value != null && !value.isEmpty()) { if (cookieSampler.isSampling()) { - trace.recordAttribute(AnnotationKey.HTTP_COOKIE, StringUtils.drop(value, MAX_READ_SIZE)); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordAttribute(AnnotationKey.HTTP_COOKIE, StringUtils.drop(value, MAX_READ_SIZE)); } } } diff --git a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpConnectionOpenMethodInterceptor.java b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpConnectionOpenMethodInterceptor.java index 876641ceedf8..56b2b8f5e1ed 100644 --- a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpConnectionOpenMethodInterceptor.java +++ b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpConnectionOpenMethodInterceptor.java @@ -16,6 +16,7 @@ package com.navercorp.pinpoint.plugin.httpclient3.interceptor; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; @@ -55,8 +56,8 @@ public void before(Object target, Object[] args) { return; } - trace.traceBlockBegin(); - trace.markBeforeTime(); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); } @Override @@ -71,12 +72,13 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { - trace.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); - trace.recordApi(methodDescriptor); - trace.recordException(throwable); - trace.markAfterTime(); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); + recorder.recordApi(methodDescriptor); + recorder.recordException(throwable); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } } -} +} \ No newline at end of file diff --git a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpMethodBaseRequestAndResponseMethodInterceptor.java b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpMethodBaseRequestAndResponseMethodInterceptor.java index c5e1f9a93f81..e2dd45ba827f 100644 --- a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpMethodBaseRequestAndResponseMethodInterceptor.java +++ b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/HttpMethodBaseRequestAndResponseMethodInterceptor.java @@ -16,6 +16,7 @@ package com.navercorp.pinpoint.plugin.httpclient3.interceptor; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; @@ -54,8 +55,8 @@ public void before(Object target, Object[] args) { return; } - trace.traceBlockBegin(); - trace.markBeforeTime(); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); } @Override @@ -70,10 +71,11 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { - trace.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); - trace.recordApi(methodDescriptor); - trace.recordException(throwable); - trace.markAfterTime(); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); + recorder.recordApi(methodDescriptor); + recorder.recordException(throwable); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } diff --git a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/RetryMethodInterceptor.java b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/RetryMethodInterceptor.java index e65b36e8c018..874e3e79301f 100644 --- a/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/RetryMethodInterceptor.java +++ b/plugins/httpclient3/src/main/java/com/navercorp/pinpoint/plugin/httpclient3/interceptor/RetryMethodInterceptor.java @@ -18,6 +18,7 @@ import java.io.IOException; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; @@ -56,10 +57,9 @@ public void before(Object target, Object[] args) { return; } - trace.traceBlockBegin(); - trace.markBeforeTime(); - - trace.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); + recorder.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); } @Override @@ -69,25 +69,25 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } Trace trace = traceContext.currentTraceObject(); - if (trace == null) { return; } try { - trace.recordApi(descriptor); - trace.recordException(throwable); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordApi(descriptor); + recorder.recordException(throwable); if (args.length >= 2 && (args[1] instanceof IOException)) { - trace.recordAttribute(AnnotationKey.HTTP_CALL_RETRY_COUNT, args[1].getClass().getName()); + recorder.recordAttribute(AnnotationKey.HTTP_CALL_RETRY_COUNT, args[1].getClass().getName()); } if (result != null) { - trace.recordAttribute(AnnotationKey.RETURN_DATA, result); + recorder.recordAttribute(AnnotationKey.RETURN_DATA, result); } - trace.markAfterTime(); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } } -} +} \ No newline at end of file diff --git a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/AbstractHttpClientExecuteMethodInterceptor.java b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/AbstractHttpClientExecuteMethodInterceptor.java index d1e7e7c985d4..be387a606b40 100644 --- a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/AbstractHttpClientExecuteMethodInterceptor.java +++ b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/AbstractHttpClientExecuteMethodInterceptor.java @@ -35,6 +35,7 @@ import com.navercorp.pinpoint.bootstrap.config.DumpType; import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig; import com.navercorp.pinpoint.bootstrap.context.Header; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.Trace; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.context.TraceId; @@ -118,12 +119,12 @@ public void before(Object target, Object[] args) { return; } - trace.traceBlockBegin(); - trace.markBeforeTime(); + final SpanEventRecorder recorder = trace.traceBlockBegin(); + recorder.markBeforeTime(); TraceId nextId = trace.getTraceId().getNextTraceId(); - trace.recordNextSpanId(nextId.getSpanId()); - trace.recordServiceType(ServiceType.HTTP_CLIENT); + recorder.recordNextSpanId(nextId.getSpanId()); + recorder.recordServiceType(ServiceType.HTTP_CLIENT); if (httpRequest != null) { httpRequest.setHeader(Header.HTTP_TRACE_ID.toString(), nextId.getTransactionId()); @@ -154,15 +155,16 @@ public void after(Object target, Object[] args, Object result, Throwable throwab } try { + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); final HttpRequest httpRequest = getHttpRequest(args); if (httpRequest != null) { // Accessing httpRequest here not before() becuase it can cause side effect. - trace.recordAttribute(AnnotationKey.HTTP_URL, httpRequest.getRequestLine().getUri()); + recorder.recordAttribute(AnnotationKey.HTTP_URL, httpRequest.getRequestLine().getUri()); final NameIntValuePair host = getHost(args); if (host != null) { int port = host.getValue(); String endpoint = getEndpoint(host.getName(), port); - trace.recordDestinationId(endpoint); + recorder.recordDestinationId(endpoint); } recordHttpRequest(trace, httpRequest, throwable); @@ -171,14 +173,13 @@ public void after(Object target, Object[] args, Object result, Throwable throwab if (statusCode) { final Integer statusCodeValue = getStatusCode(result); if (statusCodeValue != null) { - trace.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, statusCodeValue); + recorder.recordAttribute(AnnotationKey.HTTP_STATUS_CODE, statusCodeValue); } } - trace.recordApi(descriptor); - trace.recordException(throwable); - - trace.markAfterTime(); + recorder.recordApi(descriptor); + recorder.recordException(throwable); + recorder.markAfterTime(); } finally { trace.traceBlockEnd(); } @@ -259,7 +260,8 @@ protected void recordCookie(HttpMessage httpMessage, Trace trace) { final String value = header.getValue(); if (value != null && !value.isEmpty()) { if (cookieSampler.isSampling()) { - trace.recordAttribute(AnnotationKey.HTTP_COOKIE, StringUtils.drop(value, 1024)); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordAttribute(AnnotationKey.HTTP_COOKIE, StringUtils.drop(value, 1024)); } // Can a cookie have 2 or more values? @@ -277,7 +279,8 @@ protected void recordEntity(HttpMessage httpMessage, Trace trace) { if (entity != null && entity.isRepeatable() && entity.getContentLength() > 0) { if (entitySampler.isSampling()) { final String entityString = entityUtilsToString(entity, "UTF8", 1024); - trace.recordAttribute(AnnotationKey.HTTP_PARAM_ENTITY, StringUtils.drop(entityString, 1024)); + final SpanEventRecorder recorder = trace.getSpanEventRecorder(); + recorder.recordAttribute(AnnotationKey.HTTP_PARAM_ENTITY, StringUtils.drop(entityString, 1024)); } } } catch (IOException e) { @@ -387,5 +390,4 @@ public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; traceContext.cacheApi(descriptor); } - -} +} \ No newline at end of file diff --git a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/BasicFutureMethodInterceptor.java b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/BasicFutureMethodInterceptor.java index 3783a8ac58bc..c5daa29c8444 100644 --- a/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/BasicFutureMethodInterceptor.java +++ b/plugins/httpclient4/src/main/java/com/navercorp/pinpoint/plugin/httpclient4/interceptor/BasicFutureMethodInterceptor.java @@ -18,7 +18,7 @@ import com.navercorp.pinpoint.bootstrap.MetadataAccessor; import com.navercorp.pinpoint.bootstrap.context.AsyncTraceId; -import com.navercorp.pinpoint.bootstrap.context.Trace; +import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; import com.navercorp.pinpoint.bootstrap.interceptor.SpanAsyncEventSimpleAroundInterceptor; @@ -39,15 +39,15 @@ public BasicFutureMethodInterceptor(TraceContext traceContext, MethodDescriptor } @Override - protected void doInBeforeTrace(Trace trace, AsyncTraceId asyncTraceId, Object target, Object[] args) { - trace.markBeforeTime(); - trace.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); + protected void doInBeforeTrace(SpanEventRecorder recorder, AsyncTraceId asyncTraceId, Object target, Object[] args) { + recorder.markBeforeTime(); + recorder.recordServiceType(ServiceType.HTTP_CLIENT_INTERNAL); } @Override - protected void doInAfterTrace(Trace trace, Object target, Object[] args, Object result, Throwable throwable) { - trace.recordApi(methodDescriptor); - trace.recordException(throwable); - trace.markAfterTime(); + protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { + recorder.recordApi(methodDescriptor); + recorder.recordException(throwable); + recorder.markAfterTime(); } } \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java index 7515c8fae668..8b17013c1531 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java @@ -153,9 +153,6 @@ private ModifierRegistry createModifierRegistry(List declaredMethods = arcusClient.getDeclaredMethods(new ArcusMethodFilter()); - for (MethodInfo method : declaredMethods) { - - SimpleAroundInterceptor apiInterceptor = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, - "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ApiInterceptor"); - if (this.getProfilerConfig().isArucsKeyTrace()) { - final int index = ParameterUtils.findFirstString(method, 3); - if (index != -1) { - ((ParameterExtractorSupport)apiInterceptor).setParameterExtractor(new IndexParameterExtractor(index)); - } - } - arcusClient.addGroupInterceptor(method.getName(), method.getParameterTypes(), apiInterceptor, ArcusScope.SCOPE); - } - - return arcusClient.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } - - private boolean checkCompatibility(InstrumentClass arcusClient) { - // Check if the class has addOp method - final boolean addOp = arcusClient.hasMethod("addOp", new String[]{"java.lang.String", "net.spy.memcached.ops.Operation"}, "net.spy.memcached.ops.Operation"); - if (!addOp) { - logger.warn("addOp() not found. skip ArcusClientModifier"); - } - return addOp; - } - - -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusMethodFilter.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusMethodFilter.java deleted file mode 100644 index 7e4184c3deee..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusMethodFilter.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; - -import com.navercorp.pinpoint.bootstrap.instrument.MethodFilter; -import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; - -/** - * @author emeroad - */ -public class ArcusMethodFilter implements MethodFilter { - private final static Object FIND = new Object(); - private final static Map WHITE_LIST_API; - - static { - WHITE_LIST_API = createRule(); - } - - private static Map createRule() { - String[] apiList = { - "asyncBopCreate", - "asyncBopDelete", - "asyncBopGet", - "asyncBopGetBulk", - "asyncBopGetItemCount", - "asyncBopInsert", - "asyncBopInsertBulk", - "asyncBopPipedInsertBulk", - "asyncBopSortMergeGet", - "asyncBopUpdate", - "asyncGetAttr", - "asyncLopCreate", - "asyncLopDelete", - "asyncLopGet", - "asyncLopInsert", - "asyncLopInsertBulk", - "asyncLopPipedInsertBulk", - "asyncSetAttr", - "asyncSetBulk", - "asyncSopCreate", - "asyncSopDelete", - "asyncSopExist", - "asyncSopGet", - "asyncSopInsert", - "asyncSopInsertBulk", - "asyncSopPipedExistBulk", - "asyncSopPipedInsertBulk" - }; - Map rule = new HashMap(); - for (String api : apiList) { - rule.put(api, FIND); - } - return rule; - } - - public ArcusMethodFilter() { - } - - @Override - public boolean filter(MethodInfo ctMethod) { - final int modifiers = ctMethod.getModifiers(); - if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { - return true; - } - if (WHITE_LIST_API.get(ctMethod.getName()) == FIND) { - return false; - } - return true; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java deleted file mode 100644 index b588d02c57f7..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * @author netspider - */ -public class BaseOperationModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public BaseOperationModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("net/spy/memcached/protocol/BaseOperationImpl"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifing. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - aClass.addTraceVariable("__serviceCode", "__setServiceCode", "__getServiceCode", "java.lang.String"); - - /* Do not intercept - aClass.addTraceVariable("__asyncTrace", "__setAsyncTrace", "__getAsyncTrace", "java.lang.Object"); - - aClass.addConstructorInterceptor(null, new BaseOperationConstructInterceptor()); - - TargetMethod transitionStateInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.BaseOperationTransitionStateInterceptor"); - aClass.addInterceptor("transitionState", new String[]{"net.spy.memcached.ops.OperationState"}, transitionStateInterceptor, ServiceTypeInfo.before); - - TargetMethod cancelInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.BaseOperationCancelInterceptor"); - aClass.addInterceptor("cancel", null, cancelInterceptor, ServiceTypeInfo.after); - */ - - return aClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java deleted file mode 100644 index 5e1013c7d4ee..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.CacheManagerConstructInterceptor; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author netspider - */ -public class CacheManagerModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public CacheManagerModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("net/spy/memcached/CacheManager"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifing. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - aClass.addTraceVariable("__serviceCode", "__setServiceCode", "__getServiceCode", "java.lang.String"); - aClass.addConstructorInterceptor(new String[]{"java.lang.String", "java.lang.String", "net.spy.memcached.ConnectionFactoryBuilder", "java.util.concurrent.CountDownLatch", "int", "int"}, new CacheManagerConstructInterceptor()); - - return aClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn( e.getMessage(), e); - } - return null; - } - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java deleted file mode 100644 index 3a5d6fab80d1..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ArcusScope; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.FrontCacheGetFutureConstructInterceptor; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.security.ProtectionDomain; - -/** - * @author harebox - */ -public class FrontCacheGetFutureModifier extends AbstractModifier { - - protected Logger logger; - - public FrontCacheGetFutureModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - this.logger = LoggerFactory.getLogger(this.getClass()); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - aClass.addTraceVariable("__cacheName", "__setCacheName", "__getCacheName", "java.lang.String"); - aClass.addTraceVariable("__cacheKey", "__setCacheKey", "__getCacheKey", "java.lang.String"); - - SimpleAroundInterceptor frontCacheGetFutureConstructInterceptor = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.FrontCacheGetFutureConstructInterceptor"); - aClass.addConstructorInterceptor(new String[]{"net.sf.ehcache.Element"}, frontCacheGetFutureConstructInterceptor); - - SimpleAroundInterceptor frontCacheGetFutureGetInterceptor = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.FrontCacheGetFutureGetInterceptor"); - aClass.addGroupInterceptor("get", new String[]{Long.TYPE.toString(), "java.util.concurrent.TimeUnit"}, frontCacheGetFutureGetInterceptor, ArcusScope.SCOPE); - - SimpleAroundInterceptor frontCacheGetFutureGetInterceptor2 = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.FrontCacheGetFutureGetInterceptor"); - aClass.addGroupInterceptor("get", new String[]{}, frontCacheGetFutureGetInterceptor2, ArcusScope.SCOPE); - - return aClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } - - @Override - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("net/spy/memcached/plugin/FrontCacheGetFuture"); - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java deleted file mode 100644 index 04aa6b0fc751..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.ParameterExtractorSupport; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ArcusScope; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.IndexParameterExtractor; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.security.ProtectionDomain; -import java.util.List; - -/** - * @author harebox - */ -public class FrontCacheMemcachedClientModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(FrontCacheMemcachedClientModifier.class.getName()); - - public FrontCacheMemcachedClientModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, - ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - String[] args = {"java.lang.String", "java.util.concurrent.Future", Long.TYPE.toString()}; - if (!checkCompatibility(aClass, args)) { - return null; - } - - // Inject ApiInterceptor to all public methods. - final List declaredMethods = aClass.getDeclaredMethods(new FrontCacheMemcachedMethodFilter()); - - for (MethodInfo method : declaredMethods) { - SimpleAroundInterceptor apiInterceptor = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ApiInterceptor"); - if (this.getProfilerConfig().isMemcachedKeyTrace()) { - final int index = ParameterUtils.findFirstString(method, 3); - if (index != -1) { - ((ParameterExtractorSupport) apiInterceptor).setParameterExtractor(new IndexParameterExtractor(index)); - } - } - aClass.addGroupInterceptor(method.getName(), method.getParameterTypes(), apiInterceptor, ArcusScope.SCOPE); - } - return aClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } - - private boolean checkCompatibility(InstrumentClass aClass, String[] args) { - final boolean putFrontCache = aClass.hasDeclaredMethod("putFrontCache", args); - if (!putFrontCache) { - logger.warn("putFrontCache() not found. skip FrontCacheMemcachedClientModifier"); - } - return putFrontCache; - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("net/spy/memcached/plugin/FrontCacheMemcachedClient"); - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedMethodFilter.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedMethodFilter.java deleted file mode 100644 index 86ad559be376..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedMethodFilter.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; - -import com.navercorp.pinpoint.bootstrap.instrument.MethodFilter; -import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; - -/** - * @author emeroad - * @author harebox - */ -public class FrontCacheMemcachedMethodFilter implements MethodFilter { - private final static Object FIND = new Object(); - private final static Map WHITE_LIST_API; - - static { - WHITE_LIST_API = createRule(); - } - - private static Map createRule() { - String[] apiList = { - "add", - "append", - "asyncCAS", - "asyncDecr", - "asyncGet", - "asyncGetBulk", - "asyncGets", - "asyncIncr", - "cas", - "decr", - "delete", - "get", - "getBulk", - "gets", - "incr", - "prepend", - "replace", - "set", - "putFrontCache" - }; - Map rule = new HashMap(); - for (String api : apiList) { - rule.put(api, FIND); - } - return rule; - } - - public FrontCacheMemcachedMethodFilter() { - } - - @Override - public boolean filter(MethodInfo ctMethod) { - final int modifiers = ctMethod.getModifiers(); - if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { - return true; - } - if (WHITE_LIST_API.get(ctMethod.getName()) == FIND) { - return false; - } - return true; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FutureModifier.java deleted file mode 100644 index bb825058aa9d..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FutureModifier.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.security.ProtectionDomain; -import java.util.Arrays; -import java.util.List; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ArcusScope; - -import org.slf4j.Logger; - - -/** - * @author emeroad - */ -public class FutureModifier extends AbstractModifier { - - protected Logger logger; - - public FutureModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - aClass.addTraceVariable("__operation", "__setOperation", "__getOperation", "net.spy.memcached.ops.Operation"); - - Interceptor futureSetOperationInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.FutureSetOperationInterceptor"); - aClass.addInterceptor("setOperation", new String[]{"net.spy.memcached.ops.Operation"}, futureSetOperationInterceptor); - - SimpleAroundInterceptor futureGetInterceptor = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.FutureGetInterceptor"); - - aClass.addGroupInterceptor("get", new String[]{Long.TYPE.toString(), "java.util.concurrent.TimeUnit"}, futureGetInterceptor, ArcusScope.SCOPE); - - return aClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } - - @Override - public Matcher getMatcher() { - List classNameList = Arrays.asList( - "net/spy/memcached/internal/OperationFuture", - "net/spy/memcached/internal/GetFuture", - "net/spy/memcached/internal/ImmediateFuture", - // arcus future - "net/spy/memcached/internal/CollectionFuture"); - return Matchers.newMultiClassNameMatcher(classNameList); - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java deleted file mode 100644 index 1d1784aa1c6d..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.security.ProtectionDomain; -import java.util.List; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; -import com.navercorp.pinpoint.bootstrap.instrument.Type; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.ParameterExtractorSupport; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ArcusScope; -import com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.IndexParameterExtractor; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author netspider - * @author emeroad - */ -public class MemcachedClientModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(MemcachedClientModifier.class.getName()); - - public MemcachedClientModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("net/spy/memcached/MemcachedClient"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, - ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - String[] args = {"java.lang.String", "net.spy.memcached.ops.Operation"}; - if (!checkCompatibility(aClass, args)) { - return null; - } - aClass.addTraceVariable("__serviceCode", "__setServiceCode", "__getServiceCode", "java.lang.String"); - - Interceptor addOpInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, - "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.AddOpInterceptor"); - aClass.addInterceptor("addOp", args, addOpInterceptor, Type.before); - - // Inject ApiInterceptor to all public methods. - final List declaredMethods = aClass.getDeclaredMethods(new MemcachedMethodFilter()); - - for (MethodInfo method : declaredMethods) { - SimpleAroundInterceptor apiInterceptor = (SimpleAroundInterceptor) byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.arcus.interceptor.ApiInterceptor"); - if (this.getProfilerConfig().isMemcachedKeyTrace()) { - final int index = ParameterUtils.findFirstString(method, 3); - if (index != -1) { - ((ParameterExtractorSupport)apiInterceptor).setParameterExtractor(new IndexParameterExtractor(index)); - } - } - aClass.addGroupInterceptor(method.getName(), method.getParameterTypes(), apiInterceptor, ArcusScope.SCOPE); - } - return aClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } - - private boolean checkCompatibility(InstrumentClass aClass, String[] args) { - // if addOp exists, compatibility is okay for now. - final boolean addOp = aClass.hasDeclaredMethod("addOp", args); - if (!addOp) { - logger.warn("addOp() not found. skip MemcachedClientModifier"); - } - return addOp; - } - -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedMethodFilter.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedMethodFilter.java deleted file mode 100644 index fd814cb477ae..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedMethodFilter.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; - -import com.navercorp.pinpoint.bootstrap.instrument.MethodFilter; -import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; - -/** - * @author emeroad - */ -public class MemcachedMethodFilter implements MethodFilter { - private final static Object FIND = new Object(); - private final static Map WHITE_LIST_API; - - static { - WHITE_LIST_API = createRule(); - } - - private static Map createRule() { - String[] apiList = { - "add", - "append", - "asyncCAS", - "asyncDecr", - "asyncGet", - "asyncGetBulk", - "asyncGets", - "asyncIncr", - "cas", - "decr", - "delete", - "get", - "getBulk", - "gets", - "incr", - "prepend", - "replace", - "set" - }; - Map rule = new HashMap(); - for (String api : apiList) { - rule.put(api, FIND); - } - return rule; - } - - public MemcachedMethodFilter() { - } - - @Override - public boolean filter(MethodInfo ctMethod) { - final int modifiers = ctMethod.getModifiers(); - if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { - return true; - } - if (WHITE_LIST_API.get(ctMethod.getName()) == FIND) { - return false; - } - return true; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ParameterUtils.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ParameterUtils.java deleted file mode 100644 index 645626caa8b3..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ParameterUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import com.navercorp.pinpoint.bootstrap.instrument.MethodInfo; - -/** - * @author emeroad - */ -public final class ParameterUtils { - - private ParameterUtils() { - } - - public static int findFirstString(MethodInfo method, int maxIndex) { - return findFirstClass("java.lang.String", method, maxIndex); - } - - public static int findFirstClass(String className, MethodInfo method, int maxIndex) { - if (className == null) { - throw new NullPointerException("className must not be null"); - } - if (method == null) { - return -1; - } - final String[] methodParams = method.getParameterTypes(); - final int minIndex = Math.min(methodParams.length, maxIndex); - for (int i =0; i < minIndex; i++) { - if (className.equals(methodParams[i])) { - return i; - } - } - return -1; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java deleted file mode 100644 index 416e7c4bf9a7..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus; - -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; - -public enum SpyVersion { - - SPYMEMCACHED_2_11, - ARCUSCLIENT_1_6, - ERROR - ; - - public SpyVersion identifyWithMemcachedConnection(InstrumentClass aClass) { - String className = aClass.getName(); - if (! "net/spy/memcached/MemcachedConnection".equals(className)) { - return ERROR; - } - - String[] createConnectionArgs = {"java.util.Collection"}; - boolean isSpy = aClass.hasDeclaredMethod("createConnection", createConnectionArgs); - - if (isSpy) { - return SPYMEMCACHED_2_11; - } else { - return ARCUSCLIENT_1_6; - } - } - - public SpyVersion identifyWithMemcachedClient(InstrumentClass aClass) { - String className = aClass.getName(); - if (! "net/spy/memcached/MemcachedClient".equals(className)) { - return ERROR; - } - - String[] addOpArgs = {"java.lang.String", "net.spy.memcached.ops.Operation"}; - boolean isArcus = aClass.hasDeclaredMethod("addOp", addOpArgs); - - return SPYMEMCACHED_2_11; - } - -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/AddOpInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/AddOpInterceptor.java deleted file mode 100644 index f9ad60b873cf..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/AddOpInterceptor.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; - -import net.spy.memcached.ops.Operation; - -/** - * - * @author netspider - * @author emeroad - */ -public class AddOpInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - private MetaObject setServiceCode = new MetaObject("__setServiceCode", String.class); - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - String serviceCode = getServiceCode.invoke(target); - Operation op = (Operation) args[1]; - - setServiceCode.invoke(op, serviceCode); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptor.java deleted file mode 100644 index 5be3ed082f69..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptor.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.util.concurrent.Future; - -import com.navercorp.pinpoint.bootstrap.context.RecordableTrace; -import com.navercorp.pinpoint.bootstrap.interceptor.*; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; -import com.navercorp.pinpoint.common.trace.ServiceType; - -import net.spy.memcached.MemcachedNode; -import net.spy.memcached.ops.Operation; -import net.spy.memcached.plugin.FrontCacheGetFuture; - -/** - * @author emeroad - */ -public class ApiInterceptor extends SpanEventSimpleAroundInterceptor implements ParameterExtractorSupport, TargetClassLoader { - - - private MetaObject getOperation = new MetaObject("__getOperation"); - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - - private ParameterExtractor parameterExtractor; - - public ApiInterceptor() { - super(ApiInterceptor.class); - } - - @Override - public void doInBeforeTrace(RecordableTrace trace, final Object target, Object[] args) { - trace.markBeforeTime(); - } - - @Override - public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - - if (parameterExtractor != null) { - final int index = parameterExtractor.getIndex(); - final Object recordObject = parameterExtractor.extractObject(args); - trace.recordApi(getMethodDescriptor(), recordObject, index); - } else { - trace.recordApi(getMethodDescriptor()); - } - - // find the target node - if (result instanceof Future && !(result instanceof FrontCacheGetFuture)) { - Operation op = (Operation) getOperation.invoke(((Future)result)); - if (op != null) { - MemcachedNode handlingNode = op.getHandlingNode(); - SocketAddress socketAddress = handlingNode.getSocketAddress(); - if (socketAddress instanceof InetSocketAddress) { - InetSocketAddress address = (InetSocketAddress) socketAddress; - trace.recordEndPoint(address.getHostName() + ":" + address.getPort()); - } - } else { - logger.info("operation not found"); - } - } - - // determine the service type - String serviceCode = (String) getServiceCode.invoke(target); - if (serviceCode != null) { - trace.recordDestinationId(serviceCode); -// trace.recordServiceType(ServiceType.ARCUS); - } else { - trace.recordDestinationId("MEMCACHED"); - trace.recordServiceType(ServiceType.MEMCACHED); - } - - trace.markAfterTime(); - } - - @Override - public void setParameterExtractor(ParameterExtractor parameterExtractor) { - this.parameterExtractor = parameterExtractor; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java deleted file mode 100644 index 1741a2ec0328..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -/** - * @author emeroad - */ -public class ArcusScope { - public static final String SCOPE = "ArcusScope"; -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java deleted file mode 100644 index 8ed6f92fd39c..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.Trace; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; - - -/** - * @author emeroad - */ -@Deprecated -public class BaseOperationConstructInterceptor implements SimpleAroundInterceptor, TraceContextSupport { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - -// private final MetaObject setAsyncTrace = new MetaObject("__setAsyncTrace", Object.class); - - private TraceContext traceContext; - - @Override - public void before(Object target, Object[] args) { - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - - Trace trace = traceContext.currentTraceObject(); - - if (trace == null) { - return; - } - - // Assuming no events are missed, do not process timeout. -// AsyncTrace asyncTrace = trace.createAsyncTrace(); -// asyncTrace.markBeforeTime(); -// -// asyncTrace.setAttachObject(new TimeObject()); -// -// setAsyncTrace.invoke(target, asyncTrace); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - - this.traceContext = traceContext; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/CacheManagerConstructInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/CacheManagerConstructInterceptor.java deleted file mode 100644 index fb1375eedc4e..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/CacheManagerConstructInterceptor.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; - -/** - * - * @author netspider - * @author emeroad - */ -@SuppressWarnings("deprecation") -public class CacheManagerConstructInterceptor implements SimpleAroundInterceptor { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject setServiceCode = new MetaObject("__setServiceCode", String.class); - - @Override - public void before(Object target, Object[] args) { - - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - - setServiceCode.invoke(target, (String) args[1]); - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java deleted file mode 100644 index abc2b86b85b0..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; - -import net.sf.ehcache.Element; - -/** - * @author harebox - */ -@SuppressWarnings("deprecation") -public class FrontCacheGetFutureConstructInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - // TODO This should be extracted from FrontCacheMemcachedClient. - private static final String DEFAULT_FRONTCACHE_NAME = "front"; - - private MetaObject setCacheName = new MetaObject("__setCacheName", String.class); - private MetaObject setCacheKey = new MetaObject("__setCacheKey", String.class); - - @Override - public void before(Object target, Object[] args) { - // do nothing. - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - - try { - setCacheName.invoke(target, DEFAULT_FRONTCACHE_NAME); - - if (args[0] instanceof Element) { - Element element = (Element) args[0]; - setCacheKey.invoke(target, element.getObjectKey()); - } - } catch (Exception e) { - logger.error("failed to add metadata: {}", e); - } - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java deleted file mode 100644 index 2b1080535101..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.Trace; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.*; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; -import com.navercorp.pinpoint.common.trace.ServiceType; - -/** - * @author harebox - */ -public class FrontCacheGetFutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private final MetaObject getCacheName = new MetaObject("__getCacheName"); -// private final MetaObject getCacheKey = new MetaObject("__getCacheKey"); - - private MethodDescriptor methodDescriptor; - private TraceContext traceContext; - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - final Trace trace = traceContext.currentTraceObject(); - if (trace == null) { - return; - } - - trace.traceBlockBegin(); - trace.markBeforeTime(); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { -// if (isDebug) { -// logger.afterInterceptor(target, args, result, throwable); -// } -// -// final Trace trace = traceContext.currentTraceObject(); -// if (trace == null) { -// return; -// } -// -// try { -// trace.recordApi(methodDescriptor); -// -//// String cacheKey = (String) getCacheKey.invoke(target); -//// if (cacheKey != null) { -//// // annotate it. -//// } -// -// String cacheName = (String) getCacheName.invoke(target); -// if (cacheName != null) { -// trace.recordDestinationId(cacheName); -// } -// -// trace.recordServiceType(ServiceType.ARCUS_EHCACHE_FUTURE_GET); -// trace.markAfterTime(); -// } finally { -// trace.traceBlockEnd(); -// } - } - - @Override - public void setMethodDescriptor(MethodDescriptor descriptor) { - this.methodDescriptor = descriptor; - this.traceContext.cacheApi(descriptor); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java deleted file mode 100644 index 6d5b5c7b1200..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; - -import com.navercorp.pinpoint.bootstrap.context.Trace; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.*; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; -import com.navercorp.pinpoint.common.trace.ServiceType; - -import net.spy.memcached.MemcachedNode; -import net.spy.memcached.ops.Operation; - -/** - * @author emeroad - */ -public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject getOperation = new MetaObject("__getOperation"); - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - - private MethodDescriptor methodDescriptor; - private TraceContext traceContext; - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - final Trace trace = traceContext.currentTraceObject(); - if (trace == null) { - return; - } - - trace.traceBlockBegin(); - trace.markBeforeTime(); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { -// if (isDebug) { -// logger.afterInterceptor(target, args, result, throwable); -// } -// -// final Trace trace = traceContext.currentTraceObject(); -// if (trace == null) { -// return; -// } -// -// try { -// trace.recordApi(methodDescriptor); -//// Do not record because it's not important. -//// String annotation = "future.get() timeout:" + args[0] + " " + ((TimeUnit)args[1]).name(); -//// trace.recordAttribute(AnnotationKey.ARCUS_COMMAND, annotation); -// -// // find the target node -// final Operation op = (Operation) getOperation.invoke(target); -// if (op != null) { -// MemcachedNode handlingNode = op.getHandlingNode(); -// if (handlingNode != null) { -// SocketAddress socketAddress = handlingNode.getSocketAddress(); -// if (socketAddress instanceof InetSocketAddress) { -// InetSocketAddress address = (InetSocketAddress) socketAddress; -// trace.recordEndPoint(address.getHostName() + ":" + address.getPort()); -// } -// } else { -// logger.info("no handling node"); -// } -// } else { -// logger.info("operation not found"); -// } -// -// // determine the service type -// String serviceCode = (String) getServiceCode.invoke((Operation)op); -// if (serviceCode != null) { -// trace.recordDestinationId(serviceCode); -// trace.recordServiceType(ServiceType.ARCUS_FUTURE_GET); -// } else { -// trace.recordDestinationId("MEMCACHED"); -// trace.recordServiceType(ServiceType.MEMCACHED_FUTURE_GET); -// } -// -// if (op != null) { -// trace.recordException(op.getException()); -// } -//// When it's canceled, doesn't it throw exception? -//// if (op.isCancelled()) { -//// trace.recordAttribute(AnnotationKey.EXCEPTION, "cancelled by user"); -//// } -// -// trace.markAfterTime(); -// } finally { -// trace.traceBlockEnd(); -// } - } - - @Override - public void setMethodDescriptor(MethodDescriptor descriptor) { - this.methodDescriptor = descriptor; - this.traceContext.cacheApi(descriptor); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java deleted file mode 100644 index 143e2eb0fd70..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; - -import net.spy.memcached.ops.Operation; - - -/** - * @author harebox - * @author emeroad - */ -@SuppressWarnings("deprecation") -public class FutureSetOperationInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject setOperation = new MetaObject("__setOperation", Operation.class); - - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - setOperation.invoke(target, (Operation) args[0]); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/IndexParameterExtractor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/IndexParameterExtractor.java deleted file mode 100644 index 0ceda134df7b..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/IndexParameterExtractor.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.ParameterExtractor; - -/** - * @author emeroad - */ -public class IndexParameterExtractor implements ParameterExtractor { - - private final int index; - - public IndexParameterExtractor(int index) { - this.index = index; - } - - @Override - public int getIndex() { - return index; - } - - @Override - public Object extractObject(Object[] parameterList) { - if (parameterList == null) { - return NULL; - } - return parameterList[index]; - } - - -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java deleted file mode 100644 index ecc380bfeaf1..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.arcus.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; - -import net.spy.memcached.CacheManager; -import net.spy.memcached.MemcachedClient; - -/** - * - * @author netspider - * @author emeroad - */ -public class SetCacheManagerInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - private MetaObject setServiceCode = new MetaObject("__setServiceCode", String.class); - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - CacheManager cm = (CacheManager) args[0]; - String serviceCode = getServiceCode.invoke(cm); - - setServiceCode.invoke((MemcachedClient) target, serviceCode); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/connector/jdkhttpconnector/HttpURLConnectionModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/connector/jdkhttpconnector/HttpURLConnectionModifier.java deleted file mode 100644 index 06e1fbdf2b05..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/connector/jdkhttpconnector/HttpURLConnectionModifier.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.connector.jdkhttpconnector; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentException; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; -import com.navercorp.pinpoint.profiler.modifier.connector.jdkhttpconnector.interceptor.ConnectMethodInterceptor; - -/** - * TODO Fix class loader issue. - * @author netspider - * - */ -public class HttpURLConnectionModifier extends AbstractModifier { - private final static String SCOPE = "HttpURLConnectoin"; - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public HttpURLConnectionModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("sun/net/www/protocol/http/HttpURLConnection"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - InstrumentClass aClass = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - ConnectMethodInterceptor connectMethodInterceptor = new ConnectMethodInterceptor(); - aClass.addGroupInterceptor("connect", null, connectMethodInterceptor, SCOPE); - - ConnectMethodInterceptor getInputStreamInterceptor = new ConnectMethodInterceptor(); - aClass.addGroupInterceptor("getInputStream", null, getInputStreamInterceptor, SCOPE); - - ConnectMethodInterceptor getOutputStreamInterceptor = new ConnectMethodInterceptor(); - aClass.addGroupInterceptor("getOutputStream", null, getOutputStreamInterceptor, SCOPE); - - aClass.addGetter("__isConnected", "connected", "boolean"); - - if (aClass.hasField("connecting", "boolean")) { - aClass.addGetter("__isConnecting", "connecting", "boolean"); - } - - return aClass.toBytecode(); - } catch (InstrumentException e) { - logger.warn("HttpURLConnectionModifier fail. Caused:", e.getMessage(), e); - return null; - } - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java deleted file mode 100644 index ad3283c58bf8..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.connector.jdkhttpconnector.interceptor; - -import java.net.HttpURLConnection; -import java.net.URL; - -import com.navercorp.pinpoint.bootstrap.context.Header; -import com.navercorp.pinpoint.bootstrap.context.Trace; -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.context.TraceId; -import com.navercorp.pinpoint.bootstrap.interceptor.ByteCodeMethodDescriptorSupport; -import com.navercorp.pinpoint.bootstrap.interceptor.MethodDescriptor; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; -import com.navercorp.pinpoint.bootstrap.sampler.SamplingFlagUtils; -import com.navercorp.pinpoint.bootstrap.util.MetaObject; -import com.navercorp.pinpoint.common.trace.AnnotationKey; -import com.navercorp.pinpoint.common.trace.ServiceType; - -/** - * @author netspider - * @author emeroad - */ -public class ConnectMethodInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final MetaObject isConnected = new MetaObject("__isConnected"); - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MethodDescriptor descriptor; - private TraceContext traceContext; - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - Trace trace = traceContext.currentRawTraceObject(); - if (trace == null) { - return; - } - - HttpURLConnection request = (HttpURLConnection) target; - final boolean setRequestHeader = !isConnected.invoke(target); - - final boolean sampling = trace.canSampled(); - if (!sampling) { - if (setRequestHeader) { - request.setRequestProperty(Header.HTTP_SAMPLED.toString(), SamplingFlagUtils.SAMPLING_RATE_FALSE); - } - return; - } - - - trace.traceBlockBegin(); - trace.markBeforeTime(); - - TraceId nextId = trace.getTraceId().getNextTraceId(); - trace.recordNextSpanId(nextId.getSpanId()); - - final URL url = request.getURL(); - final String host = url.getHost(); - final int port = url.getPort(); - - if (setRequestHeader) { - request.setRequestProperty(Header.HTTP_TRACE_ID.toString(), nextId.getTransactionId()); - request.setRequestProperty(Header.HTTP_SPAN_ID.toString(), String.valueOf(nextId.getSpanId())); - request.setRequestProperty(Header.HTTP_PARENT_SPAN_ID.toString(), String.valueOf(nextId.getParentSpanId())); - - request.setRequestProperty(Header.HTTP_FLAGS.toString(), String.valueOf(nextId.getFlags())); - request.setRequestProperty(Header.HTTP_PARENT_APPLICATION_NAME.toString(), traceContext.getApplicationName()); - request.setRequestProperty(Header.HTTP_PARENT_APPLICATION_TYPE.toString(), Short.toString(traceContext.getServerTypeCode())); - if(host != null) { - request.setRequestProperty(Header.HTTP_HOST.toString(), host); - } - } - -// trace.recordServiceType(ServiceType.JDK_HTTPURLCONNECTOR); - - // TODO How to represent protocol? - String endpoint = getEndpoint(host, port); - - // Don't record end point because it's same with destination id. - trace.recordDestinationId(endpoint); - trace.recordAttribute(AnnotationKey.HTTP_URL, url.toString()); - } - - private String getEndpoint(String host, int port) { - if (port < 0) { - return host; - } - StringBuilder sb = new StringBuilder(32); - sb.append(host); - sb.append(':'); - sb.append(port); - return sb.toString(); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - // do not log result - logger.afterInterceptor(target, args); - } - - Trace trace = traceContext.currentTraceObject(); - if (trace == null) { - return; - } - - try { - trace.recordApi(descriptor); - trace.recordException(throwable); - - trace.markAfterTime(); - } finally { - trace.traceBlockEnd(); - } - } - - @Override - public void setMethodDescriptor(MethodDescriptor descriptor) { - this.descriptor = descriptor; - traceContext.cacheApi(descriptor); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/RequestFacadeModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/RequestFacadeModifier.java deleted file mode 100644 index 613577eb6563..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/RequestFacadeModifier.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentException; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.security.ProtectionDomain; - -/** - * @author emeroad - */ -public class RequestFacadeModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public RequestFacadeModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("org/apache/catalina/connector/RequestFacade"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - - try { - InstrumentClass requestFacade = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - requestFacade.weave("com.navercorp.pinpoint.profiler.modifier.tomcat.aspect.RequestFacadeAspect", getClass().getClassLoader()); - return requestFacade.toBytecode(); - } catch (InstrumentException e) { - logger.warn("modify fail. Cause:" + e.getMessage(), e); - return null; - } - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java deleted file mode 100644 index 98cfbce92200..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentException; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Modify org.apache.catalina.core.StandardHostValve class - * - * @author netspider - * @author emeroad - */ -public class StandardHostValveInvokeModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public StandardHostValveInvokeModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("org/apache/catalina/core/StandardHostValve"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - Interceptor interceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor.StandardHostValveInvokeInterceptor"); - - InstrumentClass standardHostValve = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - standardHostValve.addInterceptor("invoke", new String[]{"org.apache.catalina.connector.Request", "org.apache.catalina.connector.Response"}, interceptor); - return standardHostValve.toBytecode(); - } catch (InstrumentException e) { - logger.warn("modify fail. Cause:" + e.getMessage(), e); - return null; - } - } - - -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java deleted file mode 100644 index cb77c3730a79..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.LifeCycleEventListener; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author cowboy93, netspider - * @author hyungil.jeong - */ -@SuppressWarnings("deprecation") -public class StandardServiceModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final Agent agent; - - public StandardServiceModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent.getProfilerConfig()); - this.agent = agent; - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("org/apache/catalina/core/StandardService"); - } - - @Override - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - logger.info("Modifying. {}", javassistClassName); - - try { - InstrumentClass standardService = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - LifeCycleEventListener lifeCycleEventListener = new LifeCycleEventListener(agent); - - Interceptor standardServiceStartInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, - "com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor.StandardServiceStartInterceptor", - new Object[] { lifeCycleEventListener }, new Class[] { LifeCycleEventListener.class }); - Interceptor standardServiceStopInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, - "com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor.StandardServiceStopInterceptor", - new Object[] { lifeCycleEventListener }, new Class[] { LifeCycleEventListener.class }); - - boolean isHooked = false; - // Tomcat 6 - org.apache.catalina.core.StandardService.start(), stop() - if (standardService.hasDeclaredMethod("start", null) && standardService.hasDeclaredMethod("stop", null)) { - standardService.addInterceptor("start", null, standardServiceStartInterceptor); - standardService.addInterceptor("stop", null, standardServiceStopInterceptor); - isHooked = true; - } - // Tomcat 7, 8 - org.apache.catalina.core.StandardService.startInternal(), stopInternal() - else if (standardService.hasDeclaredMethod("startInternal", null) && standardService.hasDeclaredMethod("stopInternal", null)) { - standardService.addInterceptor("startInternal", null, standardServiceStartInterceptor); - standardService.addInterceptor("stopInternal", null, standardServiceStopInterceptor); - isHooked = true; - } - - if (isHooked) { - logger.info("{} class is converted.", javassistClassName); - } else { - logger.warn("{} class not converted - start() or startInternal() method not found.", javassistClassName); - } - return standardService.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn("modify fail. Cause:" + e.getMessage(), e); - } - } - return null; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java deleted file mode 100644 index 6ad21bdad609..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Modifier to collect Tomcat connector information - * - * @author netspider - */ -public class TomcatConnectorModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public TomcatConnectorModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("org/apache/catalina/connector/Connector"); - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifying. {}", javassistClassName); - } - - try { - // Get protocol and port by intercepting initialize() - Interceptor interceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, - "com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor.ConnectorInitializeInterceptor", null, null); - InstrumentClass connector = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - // Tomcat 6 - if (connector.hasDeclaredMethod("initialize", null)) { - connector.addInterceptor("initialize", null, interceptor); - } - // Tomcat 7 - else if (connector.hasDeclaredMethod("initInternal", null)) { - connector.addInterceptor("initInternal", null, interceptor); - } - - if (this.logger.isInfoEnabled()) { - this.logger.info("{} class is converted.", javassistClassName); - } - - return connector.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - return null; - } - } -} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java deleted file mode 100644 index 19a42cd02248..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat; - -import java.security.ProtectionDomain; - -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matcher; -import com.navercorp.pinpoint.bootstrap.instrument.matcher.Matchers; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.navercorp.pinpoint.bootstrap.Agent; -import com.navercorp.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass; -import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor; -import com.navercorp.pinpoint.profiler.modifier.AbstractModifier; - -/** - * @author hyungil.jeong - */ -public class WebappLoaderModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - public WebappLoaderModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - } - - @Override - public Matcher getMatcher() { - return Matchers.newClassNameMatcher("org/apache/catalina/loader/WebappLoader"); - } - - @Override - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - logger.info("Modifying. {}", javassistClassName); - - try { - InstrumentClass webappLoader = byteCodeInstrumentor.getClass(classLoader, javassistClassName, classFileBuffer); - - Interceptor webappLoaderStartInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, - "com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor.WebappLoaderStartInterceptor", null, null); - - boolean isHooked = false; - // Tomcat 6 - org.apache.catalina.loader.WebappLoader.start() - if (webappLoader.hasDeclaredMethod("start", null)) { - webappLoader.addInterceptor("start", null, webappLoaderStartInterceptor); - isHooked = true; - } - // Tomcat 7, 8 - org.apache.catalina.loader.WebappLoader.startInternal() - else if (webappLoader.hasDeclaredMethod("startInternal", null)) { - webappLoader.addInterceptor("startInternal", null, webappLoaderStartInterceptor); - isHooked = true; - } - - if (isHooked) { - logger.info("{} class is converted.", javassistClassName); - } else { - logger.warn("{} class not converted - start() or startInternal() method not found.", javassistClassName); - } - return webappLoader.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn("modify failed. Cause:" + e.getMessage(), e); - } - } - return null; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/aspect/RequestFacadeAspect.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/aspect/RequestFacadeAspect.java deleted file mode 100644 index ddf0f1310a18..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/aspect/RequestFacadeAspect.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat.aspect; - -import com.navercorp.pinpoint.bootstrap.context.Header; -import com.navercorp.pinpoint.bootstrap.plugin.aspect.Aspect; -import com.navercorp.pinpoint.bootstrap.plugin.aspect.JointPoint; -import com.navercorp.pinpoint.bootstrap.plugin.aspect.PointCut; - -import java.util.Enumeration; - -/** - * filtering pinpoint header - * @author emeroad - */ -@Aspect -public abstract class RequestFacadeAspect { - - @PointCut - public String getHeader(String name) { - if (Header.hasHeader(name)) { - return null; - } - return __getHeader(name); - } - - @JointPoint - abstract String __getHeader(String name); - - - @PointCut - public Enumeration getHeaders(String name) { - final Enumeration headers = Header.getHeaders(name); - if (headers != null) { - return headers; - } - return __getHeaders(name); - } - - @JointPoint - abstract Enumeration __getHeaders(String name); - - - @PointCut - public Enumeration getHeaderNames() { - final Enumeration enumeration = __getHeaderNames(); - return Header.filteredHeaderNames(enumeration); - } - - @JointPoint - abstract Enumeration __getHeaderNames(); - -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/ConnectorInitializeInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/ConnectorInitializeInterceptor.java deleted file mode 100644 index 1cbcf314c20e..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/ConnectorInitializeInterceptor.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor; - -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; - -import org.apache.catalina.connector.Connector; - -/** - * @author emeroad - */ -public class ConnectorInitializeInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader { - - private PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private TraceContext traceContext; - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - - @Override - public void before(Object target, Object[] args) { - - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - Connector connector = (Connector) target; - this.traceContext.getServerMetaDataHolder().addConnector(connector.getProtocol(), connector.getPort()); - - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardHostValveInvokeInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardHostValveInvokeInterceptor.java deleted file mode 100644 index 28ae7a11a914..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardHostValveInvokeInterceptor.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor; - -import java.util.Enumeration; - -import com.navercorp.pinpoint.bootstrap.config.Filter; -import com.navercorp.pinpoint.bootstrap.config.ProfilerConfig; -import com.navercorp.pinpoint.bootstrap.context.*; -import com.navercorp.pinpoint.bootstrap.interceptor.*; -import com.navercorp.pinpoint.bootstrap.sampler.SamplingFlagUtils; -import com.navercorp.pinpoint.bootstrap.util.NetworkUtils; -import com.navercorp.pinpoint.bootstrap.util.NumberUtils; -import com.navercorp.pinpoint.bootstrap.util.StringUtils; -import com.navercorp.pinpoint.common.trace.AnnotationKey; -import com.navercorp.pinpoint.common.trace.ServiceType; -import com.navercorp.pinpoint.profiler.context.*; - -import javax.servlet.http.HttpServletRequest; - -/** - * @author emeroad - */ -public class StandardHostValveInvokeInterceptor extends SpanSimpleAroundInterceptor implements TargetClassLoader { - - private final boolean isTrace = logger.isTraceEnabled(); - private Filter excludeUrlFilter; - - public StandardHostValveInvokeInterceptor() { - super(StandardHostValveInvokeInterceptor.class); - } - - @Override - protected void doInBeforeTrace(RecordableTrace trace, Object target, Object[] args) { - final HttpServletRequest request = (HttpServletRequest) args[0]; - trace.markBeforeTime(); - if (trace.canSampled()) { -// trace.recordServiceType(ServiceType.TOMCAT); - - final String requestURL = request.getRequestURI(); - trace.recordRpcName(requestURL); - - final int port = request.getServerPort(); - final String endPoint = request.getServerName() + ":" + port; - trace.recordEndPoint(endPoint); - - final String remoteAddr = request.getRemoteAddr(); - trace.recordRemoteAddress(remoteAddr); - } - - if (!trace.isRoot()) { - recordParentInfo(trace, request); - } - } - - @Override - protected Trace createTrace(Object target, Object[] args) { - final HttpServletRequest request = (HttpServletRequest) args[0]; - final String requestURI = request.getRequestURI(); - if (excludeUrlFilter.filter(requestURI)) { - if (isTrace) { - logger.trace("filter requestURI:{}", requestURI); - } - return null; - } - - - // check sampling flag from client. If the flag is false, do not sample this request. - final boolean sampling = samplingEnable(request); - if (!sampling) { - // Even if this transaction is not a sampling target, we have to create Trace object to mark 'not sampling'. - // For example, if this transaction invokes rpc call, we can add parameter to tell remote node 'don't sample this transaction' - final TraceContext traceContext = getTraceContext(); - final Trace trace = traceContext.disableSampling(); - if (isDebug) { - logger.debug("remotecall sampling flag found. skip trace requestUrl:{}, remoteAddr:{}", request.getRequestURI(), request.getRemoteAddr()); - } - return trace; - } - - - final TraceId traceId = populateTraceIdFromRequest(request); - if (traceId != null) { - // TODO Maybe we should decide to trace or not even if the sampling flag is true to prevent too many requests are traced. - final TraceContext traceContext = getTraceContext(); - final Trace trace = traceContext.continueTraceObject(traceId); - - if (trace.canSampled()) { - if (isDebug) { - logger.debug("TraceID exist. continue trace. traceId:{}, requestUrl:{}, remoteAddr:{}", new Object[] {traceId, request.getRequestURI(), request.getRemoteAddr()}); - } - } else { - if (isDebug) { - logger.debug("TraceID exist. camSampled is false. skip trace. traceId:{}, requestUrl:{}, remoteAddr:{}", new Object[] {traceId, request.getRequestURI(), request.getRemoteAddr()}); - } - } - return trace; - } else { - final TraceContext traceContext = getTraceContext(); - final Trace trace = traceContext.newTraceObject(); - if (trace.canSampled()) { - if (isDebug) { - logger.debug("TraceID not exist. start new trace. requestUrl:{}, remoteAddr:{}", request.getRequestURI(), request.getRemoteAddr()); - } - } else { - if (isDebug) { - logger.debug("TraceID not exist. camSampled is false. skip trace. requestUrl:{}, remoteAddr:{}", request.getRequestURI(), request.getRemoteAddr()); - } - } - return trace; - } - } - - - - private void recordParentInfo(RecordableTrace trace, HttpServletRequest request) { - String parentApplicationName = request.getHeader(Header.HTTP_PARENT_APPLICATION_NAME.toString()); - if (parentApplicationName != null) { - trace.recordAcceptorHost(NetworkUtils.getHostFromURL(request.getRequestURL().toString())); - - final String type = request.getHeader(Header.HTTP_PARENT_APPLICATION_TYPE.toString()); - final short parentApplicationType = NumberUtils.parseShort(type, ServiceType.UNDEFINED.getCode()); - trace.recordParentApplication(parentApplicationName, parentApplicationType); - } - } - - @Override - protected void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - if (trace.canSampled()) { - final HttpServletRequest request = (HttpServletRequest) args[0]; - final String parameters = getRequestParameter(request, 64, 512); - if (parameters != null && parameters.length() > 0) { - trace.recordAttribute(AnnotationKey.HTTP_PARAM, parameters); - } - - trace.recordApi(getMethodDescriptor()); - } - trace.recordException(throwable); - trace.markAfterTime(); - } - - /** - * Populate source trace from HTTP Header. - * - * @param request - * @return TraceId when it is possible to get a transactionId from Http header. if not possible return null - */ - private TraceId populateTraceIdFromRequest(HttpServletRequest request) { - - String transactionId = request.getHeader(Header.HTTP_TRACE_ID.toString()); - if (transactionId != null) { - - long parentSpanID = NumberUtils.parseLong(request.getHeader(Header.HTTP_PARENT_SPAN_ID.toString()), SpanId.NULL); - long spanID = NumberUtils.parseLong(request.getHeader(Header.HTTP_SPAN_ID.toString()), SpanId.NULL); - short flags = NumberUtils.parseShort(request.getHeader(Header.HTTP_FLAGS.toString()), (short) 0); - - final TraceId id = getTraceContext().createTraceId(transactionId, parentSpanID, spanID, flags); - if (isDebug) { - logger.debug("TraceID exist. continue trace. {}", id); - } - return id; - } else { - return null; - } - } - - private boolean samplingEnable(HttpServletRequest request) { - // optional value - final String samplingFlag = request.getHeader(Header.HTTP_SAMPLED.toString()); - if (isDebug) { - logger.debug("SamplingFlag:{}", samplingFlag); - } - return SamplingFlagUtils.isSamplingFlag(samplingFlag); - } - - private String getRequestParameter(HttpServletRequest request, int eachLimit, int totalLimit) { - Enumeration attrs = request.getParameterNames(); - final StringBuilder params = new StringBuilder(64); - - while (attrs.hasMoreElements()) { - if (params.length() != 0 ) { - params.append('&'); - } - // skip appending parameters if parameter size is bigger than totalLimit - if (params.length() > totalLimit) { - params.append("..."); - return params.toString(); - } - String key = attrs.nextElement().toString(); - params.append(StringUtils.drop(key, eachLimit)); - params.append("="); - Object value = request.getParameter(key); - if (value != null) { - params.append(StringUtils.drop(StringUtils.toString(value), eachLimit)); - } - } - return params.toString(); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - super.setTraceContext(traceContext); - - ProfilerConfig profilerConfig = traceContext.getProfilerConfig(); - - this.excludeUrlFilter = profilerConfig.getTomcatExcludeUrlFilter(); - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardServiceStartInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardServiceStartInterceptor.java deleted file mode 100644 index 75f041b52675..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardServiceStartInterceptor.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor; - -import org.apache.catalina.util.ServerInfo; - -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.LifeCycleEventListener; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; - -/** - * @author emeroad - * @author hyungil.jeong - */ -@SuppressWarnings("deprecation") -public class StandardServiceStartInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private TraceContext traceContext; - - private LifeCycleEventListener lifeCycleEventListener; - - public StandardServiceStartInterceptor(LifeCycleEventListener lifeCycleEventListener) { - this.lifeCycleEventListener = lifeCycleEventListener; - } - - @Override - public void before(Object target, Object[] args) { - // Do nothing - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - populateMetaData(); - lifeCycleEventListener.start(); - } - - private void populateMetaData() { - String serverInfo = ServerInfo.getServerInfo(); - this.traceContext.getServerMetaDataHolder().setServerName(serverInfo); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardServiceStopInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardServiceStopInterceptor.java deleted file mode 100644 index 566f307338be..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/StandardServiceStopInterceptor.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor; - -import com.navercorp.pinpoint.bootstrap.interceptor.LifeCycleEventListener; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; - -/** - * @author emeroad - */ -@SuppressWarnings("deprecation") -public class StandardServiceStopInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private LifeCycleEventListener lifeCycleEventListener; - - public StandardServiceStopInterceptor(LifeCycleEventListener lifeCycleEventListener) { - this.lifeCycleEventListener = lifeCycleEventListener; - } - - @Override - public void before(Object target, Object[] args) { - - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - // TODO Is stop() invoked when start failed? - // if (!InterceptorUtils.isSuccess(result)) { - // return; - // } - lifeCycleEventListener.stop(); - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/WebappLoaderStartInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/WebappLoaderStartInterceptor.java deleted file mode 100644 index bd8e17a3a7d8..000000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/interceptor/WebappLoaderStartInterceptor.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.profiler.modifier.tomcat.interceptor; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.apache.catalina.Container; -import org.apache.catalina.Context; -import org.apache.catalina.Engine; -import org.apache.catalina.Host; -import org.apache.catalina.loader.WebappLoader; - -import com.navercorp.pinpoint.bootstrap.context.TraceContext; -import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.navercorp.pinpoint.bootstrap.logging.PLogger; -import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; - -/** - * @author hyungil.jeong - */ -public class WebappLoaderStartInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - - private TraceContext traceContext; - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - - @Override - public void before(Object target, Object[] args) { - // Do Nothing - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - // target should be an instance of WebappLoader. - if (target instanceof WebappLoader) { - WebappLoader webappLoader = (WebappLoader)target; - try { - String contextKey = extractContextKey(webappLoader); - List loadedJarNames = extractLibJars(webappLoader); - dispatchLibJars(contextKey, loadedJarNames); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - } - } else { - logger.warn("Webapp loader is not an instance of org.apache.catalina.loader.WebappLoader. Found [{}]", target.getClass().toString()); - } - } - - private String extractContextKey(WebappLoader webappLoader) { - final String defaultContextName = ""; - try { - Container container = extractContext(webappLoader); - // WebappLoader's associated Container should be a Context. - if (container instanceof Context) { - Context context = (Context)container; - String contextName = context.getName(); - Host host = (Host)container.getParent(); - Engine engine = (Engine)host.getParent(); - StringBuilder sb = new StringBuilder(); - sb.append(engine.getName()).append("/").append(host.getName()); - if (!contextName.startsWith("/")) { - sb.append('/'); - } - sb.append(contextName); - return sb.toString(); - } - } catch (Exception e) { - // Same action for any and all exceptions. - logger.warn("Error extracting context name.", e); - } - return defaultContextName; - } - - // FIXME Use reflection until we provide separate packages for instrumented libraries. - // Tomcat 8's WebappLoader does not have getContainer() method. - // Providing an optional package that calls WebappLoader.getContext() method could be an option. - private Container extractContext(WebappLoader webappLoader) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { - Method m; - try { - // Tomcat 6, 7 - org.apache.catalina.loader.getContainer() - m = webappLoader.getClass().getDeclaredMethod("getContainer"); - } catch (NoSuchMethodException e1) { - try { - // Tomcat 8 - org.apache.catalina.loader.getContainer() - m = webappLoader.getClass().getDeclaredMethod("getContext"); - } catch (NoSuchMethodException e2) { - logger.warn("Webapp loader does not have access to its container."); - return null; - } - } - Object container = m.invoke(webappLoader); - if (container instanceof Container) { - return (Container)container; - } - return null; - } - - private List extractLibJars(WebappLoader webappLoader) { - ClassLoader classLoader = webappLoader.getClassLoader(); - if (classLoader instanceof URLClassLoader) { - URLClassLoader webappClassLoader = (URLClassLoader)classLoader; - URL[] urls = webappClassLoader.getURLs(); - return extractLibJarNamesFromURLs(urls); - } else { - logger.warn("Webapp class loader is not an instance of URLClassLoader. Found [{}]", classLoader.getClass().toString()); - return Collections.emptyList(); - } - } - - private List extractLibJarNamesFromURLs(URL[] urls) { - if (urls == null) { - return Collections.emptyList(); - } - List libJarNames = new ArrayList(urls.length); - for (URL url : urls) { - String libJarName = extractLibJarName(url); - if (libJarName.length() > 0) { - libJarNames.add(libJarName); - } - } - return libJarNames; - } - - private String extractLibJarName(URL url) { - if (url == null) { - return ""; - } - String jarName = url.toString(); - if (jarName == null) { - return ""; - } - int lastIndexOfSeparator = jarName.lastIndexOf("/"); - if (lastIndexOfSeparator < 0) { - return jarName; - } else { - return jarName.substring(lastIndexOfSeparator + 1); - } - } - - private void dispatchLibJars(String contextKey, List libJars) { - this.traceContext.getServerMetaDataHolder().addServiceInfo(contextKey, libJars); - } - -}