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