Skip to content

Commit a9d5acc

Browse files
authored
Ignore aws sdk v2 presign requests (#9275)
1 parent 04436a1 commit a9d5acc

File tree

5 files changed

+109
-0
lines changed

5 files changed

+109
-0
lines changed

instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@ dependencies {
8484
testLibrary("software.amazon.awssdk:ses:2.2.0")
8585
}
8686

87+
val latestDepTest = findProperty("testLatestDeps") as Boolean
88+
89+
testing {
90+
suites {
91+
val s3PresignerTest by registering(JvmTestSuite::class) {
92+
dependencies {
93+
if (latestDepTest) {
94+
implementation("software.amazon.awssdk:s3:+")
95+
} else {
96+
implementation("software.amazon.awssdk:s3:2.10.12")
97+
}
98+
}
99+
}
100+
}
101+
}
102+
87103
tasks {
88104
val testExperimentalSqs by registering(Test::class) {
89105
group = "verification"
@@ -93,6 +109,7 @@ tasks {
93109

94110
check {
95111
dependsOn(testExperimentalSqs)
112+
dependsOn(testing.suites)
96113
}
97114

98115
withType<Test>().configureEach {

instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/SnsInstrumentationModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2;
77

8+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
89
import static net.bytebuddy.matcher.ElementMatchers.none;
910

1011
import com.google.auto.service.AutoService;
1112
import io.opentelemetry.instrumentation.awssdk.v2_2.SnsAdviceBridge;
1213
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1314
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1415
import net.bytebuddy.asm.Advice;
16+
import net.bytebuddy.matcher.ElementMatcher;
1517

1618
@AutoService(InstrumentationModule.class)
1719
public class SnsInstrumentationModule extends AbstractAwsSdkInstrumentationModule {
@@ -20,6 +22,11 @@ public SnsInstrumentationModule() {
2022
super("aws-sdk-2.2-sns");
2123
}
2224

25+
@Override
26+
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
27+
return hasClassesNamed("software.amazon.awssdk.services.sns.SnsClient");
28+
}
29+
2330
@Override
2431
public void doTransform(TypeTransformer transformer) {
2532
transformer.applyAdviceToMethod(

instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/SqsInstrumentationModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2;
77

8+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
89
import static net.bytebuddy.matcher.ElementMatchers.none;
910

1011
import com.google.auto.service.AutoService;
1112
import io.opentelemetry.instrumentation.awssdk.v2_2.SqsAdviceBridge;
1213
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1314
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1415
import net.bytebuddy.asm.Advice;
16+
import net.bytebuddy.matcher.ElementMatcher;
1517

1618
@AutoService(InstrumentationModule.class)
1719
public class SqsInstrumentationModule extends AbstractAwsSdkInstrumentationModule {
@@ -20,6 +22,11 @@ public SqsInstrumentationModule() {
2022
super("aws-sdk-2.2-sqs");
2123
}
2224

25+
@Override
26+
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
27+
return hasClassesNamed("software.amazon.awssdk.services.sqs.SqsClient");
28+
}
29+
2330
@Override
2431
public void doTransform(TypeTransformer transformer) {
2532
transformer.applyAdviceToMethod(
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import static org.assertj.core.api.Assertions.assertThat;
7+
8+
import io.opentelemetry.api.trace.Span;
9+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
11+
import java.time.Duration;
12+
import org.junit.jupiter.api.BeforeAll;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
16+
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
17+
import software.amazon.awssdk.regions.Region;
18+
import software.amazon.awssdk.services.s3.S3Client;
19+
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
20+
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
21+
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
22+
23+
class S3PresignerTest {
24+
@RegisterExtension
25+
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
26+
27+
private static final StaticCredentialsProvider CREDENTIALS_PROVIDER =
28+
StaticCredentialsProvider.create(
29+
AwsBasicCredentials.create("my-access-key", "my-secret-key"));
30+
31+
private static S3Presigner s3Presigner;
32+
33+
@BeforeAll
34+
static void setUp() {
35+
// trigger adding tracing interceptor
36+
S3Client.builder()
37+
.region(Region.AP_NORTHEAST_1)
38+
.credentialsProvider(CREDENTIALS_PROVIDER)
39+
.build();
40+
41+
s3Presigner =
42+
S3Presigner.builder()
43+
.region(Region.AP_NORTHEAST_1)
44+
.credentialsProvider(CREDENTIALS_PROVIDER)
45+
.build();
46+
}
47+
48+
@Test
49+
void testPresignGetObject() {
50+
s3Presigner.presignGetObject(
51+
GetObjectPresignRequest.builder()
52+
.getObjectRequest(builder -> builder.bucket("test").key("test"))
53+
.signatureDuration(Duration.ofDays(1))
54+
.build());
55+
56+
assertThat(Span.current().getSpanContext().isValid()).isFalse();
57+
}
58+
59+
@Test
60+
void testPresignPutObject() {
61+
s3Presigner.presignPutObject(
62+
PutObjectPresignRequest.builder()
63+
.putObjectRequest(builder -> builder.bucket("test").key("test"))
64+
.signatureDuration(Duration.ofDays(1))
65+
.build());
66+
67+
assertThat(Span.current().getSpanContext().isValid()).isFalse();
68+
}
69+
}

instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/TracingExecutionInterceptor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
1818
import java.util.List;
1919
import javax.annotation.Nullable;
20+
import software.amazon.awssdk.auth.signer.AwsSignerExecutionAttribute;
2021
import software.amazon.awssdk.awscore.AwsResponse;
2122
import software.amazon.awssdk.core.ClientType;
2223
import software.amazon.awssdk.core.SdkRequest;
@@ -89,6 +90,14 @@ public SdkRequest modifyRequest(
8990

9091
io.opentelemetry.context.Context parentOtelContext = io.opentelemetry.context.Context.current();
9192
SdkRequest request = context.request();
93+
94+
// Ignore presign request. These requests don't run all interceptor methods and the span created
95+
// here would never be ended and scope closed.
96+
if (executionAttributes.getAttribute(AwsSignerExecutionAttribute.PRESIGNER_EXPIRATION)
97+
!= null) {
98+
return request;
99+
}
100+
92101
executionAttributes.putAttribute(SDK_REQUEST_ATTRIBUTE, request);
93102

94103
if (!requestInstrumenter.shouldStart(parentOtelContext, executionAttributes)) {

0 commit comments

Comments
 (0)