Skip to content

Commit 2f6685a

Browse files
committed
s3 and dynamo working, now kinesis
1 parent 827566a commit 2f6685a

File tree

9 files changed

+354
-89
lines changed

9 files changed

+354
-89
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.awssdk.v1_11;
7+
8+
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
9+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class Aws1DynamoDbClientTest extends AbstractAws1DynamoDbClientTest {
14+
@RegisterExtension
15+
private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create();
16+
17+
@Override
18+
protected InstrumentationExtension testing() {
19+
return testing;
20+
}
21+
22+
@Override
23+
public AmazonDynamoDBClientBuilder configureClient(AmazonDynamoDBClientBuilder clientBuilder) {
24+
return clientBuilder.withRequestHandlers(
25+
AwsSdkTelemetry.builder(testing().getOpenTelemetry())
26+
.setCaptureExperimentalSpanAttributes(true)
27+
.build()
28+
.newRequestHandler());
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.awssdk.v1_11;
7+
8+
import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder;
9+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class Aws1KinesisClientTest extends AbstractAws1KinesisClientTest {
14+
@RegisterExtension
15+
private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create();
16+
17+
@Override
18+
protected InstrumentationExtension testing() {
19+
return testing;
20+
}
21+
22+
@Override
23+
public AmazonKinesisClientBuilder configureClient(AmazonKinesisClientBuilder clientBuilder) {
24+
return clientBuilder.withRequestHandlers(
25+
AwsSdkTelemetry.builder(testing().getOpenTelemetry())
26+
.setCaptureExperimentalSpanAttributes(true)
27+
.build()
28+
.newRequestHandler());
29+
}
30+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
package io.opentelemetry.instrumentation.awssdk.v1_11;
77

8-
import com.amazonaws.client.builder.AwsClientBuilder;
8+
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
99
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1010
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
1111
import org.junit.jupiter.api.extension.RegisterExtension;
1212

13-
class Aws1ClientTest extends AbstractAws1ClientTest {
13+
class Aws1S3ClientTest extends AbstractAws1S3ClientTest {
1414
@RegisterExtension
1515
private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create();
1616

@@ -20,8 +20,8 @@ protected InstrumentationExtension testing() {
2020
}
2121

2222
@Override
23-
public AwsClientBuilder configureClient(AwsClientBuilder client) {
24-
return client.withRequestHandlers(
23+
public AmazonS3ClientBuilder configureClient(AmazonS3ClientBuilder clientBuilder) {
24+
return clientBuilder.withRequestHandlers(
2525
AwsSdkTelemetry.builder(testing().getOpenTelemetry())
2626
.setCaptureExperimentalSpanAttributes(true)
2727
.build()

instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import static io.opentelemetry.api.trace.SpanKind.PRODUCER
5353
import static io.opentelemetry.api.trace.StatusCode.ERROR
5454
import static io.opentelemetry.instrumentation.test.utils.PortUtils.UNUSABLE_PORT
5555

56-
abstract class AbstractAws1ClientTest2 extends InstrumentationSpecification {
56+
abstract class AbstractAws1ClientTest extends InstrumentationSpecification {
5757

5858
abstract <T> T configureClient(T client)
5959

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.awssdk.v1_11;
7+
8+
import static io.opentelemetry.api.common.AttributeKey.stringKey;
9+
import static io.opentelemetry.api.trace.SpanKind.CLIENT;
10+
import static io.opentelemetry.api.trace.SpanKind.PRODUCER;
11+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
12+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
13+
import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD;
14+
import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE;
15+
import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION;
16+
import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS;
17+
import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT;
18+
import static io.opentelemetry.semconv.UrlAttributes.URL_FULL;
19+
import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD;
20+
import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE;
21+
import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM;
22+
import static java.util.Arrays.asList;
23+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
24+
25+
import com.amazonaws.AmazonWebServiceClient;
26+
import com.amazonaws.SDKGlobalConfiguration;
27+
import com.amazonaws.auth.AWSStaticCredentialsProvider;
28+
import com.amazonaws.auth.AnonymousAWSCredentials;
29+
import com.amazonaws.client.builder.AwsClientBuilder;
30+
import com.amazonaws.handlers.RequestHandler2;
31+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
32+
import io.opentelemetry.sdk.testing.assertj.AttributeAssertion;
33+
import io.opentelemetry.testing.internal.armeria.testing.junit5.server.mock.MockWebServerExtension;
34+
import java.lang.reflect.Field;
35+
import java.util.ArrayList;
36+
import java.util.List;
37+
import java.util.Map;
38+
import org.junit.jupiter.api.AfterAll;
39+
import org.junit.jupiter.api.BeforeAll;
40+
41+
public abstract class AbstractAws1BaseClientTest {
42+
protected abstract InstrumentationExtension testing();
43+
44+
protected static MockWebServerExtension server = new MockWebServerExtension();
45+
protected static AwsClientBuilder.EndpointConfiguration endpoint;
46+
protected static final AWSStaticCredentialsProvider credentialsProvider =
47+
new AWSStaticCredentialsProvider(new AnonymousAWSCredentials());
48+
49+
@BeforeAll
50+
public static void setUp() {
51+
System.setProperty(SDKGlobalConfiguration.ACCESS_KEY_SYSTEM_PROPERTY, "my-access-key");
52+
System.setProperty(SDKGlobalConfiguration.SECRET_KEY_SYSTEM_PROPERTY, "my-secret-key");
53+
server.start();
54+
endpoint = new AwsClientBuilder.EndpointConfiguration(server.httpUri().toString(), "us-west-2");
55+
server.beforeTestExecution(null);
56+
}
57+
58+
@AfterAll
59+
public static void cleanUp() {
60+
System.clearProperty(SDKGlobalConfiguration.ACCESS_KEY_SYSTEM_PROPERTY);
61+
System.clearProperty(SDKGlobalConfiguration.SECRET_KEY_SYSTEM_PROPERTY);
62+
server.stop();
63+
}
64+
65+
@SuppressWarnings("unchecked")
66+
public void requestWithMockedResponse(
67+
Object response,
68+
Object client,
69+
String service,
70+
String operation,
71+
String method,
72+
Map<String, String> additionalAttributes)
73+
throws NoSuchFieldException, IllegalAccessException {
74+
75+
assertThat(response).isNotNull();
76+
77+
Field requestHandler2sField = AmazonWebServiceClient.class.getDeclaredField("requestHandler2s");
78+
requestHandler2sField.setAccessible(true);
79+
List<RequestHandler2> requestHandler2s =
80+
(List<RequestHandler2>) requestHandler2sField.get(client);
81+
82+
assertThat(requestHandler2s).isNotNull();
83+
assertThat(
84+
requestHandler2s.stream()
85+
.filter(h -> "TracingRequestHandler".equals(h.getClass().getSimpleName())))
86+
.isNotNull();
87+
88+
testing()
89+
.waitAndAssertTraces(
90+
trace ->
91+
trace.hasSpansSatisfyingExactly(
92+
span -> {
93+
List<AttributeAssertion> attributes =
94+
new ArrayList<>(
95+
asList(
96+
equalTo(URL_FULL, server.httpUri().toString()),
97+
equalTo(HTTP_REQUEST_METHOD, method),
98+
equalTo(HTTP_RESPONSE_STATUS_CODE, 200),
99+
equalTo(NETWORK_PROTOCOL_VERSION, "1.1"),
100+
equalTo(SERVER_PORT, server.httpPort()),
101+
equalTo(SERVER_ADDRESS, "127.0.0.1"),
102+
equalTo(RPC_SYSTEM, "aws-api"),
103+
satisfies(RPC_SERVICE, v -> v.contains(service)),
104+
equalTo(RPC_METHOD, operation),
105+
equalTo(stringKey("aws.endpoint"), endpoint.getServiceEndpoint()),
106+
equalTo(stringKey("aws.agent"), "java-aws-sdk")));
107+
additionalAttributes.forEach(
108+
(k, v) -> attributes.add(equalTo(stringKey(k), v)));
109+
110+
span.hasName(service + "." + operation)
111+
.hasKind(operation.equals("SendMessage") ? PRODUCER : CLIENT)
112+
.hasNoParent()
113+
.hasAttributesSatisfyingExactly(attributes);
114+
}));
115+
}
116+
}

instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.java

Lines changed: 0 additions & 84 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.awssdk.v1_11;
7+
8+
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
9+
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
10+
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
11+
import com.google.common.collect.ImmutableMap;
12+
import io.opentelemetry.testing.internal.armeria.common.HttpResponse;
13+
import io.opentelemetry.testing.internal.armeria.common.HttpStatus;
14+
import io.opentelemetry.testing.internal.armeria.common.MediaType;
15+
import org.junit.jupiter.api.Test;
16+
17+
public abstract class AbstractAws1DynamoDbClientTest extends AbstractAws1BaseClientTest {
18+
19+
public abstract AmazonDynamoDBClientBuilder configureClient(AmazonDynamoDBClientBuilder client);
20+
21+
@Test
22+
public void sendRequestWithMockedResponse() throws Exception {
23+
AmazonDynamoDBClientBuilder clientBuilder = AmazonDynamoDBClientBuilder.standard();
24+
AmazonDynamoDB client =
25+
configureClient(clientBuilder)
26+
.withEndpointConfiguration(endpoint)
27+
.withCredentials(credentialsProvider)
28+
.build();
29+
30+
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, ""));
31+
32+
Object response = client.createTable(new CreateTableRequest("sometable", null));
33+
requestWithMockedResponse(
34+
response,
35+
client,
36+
"DynamoDBv2",
37+
"CreateTable",
38+
"POST",
39+
ImmutableMap.of("aws.table.name", "sometable"));
40+
}
41+
}

0 commit comments

Comments
 (0)