From bfaaea485812c8defdff02f4591b64b353459941 Mon Sep 17 00:00:00 2001 From: Chisu Yu Date: Mon, 10 Dec 2012 02:56:32 +0000 Subject: [PATCH] =?UTF-8?q?[=EC=9C=A0=EC=B9=98=EC=88=98]=20[NOBTS]=20repla?= =?UTF-8?q?ce=20extractHost=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@1003 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../Execute2MethodInterceptor.java | 151 ++++++++++++------ 1 file changed, 103 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/profiler/modifier/connector/interceptors/Execute2MethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/interceptors/Execute2MethodInterceptor.java index f4797422b..24cd44697 100644 --- a/src/main/java/com/profiler/modifier/connector/interceptors/Execute2MethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/interceptors/Execute2MethodInterceptor.java @@ -1,12 +1,12 @@ package com.profiler.modifier.connector.interceptors; +import java.net.URI; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.http.HttpHost; import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.utils.URIUtils; import com.profiler.common.ServiceType; import com.profiler.context.Header; @@ -22,6 +22,7 @@ import com.profiler.util.StringUtils; * Method interceptor *

*

+ * *

  * org.apache.http.impl.client.AbstractHttpClient.
  * public final HttpResponse execute(HttpUriRequest request) throws IOException, ClientProtocolException
@@ -29,62 +30,116 @@ import com.profiler.util.StringUtils;
  */
 public class Execute2MethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport {
 
-    private final Logger logger = Logger.getLogger(Execute2MethodInterceptor.class.getName());
-    private MethodDescriptor descriptor;
+	private final Logger logger = Logger.getLogger(Execute2MethodInterceptor.class.getName());
+	private MethodDescriptor descriptor;
 
-    @Override
-    public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) {
-        if (logger.isLoggable(Level.INFO)) {
-            logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args));
-        }
-        TraceContext traceContext = TraceContext.getTraceContext();
-        Trace trace = traceContext.currentTraceObject();
-        if (trace == null) {
-            return;
-        }
-        trace.traceBlockBegin();
-        trace.markBeforeTime();
+	@Override
+	public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) {
+		if (logger.isLoggable(Level.INFO)) {
+			logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args));
+		}
+		TraceContext traceContext = TraceContext.getTraceContext();
+		Trace trace = traceContext.currentTraceObject();
+		if (trace == null) {
+			return;
+		}
+		trace.traceBlockBegin();
+		trace.markBeforeTime();
 
-        TraceID nextId = trace.getTraceId();
+		TraceID nextId = trace.getTraceId();
 
-        final HttpUriRequest request = (HttpUriRequest) args[0];
+		final HttpUriRequest request = (HttpUriRequest) args[0];
 
-        // UUID format을 그대로.
-        request.addHeader(Header.HTTP_TRACE_ID.toString(), nextId.getId().toString());
-        request.addHeader(Header.HTTP_SPAN_ID.toString(), Long.toString(nextId.getSpanId()));
-        request.addHeader(Header.HTTP_PARENT_SPAN_ID.toString(), Long.toString(nextId.getParentSpanId()));
-        request.addHeader(Header.HTTP_SAMPLED.toString(), String.valueOf(nextId.isSampled()));
-        request.addHeader(Header.HTTP_FLAGS.toString(), String.valueOf(nextId.getFlags()));
+		// UUID format을 그대로.
+		request.addHeader(Header.HTTP_TRACE_ID.toString(), nextId.getId().toString());
+		request.addHeader(Header.HTTP_SPAN_ID.toString(), Long.toString(nextId.getSpanId()));
+		request.addHeader(Header.HTTP_PARENT_SPAN_ID.toString(), Long.toString(nextId.getParentSpanId()));
+		request.addHeader(Header.HTTP_SAMPLED.toString(), String.valueOf(nextId.isSampled()));
+		request.addHeader(Header.HTTP_FLAGS.toString(), String.valueOf(nextId.getFlags()));
 
-        HttpHost host = URIUtils.extractHost(request.getURI());
+		HttpHost host = extractHost(request.getURI());
+
+		trace.recordRpcName(ServiceType.HTTP_CLIENT, request.getProtocolVersion().toString(), "CLIENT");
 
-        trace.recordRpcName(ServiceType.HTTP_CLIENT, request.getProtocolVersion().toString(), "CLIENT");
-        
 		int port = host.getPort();
-		trace.recordEndPoint(request.getProtocolVersion() + ":" + host.getHostName() +  ((port > 0) ? ":" + port : ""));
-        trace.recordAttribute("http.url", request.getRequestLine().getUri());
-    }
+		trace.recordEndPoint(request.getProtocolVersion() + ":" + host.getHostName() + ((port > 0) ? ":" + port : ""));
+		trace.recordAttribute("http.url", request.getRequestLine().getUri());
+	}
 
-    @Override
-    public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) {
-        if (logger.isLoggable(Level.INFO)) {
-            logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args));
-        }
+	@Override
+	public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) {
+		if (logger.isLoggable(Level.INFO)) {
+			logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args));
+		}
 
-        TraceContext traceContext = TraceContext.getTraceContext();
-        Trace trace = traceContext.currentTraceObject();
-        if (trace == null) {
-            return;
-        }
-        trace.recordApi(descriptor);
-        trace.recordException(result);
+		TraceContext traceContext = TraceContext.getTraceContext();
+		Trace trace = traceContext.currentTraceObject();
+		if (trace == null) {
+			return;
+		}
+		trace.recordApi(descriptor);
+		trace.recordException(result);
 
-        trace.markAfterTime();
-        trace.traceBlockEnd();
-    }
+		trace.markAfterTime();
+		trace.traceBlockEnd();
+	}
 
-    @Override
-    public void setMethodDescriptor(MethodDescriptor descriptor) {
-        this.descriptor = descriptor;
-    }
+	@Override
+	public void setMethodDescriptor(MethodDescriptor descriptor) {
+		this.descriptor = descriptor;
+	}
+
+	private HttpHost extractHost(final URI uri) {
+		if (uri == null) {
+			return null;
+		}
+		HttpHost target = null;
+		if (uri.isAbsolute()) {
+			int port = uri.getPort(); // may be overridden later
+			String host = uri.getHost();
+			if (host == null) { // normal parse failed; let's do it ourselves
+				// authority does not seem to care about the valid character-set
+				// for host names
+				host = uri.getAuthority();
+				if (host != null) {
+					// Strip off any leading user credentials
+					int at = host.indexOf('@');
+					if (at >= 0) {
+						if (host.length() > at + 1) {
+							host = host.substring(at + 1);
+						} else {
+							host = null; // @ on its own
+						}
+					}
+					// Extract the port suffix, if present
+					if (host != null) {
+						int colon = host.indexOf(':');
+						if (colon >= 0) {
+							int pos = colon + 1;
+							int len = 0;
+							for (int i = pos; i < host.length(); i++) {
+								if (Character.isDigit(host.charAt(i))) {
+									len++;
+								} else {
+									break;
+								}
+							}
+							if (len > 0) {
+								try {
+									port = Integer.parseInt(host.substring(pos, pos + len));
+								} catch (NumberFormatException ex) {
+								}
+							}
+							host = host.substring(0, colon);
+						}
+					}
+				}
+			}
+			String scheme = uri.getScheme();
+			if (host != null) {
+				target = new HttpHost(host, port, scheme);
+			}
+		}
+		return target;
+	}
 }
\ No newline at end of file