From 609b57ee48997ed284cb554793909f6ada94614d Mon Sep 17 00:00:00 2001 From: Piotr Glazar Date: Thu, 4 Mar 2021 14:56:26 +0100 Subject: [PATCH] RequestMeta as AutoValue --- .../javaagent/aws-sdk-1.11-javaagent.gradle | 3 + .../v1_11/AwsClientInstrumentation.java | 3 +- .../v1_11/AwsSdkInstrumentationModule.java | 2 +- .../awssdk/v1_11/RequestInstrumentation.java | 70 +++++++-------- .../awssdk/v1_11/RequestMeta.java | 89 ++++++------------- .../awssdk/v1_11/TracingRequestHandler.java | 16 +++- 6 files changed, 82 insertions(+), 101 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/aws-sdk-1.11-javaagent.gradle b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/aws-sdk-1.11-javaagent.gradle index b59657e650..ecd69a5614 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/aws-sdk-1.11-javaagent.gradle +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/aws-sdk-1.11-javaagent.gradle @@ -51,6 +51,9 @@ dependencies { compileOnly group: 'com.amazonaws', name: 'aws-java-sdk-sqs', version: '1.11.106' + compileOnly deps.autoValueAnnotations + annotationProcessor deps.autoValue + // Include httpclient instrumentation for testing because it is a dependency for aws-sdk. testInstrumentation project(':instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent') testLibrary group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.11.106' diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsClientInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsClientInstrumentation.java index 63acedf97e..9437d82ab6 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsClientInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsClientInstrumentation.java @@ -54,7 +54,8 @@ public class AwsClientInstrumentation implements TypeInstrumentation { if (!hasAgentHandler) { handlers.add( new TracingRequestHandler( - InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class))); + InstrumentationContext.get( + AmazonWebServiceRequest.class, RequestMeta.Builder.class))); } } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java index d1f44cb019..f620c6c7d3 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java @@ -38,6 +38,6 @@ public class AwsSdkInstrumentationModule extends InstrumentationModule { public Map contextStore() { return singletonMap( "com.amazonaws.AmazonWebServiceRequest", - "io.opentelemetry.javaagent.instrumentation.awssdk.v1_11.RequestMeta"); + "io.opentelemetry.javaagent.instrumentation.awssdk.v1_11.RequestMeta$Builder"); } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestInstrumentation.java index 950726529e..ad9bf3a1eb 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestInstrumentation.java @@ -60,14 +60,14 @@ public class RequestInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) String value, @Advice.This AmazonWebServiceRequest request) { - ContextStore contextStore = - InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class); - RequestMeta requestMeta = contextStore.get(request); - if (requestMeta == null) { - requestMeta = new RequestMeta(); - contextStore.put(request, requestMeta); + ContextStore contextStore = + InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.Builder.class); + RequestMeta.Builder requestMetaBuilder = contextStore.get(request); + if (requestMetaBuilder == null) { + requestMetaBuilder = RequestMeta.builder(); + contextStore.put(request, requestMetaBuilder); } - requestMeta.setBucketName(value); + requestMetaBuilder.setBucketName(value); } } @@ -75,14 +75,14 @@ public class RequestInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) String value, @Advice.This AmazonWebServiceRequest request) { - ContextStore contextStore = - InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class); - RequestMeta requestMeta = contextStore.get(request); - if (requestMeta == null) { - requestMeta = new RequestMeta(); - contextStore.put(request, requestMeta); + ContextStore contextStore = + InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.Builder.class); + RequestMeta.Builder requestMetaBuilder = contextStore.get(request); + if (requestMetaBuilder == null) { + requestMetaBuilder = RequestMeta.builder(); + contextStore.put(request, requestMetaBuilder); } - requestMeta.setQueueUrl(value); + requestMetaBuilder.setQueueUrl(value); } } @@ -90,14 +90,14 @@ public class RequestInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) String value, @Advice.This AmazonWebServiceRequest request) { - ContextStore contextStore = - InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class); - RequestMeta requestMeta = contextStore.get(request); - if (requestMeta == null) { - requestMeta = new RequestMeta(); - contextStore.put(request, requestMeta); + ContextStore contextStore = + InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.Builder.class); + RequestMeta.Builder requestMetaBuilder = contextStore.get(request); + if (requestMetaBuilder == null) { + requestMetaBuilder = RequestMeta.builder(); + contextStore.put(request, requestMetaBuilder); } - requestMeta.setQueueName(value); + requestMetaBuilder.setQueueName(value); } } @@ -105,14 +105,14 @@ public class RequestInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) String value, @Advice.This AmazonWebServiceRequest request) { - ContextStore contextStore = - InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class); - RequestMeta requestMeta = contextStore.get(request); - if (requestMeta == null) { - requestMeta = new RequestMeta(); - contextStore.put(request, requestMeta); + ContextStore contextStore = + InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.Builder.class); + RequestMeta.Builder requestMetaBuilder = contextStore.get(request); + if (requestMetaBuilder == null) { + requestMetaBuilder = RequestMeta.builder(); + contextStore.put(request, requestMetaBuilder); } - requestMeta.setStreamName(value); + requestMetaBuilder.setStreamName(value); } } @@ -120,14 +120,14 @@ public class RequestInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) String value, @Advice.This AmazonWebServiceRequest request) { - ContextStore contextStore = - InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class); - RequestMeta requestMeta = contextStore.get(request); - if (requestMeta == null) { - requestMeta = new RequestMeta(); - contextStore.put(request, requestMeta); + ContextStore contextStore = + InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.Builder.class); + RequestMeta.Builder requestMetaBuilder = contextStore.get(request); + if (requestMetaBuilder == null) { + requestMetaBuilder = RequestMeta.builder(); + contextStore.put(request, requestMetaBuilder); } - requestMeta.setTableName(value); + requestMetaBuilder.setTableName(value); } } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestMeta.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestMeta.java index 5b91ad988d..f214d0de8d 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestMeta.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/RequestMeta.java @@ -6,78 +6,47 @@ package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; import com.amazonaws.handlers.HandlerContextKey; -import java.util.Objects; +import com.google.auto.value.AutoValue; +import javax.annotation.Nullable; -public class RequestMeta { +@AutoValue +public abstract class RequestMeta { // Note: aws1.x sdk doesn't have any truly async clients so we can store scope in request context // safely. public static final HandlerContextKey CONTEXT_SCOPE_PAIR_CONTEXT_KEY = new HandlerContextKey<>(RequestMeta.class.getName() + ".ContextScopePair"); - private String bucketName; - private String queueUrl; - private String queueName; - private String streamName; - private String tableName; - - public String getBucketName() { - return bucketName; + public static Builder builder() { + return new AutoValue_RequestMeta.Builder(); } - public void setBucketName(String bucketName) { - this.bucketName = bucketName; + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setBucketName(String bucketName); + + public abstract Builder setQueueUrl(String queueUrl); + + public abstract Builder setStreamName(String streamName); + + public abstract Builder setTableName(String tableName); + + public abstract Builder setQueueName(String queueName); + + public abstract RequestMeta build(); } - public String getQueueUrl() { - return queueUrl; - } + @Nullable + public abstract String getBucketName(); - public void setQueueUrl(String queueUrl) { - this.queueUrl = queueUrl; - } + @Nullable + public abstract String getQueueUrl(); - public String getQueueName() { - return queueName; - } + @Nullable + public abstract String getQueueName(); - public void setQueueName(String queueName) { - this.queueName = queueName; - } + @Nullable + public abstract String getStreamName(); - public String getStreamName() { - return streamName; - } - - public void setStreamName(String streamName) { - this.streamName = streamName; - } - - public String getTableName() { - return tableName; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (!(obj instanceof RequestMeta)) { - return false; - } - RequestMeta other = (RequestMeta) obj; - return Objects.equals(bucketName, other.bucketName) - && Objects.equals(queueUrl, other.queueUrl) - && Objects.equals(queueName, other.queueName) - && Objects.equals(streamName, other.streamName) - && Objects.equals(tableName, other.tableName); - } - - @Override - public int hashCode() { - return Objects.hash(bucketName, queueUrl, queueName, streamName, tableName); - } + @Nullable + public abstract String getTableName(); } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java index 10e3362698..f28848008d 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/TracingRequestHandler.java @@ -21,13 +21,15 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import java.util.List; +import java.util.Optional; /** Tracing Request Handler. */ public class TracingRequestHandler extends RequestHandler2 { - private final ContextStore contextStore; + private final ContextStore contextStore; - public TracingRequestHandler(ContextStore contextStore) { + public TracingRequestHandler( + ContextStore contextStore) { this.contextStore = contextStore; } @@ -37,7 +39,10 @@ public class TracingRequestHandler extends RequestHandler2 { AmazonWebServiceRequest originalRequest = request.getOriginalRequest(); SpanKind kind = (isSqsProducer(originalRequest) ? SpanKind.PRODUCER : SpanKind.CLIENT); - RequestMeta requestMeta = contextStore.get(originalRequest); + RequestMeta requestMeta = + Optional.ofNullable(contextStore.get(originalRequest)) + .map(RequestMeta.Builder::build) + .orElse(null); Context parentContext = Context.current(); if (!tracer().shouldStartSpan(parentContext)) { return; @@ -93,7 +98,10 @@ public class TracingRequestHandler extends RequestHandler2 { private void createConsumerSpan(Message message, Request request, Response response) { Context parentContext = SqsParentContext.ofSystemAttributes(message.getAttributes()); AmazonWebServiceRequest originalRequest = request.getOriginalRequest(); - RequestMeta requestMeta = contextStore.get(originalRequest); + RequestMeta requestMeta = + Optional.ofNullable(contextStore.get(originalRequest)) + .map(RequestMeta.Builder::build) + .orElse(null); Context context = tracer().startSpan(SpanKind.CONSUMER, parentContext, request, requestMeta); tracer().end(context, response); }