RequestMeta as AutoValue

This commit is contained in:
Piotr Glazar 2021-03-04 14:56:26 +01:00
parent b0621bbd2d
commit 609b57ee48
6 changed files with 82 additions and 101 deletions

View File

@ -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'

View File

@ -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)));
}
}
}

View File

@ -38,6 +38,6 @@ public class AwsSdkInstrumentationModule extends InstrumentationModule {
public Map<String, String> contextStore() {
return singletonMap(
"com.amazonaws.AmazonWebServiceRequest",
"io.opentelemetry.javaagent.instrumentation.awssdk.v1_11.RequestMeta");
"io.opentelemetry.javaagent.instrumentation.awssdk.v1_11.RequestMeta$Builder");
}
}

View File

@ -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<AmazonWebServiceRequest, RequestMeta> contextStore =
InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class);
RequestMeta requestMeta = contextStore.get(request);
if (requestMeta == null) {
requestMeta = new RequestMeta();
contextStore.put(request, requestMeta);
ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> 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<AmazonWebServiceRequest, RequestMeta> contextStore =
InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class);
RequestMeta requestMeta = contextStore.get(request);
if (requestMeta == null) {
requestMeta = new RequestMeta();
contextStore.put(request, requestMeta);
ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> 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<AmazonWebServiceRequest, RequestMeta> contextStore =
InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class);
RequestMeta requestMeta = contextStore.get(request);
if (requestMeta == null) {
requestMeta = new RequestMeta();
contextStore.put(request, requestMeta);
ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> 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<AmazonWebServiceRequest, RequestMeta> contextStore =
InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class);
RequestMeta requestMeta = contextStore.get(request);
if (requestMeta == null) {
requestMeta = new RequestMeta();
contextStore.put(request, requestMeta);
ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> 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<AmazonWebServiceRequest, RequestMeta> contextStore =
InstrumentationContext.get(AmazonWebServiceRequest.class, RequestMeta.class);
RequestMeta requestMeta = contextStore.get(request);
if (requestMeta == null) {
requestMeta = new RequestMeta();
contextStore.put(request, requestMeta);
ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> 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);
}
}
}

View File

@ -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<ContextScopePair> 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();
}

View File

@ -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<AmazonWebServiceRequest, RequestMeta> contextStore;
private final ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> contextStore;
public TracingRequestHandler(ContextStore<AmazonWebServiceRequest, RequestMeta> contextStore) {
public TracingRequestHandler(
ContextStore<AmazonWebServiceRequest, RequestMeta.Builder> 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);
}