[유치수] [NOBTS] sun.net.www.protocol.http.HttpURLConnection modifier추가. (동작 안함.)

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@1299 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Chisu Yu
2013-03-06 10:04:58 +00:00
parent 707ef53a13
commit 35f249f08a
2 changed files with 138 additions and 0 deletions
@@ -0,0 +1,47 @@
package com.profiler.modifier.connector;
import java.security.ProtectionDomain;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.profiler.Agent;
import com.profiler.interceptor.Interceptor;
import com.profiler.interceptor.bci.ByteCodeInstrumentor;
import com.profiler.interceptor.bci.InstrumentClass;
import com.profiler.interceptor.bci.InstrumentException;
import com.profiler.modifier.AbstractModifier;
/**
* TODO classloader문제 있음.
* @author netspider
*
*/
public class HttpURLConnectionModifier extends AbstractModifier {
private final Logger logger = Logger.getLogger(HTTPClientModifier.class.getName());
public HttpURLConnectionModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) {
super(byteCodeInstrumentor, agent);
}
public String getTargetClass() {
return "sun/net/www/protocol/http/HttpURLConnection";
}
public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) {
if (logger.isLoggable(Level.INFO)) {
logger.info("Modifing. " + javassistClassName);
}
byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName);
try {
InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName);
Interceptor interceptor = byteCodeInstrumentor.newInterceptor(ClassLoader.getSystemClassLoader(), protectedDomain, "com.profiler.modifier.connector.interceptors.ConnectMethodInterceptor");
aClass.addInterceptor("connect", null, interceptor);
return aClass.toBytecode();
} catch (InstrumentException e) {
e.printStackTrace();
return null;
}
}
}
@@ -0,0 +1,91 @@
package com.profiler.modifier.connector.interceptors;
import java.net.HttpURLConnection;
import java.util.logging.Logger;
import com.profiler.common.AnnotationKey;
import com.profiler.common.ServiceType;
import com.profiler.context.Header;
import com.profiler.context.Trace;
import com.profiler.context.TraceContext;
import com.profiler.context.TraceID;
import com.profiler.interceptor.ByteCodeMethodDescriptorSupport;
import com.profiler.interceptor.MethodDescriptor;
import com.profiler.interceptor.StaticAroundInterceptor;
import com.profiler.logging.LoggingUtils;
/**
* TODO classloader문제 있음.
* @author netspider
*
*/
public class ConnectMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport {
private final Logger logger = Logger.getLogger(ConnectMethodInterceptor.class.getName());
private final boolean isDebug = LoggingUtils.isDebug(logger);
private MethodDescriptor descriptor;
@Override
public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) {
if (isDebug) {
LoggingUtils.logBefore(logger, target, className, methodName, parameterDescription, args);
}
TraceContext traceContext = TraceContext.getTraceContext();
Trace trace = traceContext.currentTraceObject();
if (trace == null) {
return;
}
trace.traceBlockBegin();
trace.markBeforeTime();
TraceID nextId = trace.getTraceId().getNextTraceId();
trace.recordNextSpanId(nextId.getSpanId());
HttpURLConnection request = (HttpURLConnection) target;
// UUID format을 그대로.
request.setRequestProperty(Header.HTTP_TRACE_ID.toString(), nextId.getId().toString());
request.setRequestProperty(Header.HTTP_SPAN_ID.toString(), Integer.toString(nextId.getSpanId()));
request.setRequestProperty(Header.HTTP_PARENT_SPAN_ID.toString(), Integer.toString(nextId.getParentSpanId()));
request.setRequestProperty(Header.HTTP_SAMPLED.toString(), String.valueOf(nextId.isSampled()));
request.setRequestProperty(Header.HTTP_FLAGS.toString(), String.valueOf(nextId.getFlags()));
trace.recordServiceType(ServiceType.HTTP_CLIENT);
trace.recordRpcName("CLIENT");
String host = request.getURL().getHost();
int port = request.getURL().getPort();
trace.recordEndPoint("HTTP/1.1:" + host + ((port > 0) ? ":" + port : ""));
trace.recordDestinationId(host + ((port > 0) ? ":" + port : ""));
trace.recordAttribute(AnnotationKey.HTTP_URL, request.getURL().toString());
}
@Override
public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) {
if (isDebug) {
// result는 로깅하지 않는다.
LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args);
}
TraceContext traceContext = TraceContext.getTraceContext();
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 traceContext = TraceContext.getTraceContext();
traceContext.cacheApi(descriptor);
}
}