diff --git a/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/NpcHessianConnectorModifier.java b/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/NpcHessianConnectorModifier.java index fec8a61a7..0e74120bd 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/NpcHessianConnectorModifier.java +++ b/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/NpcHessianConnectorModifier.java @@ -57,6 +57,9 @@ public class NpcHessianConnectorModifier extends AbstractModifier { connectorClass.addTraceVariable("__serverAddress", "__setServerAddress", "__getServerAddress", "java.net.InetSocketAddress"); + Interceptor connectInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.connector.npc.interceptor.ConnectInterceptor"); + connectorClass.addInterceptor("connect", new String[] { "boolean" }, connectInterceptor); + Interceptor interceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.connector.npc.interceptor.InvokeInterceptor"); connectorClass.addInterceptor("invoke", new String[] { "java.lang.String", "java.lang.String", "java.lang.Object[]" }, interceptor); @@ -74,7 +77,7 @@ public class NpcHessianConnectorModifier extends AbstractModifier { return connectorClass.toBytecode(); } catch (Throwable e) { - logger.warn("httpclient4 modifier error. Caused:{}", e.getMessage(), e); + logger.warn(this.getClass().getSimpleName() + " modifier error. Caused:{}", e.getMessage(), e); return null; } } diff --git a/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/interceptor/ConnectInterceptor.java b/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/interceptor/ConnectInterceptor.java new file mode 100644 index 000000000..360a67095 --- /dev/null +++ b/src/main/java/com/nhn/pinpoint/profiler/modifier/connector/npc/interceptor/ConnectInterceptor.java @@ -0,0 +1,85 @@ +package com.nhn.pinpoint.profiler.modifier.connector.npc.interceptor; + +import java.net.InetSocketAddress; + +import com.nhn.pinpoint.common.AnnotationKey; +import com.nhn.pinpoint.common.ServiceType; +import com.nhn.pinpoint.profiler.context.Trace; +import com.nhn.pinpoint.profiler.context.TraceContext; +import com.nhn.pinpoint.profiler.context.TraceID; +import com.nhn.pinpoint.profiler.interceptor.ByteCodeMethodDescriptorSupport; +import com.nhn.pinpoint.profiler.interceptor.MethodDescriptor; +import com.nhn.pinpoint.profiler.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.profiler.interceptor.TraceContextSupport; +import com.nhn.pinpoint.profiler.logging.Logger; +import com.nhn.pinpoint.profiler.logging.LoggerFactory; +import com.nhn.pinpoint.profiler.util.MetaObject; + +public class ConnectInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { + + private final Logger logger = LoggerFactory.getLogger(ConnectInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); + + private final MetaObject getServerAddress = new MetaObject("__getServerAddress"); + + private MethodDescriptor descriptor; + private TraceContext traceContext; + + // private int apiId; + + @Override + public void before(Object target, Object[] args) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + Trace trace = traceContext.currentRawTraceObject(); + if (trace == null) { + logger.warn("Trace object is null"); + return; + } + + trace.traceBlockBegin(); + trace.markBeforeTime(); + + TraceID nextId = trace.getTraceId().getNextTraceId(); + trace.recordNextSpanId(nextId.getSpanId()); + + trace.recordServiceType(ServiceType.NPC_CLIENT); + + InetSocketAddress serverAddress = getServerAddress.invoke(target); + int port = serverAddress.getPort(); + trace.recordDestinationId(serverAddress.getHostName() + ((port > 0) ? ":" + port : "")); + + trace.recordAttribute(AnnotationKey.NPC_URL, serverAddress.toString()); + } + + @Override + public void after(Object target, Object[] args, Object result) { + if (isDebug) { + // result는 로깅하지 않는다. + logger.afterInterceptor(target, args); + } + + Trace trace = traceContext.currentTraceObject(); + if (trace == null) { + return; + } + trace.recordApi(descriptor); + trace.recordException(result); + + trace.markAfterTime(); + 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