diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/build.gradle b/instrumentation/aws-java-sdk-firehose-2.1.0/build.gradle new file mode 100644 index 0000000000..a330d529e5 --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/build.gradle @@ -0,0 +1,14 @@ +dependencies { + implementation(project(":agent-bridge")) + implementation("software.amazon.awssdk:firehose:2.1.0") +} + +jar { + manifest { attributes 'Implementation-Title': 'com.newrelic.instrumentation.aws-java-sdk-firehose-2.1.0' } +} + +verifyInstrumentation { + passes 'software.amazon.awssdk:firehose:[2.1.0,)' + exclude 'software.amazon.awssdk:firehose:2.17.200' // this version failed the test, but the next one works again. + excludeRegex '.*-preview-[0-9a-f]+' +} \ No newline at end of file diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/DeliveryStreamRawData.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/DeliveryStreamRawData.java new file mode 100644 index 0000000000..17dd3465a4 --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/DeliveryStreamRawData.java @@ -0,0 +1,63 @@ +package com.agent.instrumentation.awsjavasdk2.services.firehose; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.CloudAccountInfo; +import software.amazon.awssdk.awscore.client.config.AwsClientOption; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.regions.Region; + +import java.util.Objects; + +public class DeliveryStreamRawData { + private final String streamName; + private final String accountId; + private final String region; + + public DeliveryStreamRawData(String streamName, Object client, SdkClientConfiguration config) { + this.streamName = streamName; + this.accountId = AgentBridge.cloud.getAccountInfo(client, CloudAccountInfo.AWS_ACCOUNT_ID); + this.region = getRegionFromConfig(config); + } + + public String getStreamName() { + return streamName; + } + + public String getAccountId() { + return accountId; + } + + public String getRegion() { + return region; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof DeliveryStreamRawData)) { + return false; + } + DeliveryStreamRawData that = (DeliveryStreamRawData) o; + return Objects.equals(streamName, that.streamName) && + Objects.equals(region, that.region) && + Objects.equals(accountId, that.accountId); + } + + @Override + public int hashCode() { + return Objects.hash(streamName, region, accountId); + } + + private static String getRegionFromConfig(SdkClientConfiguration config) { + if (config == null) { + return null; + } + Region option = config.option(AwsClientOption.AWS_REGION); + if (option == null) { + return null; + } + return option.toString(); + } +} diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/FirehoseUtil.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/FirehoseUtil.java new file mode 100644 index 0000000000..20592c1d0e --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/FirehoseUtil.java @@ -0,0 +1,65 @@ +package com.agent.instrumentation.awsjavasdk2.services.firehose; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.CloudParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.TracedMethod; + +import java.util.function.Function; + +public class FirehoseUtil { + + public static final String PLATFORM = "aws_kinesis_delivery_streams"; + public static final String TRACE_CATEGORY = "Firehose"; + + private static final Function ARN_CACHE = + AgentBridge.collectionFactory.createAccessTimeBasedCache(3600, 8, FirehoseUtil::createArn); + private FirehoseUtil() {} + + public static Segment beginSegment(String firehoseOperation, DeliveryStreamRawData streamRawData) { + String traceName = createTraceName(firehoseOperation, streamRawData); + Segment segment = NewRelic.getAgent().getTransaction().startSegment(TRACE_CATEGORY, traceName); + segment.reportAsExternal(createCloudParams(streamRawData)); + return segment; + } + + public static void setTraceDetails(String firehoseOperation, DeliveryStreamRawData streamRawData) { + TracedMethod tracedMethod = NewRelic.getAgent().getTracedMethod(); + String traceName = createTraceName(firehoseOperation, streamRawData); + tracedMethod.setMetricName(TRACE_CATEGORY, traceName); + tracedMethod.reportAsExternal(createCloudParams(streamRawData)); + } + + public static String createTraceName(String firehoseOperation, DeliveryStreamRawData streamRawData) { + String streamName = streamRawData.getStreamName(); + if (streamName != null && !streamName.isEmpty()) { + return firehoseOperation + "/" + streamName; + } + return firehoseOperation; + } + public static CloudParameters createCloudParams(DeliveryStreamRawData streamRawData) { + return CloudParameters.provider(PLATFORM) + .resourceId(ARN_CACHE.apply(streamRawData)) + .build(); + } + + public static String createArn(DeliveryStreamRawData streamRawData) { + String accountId = streamRawData.getAccountId(); + if (accountId == null || accountId.isEmpty()) { + return null; + } + + String streamName = streamRawData.getStreamName(); + if (streamName == null || streamName.isEmpty()) { + return null; + } + String region = streamRawData.getRegion(); + if (region == null || region.isEmpty()) { + return null; + } + + return "arn:aws:firehose:" + region + ':' + accountId + ":deliverystream/" + streamRawData.getStreamName(); + } + +} diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/SegmentHandler.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/SegmentHandler.java new file mode 100644 index 0000000000..751f8484cc --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/com/agent/instrumentation/awsjavasdk2/services/firehose/SegmentHandler.java @@ -0,0 +1,34 @@ +package com.agent.instrumentation.awsjavasdk2.services.firehose; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Segment; + +import java.util.concurrent.CompletableFuture; + +public class SegmentHandler { + private final DeliveryStreamRawData streamRawData; + private final CompletableFuture completableFuture; + private final Segment segment; + private final String implementationTitle; + + public SegmentHandler(DeliveryStreamRawData streamRawData, CompletableFuture completableFuture, Segment segment, String implementationTitle) { + this.streamRawData = streamRawData; + this.completableFuture = completableFuture; + this.segment = segment; + this.implementationTitle = implementationTitle; + } + + public CompletableFuture newSegmentCompletionStage() { + if (completableFuture == null) { + return null; + } + return completableFuture.whenComplete((r, t) -> { + try { + segment.reportAsExternal(FirehoseUtil.createCloudParams(streamRawData)); + segment.end(); + } catch (Throwable t1) { + AgentBridge.instrumentation.noticeInstrumentationError(t1, implementationTitle); + } + }); + } +} \ No newline at end of file diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/client/handler/AsyncClientHandler_Instrumentation.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/client/handler/AsyncClientHandler_Instrumentation.java new file mode 100644 index 0000000000..eaf9981c8a --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/client/handler/AsyncClientHandler_Instrumentation.java @@ -0,0 +1,24 @@ +package software.amazon.awssdk.core.client.handler; + +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import software.amazon.awssdk.core.SdkRequest; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.core.async.AsyncResponseTransformer; + +import java.util.concurrent.CompletableFuture; + +@Weave(originalName = "software.amazon.awssdk.core.client.handler.AsyncClientHandler", type = MatchType.Interface) +public abstract class AsyncClientHandler_Instrumentation { + // This prevents further traces from forming when using the async client + @Trace(leaf = true, excludeFromTransactionTrace = true) + public abstract CompletableFuture execute( + ClientExecutionParams executionParams); + + @Trace(leaf = true, excludeFromTransactionTrace = true) + public abstract CompletableFuture execute( + ClientExecutionParams executionParams, + AsyncResponseTransformer asyncResponseTransformer); +} diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/services/firehose/DefaultFirehoseAsyncClient_Instrumentation.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/services/firehose/DefaultFirehoseAsyncClient_Instrumentation.java new file mode 100644 index 0000000000..54f5b84880 --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/services/firehose/DefaultFirehoseAsyncClient_Instrumentation.java @@ -0,0 +1,126 @@ +package software.amazon.awssdk.core.services.firehose; + +import com.agent.instrumentation.awsjavasdk2.services.firehose.DeliveryStreamRawData; +import com.agent.instrumentation.awsjavasdk2.services.firehose.FirehoseUtil; +import com.agent.instrumentation.awsjavasdk2.services.firehose.SegmentHandler; +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.DeleteDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DeleteDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.DescribeDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DescribeDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.ListDeliveryStreamsRequest; +import software.amazon.awssdk.services.firehose.model.ListDeliveryStreamsResponse; +import software.amazon.awssdk.services.firehose.model.ListTagsForDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.ListTagsForDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.PutRecordBatchRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordBatchResponse; +import software.amazon.awssdk.services.firehose.model.PutRecordRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordResponse; +import software.amazon.awssdk.services.firehose.model.StartDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.StartDeliveryStreamEncryptionResponse; +import software.amazon.awssdk.services.firehose.model.StopDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.StopDeliveryStreamEncryptionResponse; +import software.amazon.awssdk.services.firehose.model.TagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.TagDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.UntagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.UntagDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.UpdateDestinationRequest; +import software.amazon.awssdk.services.firehose.model.UpdateDestinationResponse; + +import java.util.concurrent.CompletableFuture; + +@Weave(originalName = "software.amazon.awssdk.services.firehose.DefaultFirehoseAsyncClient", type = MatchType.ExactClass) +class DefaultFirehoseAsyncClient_Instrumentation { + + private final SdkClientConfiguration clientConfiguration = Weaver.callOriginal(); + + public CompletableFuture createDeliveryStream(CreateDeliveryStreamRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("createDeliveryStream", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture deleteDeliveryStream(DeleteDeliveryStreamRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("deleteDeliveryStream", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture describeDeliveryStream(DescribeDeliveryStreamRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("describeDeliveryStream", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture listDeliveryStreams(ListDeliveryStreamsRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(null, this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("listDeliveryStreams", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture listTagsForDeliveryStream(ListTagsForDeliveryStreamRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("listTagsForDeliveryStream", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture putRecord(PutRecordRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("putRecord", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture putRecordBatch(PutRecordBatchRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("putRecordBatch", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture startDeliveryStreamEncryption(StartDeliveryStreamEncryptionRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("startDeliveryStreamEncryption", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture stopDeliveryStreamEncryption(StopDeliveryStreamEncryptionRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("stopDeliveryStreamEncryption", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture tagDeliveryStream(TagDeliveryStreamRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("tagDeliveryStream", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture untagDeliveryStream(UntagDeliveryStreamRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("untagDeliveryStream", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } + + public CompletableFuture updateDestination(UpdateDestinationRequest request) { + DeliveryStreamRawData streamRawData = new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration); + Segment segment = FirehoseUtil.beginSegment("updateDestination", streamRawData); + CompletableFuture response = Weaver.callOriginal(); + return new SegmentHandler<>(streamRawData, response, segment, Weaver.getImplementationTitle()).newSegmentCompletionStage(); + } +} diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/services/firehose/DefaultFirehoseClient_Instrumentation.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/services/firehose/DefaultFirehoseClient_Instrumentation.java new file mode 100644 index 0000000000..3c02076e60 --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/main/java/software/amazon/awssdk/core/services/firehose/DefaultFirehoseClient_Instrumentation.java @@ -0,0 +1,124 @@ +package software.amazon.awssdk.core.services.firehose; + +import com.agent.instrumentation.awsjavasdk2.services.firehose.DeliveryStreamRawData; +import com.agent.instrumentation.awsjavasdk2.services.firehose.FirehoseUtil; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import software.amazon.awssdk.core.client.config.SdkClientConfiguration; +import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.DeleteDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DeleteDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.DescribeDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DescribeDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.ListDeliveryStreamsRequest; +import software.amazon.awssdk.services.firehose.model.ListDeliveryStreamsResponse; +import software.amazon.awssdk.services.firehose.model.ListTagsForDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.ListTagsForDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.PutRecordBatchRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordBatchResponse; +import software.amazon.awssdk.services.firehose.model.PutRecordRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordResponse; +import software.amazon.awssdk.services.firehose.model.StartDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.StartDeliveryStreamEncryptionResponse; +import software.amazon.awssdk.services.firehose.model.StopDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.StopDeliveryStreamEncryptionResponse; +import software.amazon.awssdk.services.firehose.model.TagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.TagDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.UntagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.UntagDeliveryStreamResponse; +import software.amazon.awssdk.services.firehose.model.UpdateDestinationRequest; +import software.amazon.awssdk.services.firehose.model.UpdateDestinationResponse; + +@Weave(originalName = "software.amazon.awssdk.services.firehose.DefaultFirehoseClient", type = MatchType.ExactClass) +class DefaultFirehoseClient_Instrumentation { + + private final SdkClientConfiguration clientConfiguration = Weaver.callOriginal(); + + @Trace(leaf=true) + public CreateDeliveryStreamResponse createDeliveryStream(CreateDeliveryStreamRequest request) { + FirehoseUtil.setTraceDetails("createDeliveryStream", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public DeleteDeliveryStreamResponse deleteDeliveryStream(DeleteDeliveryStreamRequest request) { + FirehoseUtil.setTraceDetails("deleteDeliveryStream", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public DescribeDeliveryStreamResponse describeDeliveryStream(DescribeDeliveryStreamRequest request) { + FirehoseUtil.setTraceDetails("describeDeliveryStream", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public ListDeliveryStreamsResponse listDeliveryStreams(ListDeliveryStreamsRequest request) { + FirehoseUtil.setTraceDetails("listDeliveryStreams", + new DeliveryStreamRawData(null, this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public ListTagsForDeliveryStreamResponse listTagsForDeliveryStream(ListTagsForDeliveryStreamRequest request) { + FirehoseUtil.setTraceDetails("listTagsForDeliveryStream", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public PutRecordResponse putRecord(PutRecordRequest request) { + FirehoseUtil.setTraceDetails("putRecord", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public PutRecordBatchResponse putRecordBatch(PutRecordBatchRequest request) { + FirehoseUtil.setTraceDetails("putRecordBatch", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public StartDeliveryStreamEncryptionResponse startDeliveryStreamEncryption(StartDeliveryStreamEncryptionRequest request) { + FirehoseUtil.setTraceDetails("startDeliveryStreamEncryption", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public StopDeliveryStreamEncryptionResponse stopDeliveryStreamEncryption(StopDeliveryStreamEncryptionRequest request) { + FirehoseUtil.setTraceDetails("stopDeliveryStreamEncryption", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public TagDeliveryStreamResponse tagDeliveryStream(TagDeliveryStreamRequest request) { + FirehoseUtil.setTraceDetails("tagDeliveryStream", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public UntagDeliveryStreamResponse untagDeliveryStream(UntagDeliveryStreamRequest request) { + FirehoseUtil.setTraceDetails("untagDeliveryStream", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + + @Trace(leaf=true) + public UpdateDestinationResponse updateDestination(UpdateDestinationRequest request) { + FirehoseUtil.setTraceDetails("updateDestination", + new DeliveryStreamRawData(request.deliveryStreamName(), this, clientConfiguration)); + return Weaver.callOriginal(); + } + +} \ No newline at end of file diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/java/software/amazon/awssdk/services/firehose/DefaultFirehoseAsyncClientTest.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/java/software/amazon/awssdk/services/firehose/DefaultFirehoseAsyncClientTest.java new file mode 100644 index 0000000000..d025b19bcd --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/java/software/amazon/awssdk/services/firehose/DefaultFirehoseAsyncClientTest.java @@ -0,0 +1,225 @@ +package software.amazon.awssdk.services.firehose; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.agent.introspec.InstrumentationTestConfig; +import com.newrelic.agent.introspec.InstrumentationTestRunner; +import com.newrelic.agent.introspec.Introspector; +import com.newrelic.agent.introspec.SpanEvent; +import com.newrelic.agent.introspec.TraceSegment; +import com.newrelic.agent.introspec.TransactionTrace; +import com.newrelic.api.agent.CloudAccountInfo; +import com.newrelic.api.agent.Trace; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.core.async.EmptyPublisher; +import software.amazon.awssdk.http.AbortableInputStream; +import software.amazon.awssdk.http.ExecutableHttpRequest; +import software.amazon.awssdk.http.HttpExecuteResponse; +import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.http.async.AsyncExecuteRequest; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DeleteDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DescribeDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.ListDeliveryStreamsRequest; +import software.amazon.awssdk.services.firehose.model.ListTagsForDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordBatchRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordRequest; +import software.amazon.awssdk.services.firehose.model.StartDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.StopDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.TagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.UntagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.UpdateDestinationRequest; +import software.amazon.awssdk.utils.StringInputStream; + +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(InstrumentationTestRunner.class) +@InstrumentationTestConfig(includePrefixes = {"software.amazon.awssdk"}, configName = "dt_enabled.yml") +public class DefaultFirehoseAsyncClientTest { + + public static final String ACCOUNT_ID = "111111111111"; + public static final String DELIVERY_STREAM_NAME = "stream-name"; + public static final String DELIVERY_STREAM_ARN = "arn:aws:firehose:us-east-1:111111111111:deliverystream/stream-name"; + public FirehoseAsyncClient firehoseAsyncClient; + public HttpExecuteResponse response; + + @Before + public void setup() { + AsyncHttpClient mockHttpClient = new AsyncHttpClient(); + response = mockHttpClient.getResponse(); + firehoseAsyncClient = FirehoseAsyncClient.builder() + .httpClient(mockHttpClient) + .credentialsProvider(new CredProvider()) + .region(Region.US_EAST_1) + .build(); + AgentBridge.cloud.setAccountInfo(firehoseAsyncClient, CloudAccountInfo.AWS_ACCOUNT_ID, ACCOUNT_ID); + } + + @Test + public void testCreateDeliveryStream() { + txn(() -> firehoseAsyncClient.createDeliveryStream(CreateDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/createDeliveryStream/stream-name", DELIVERY_STREAM_ARN, true); + } + + @Test + public void testDeleteDeliveryStream() { + txn(() -> firehoseAsyncClient.deleteDeliveryStream(DeleteDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/deleteDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testDescribeDeliveryStream() { + txn(() -> firehoseAsyncClient.describeDeliveryStream(DescribeDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/describeDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testListDeliveryStreams() { + txn(() -> firehoseAsyncClient.listDeliveryStreams(ListDeliveryStreamsRequest.builder().build())); + assertFirehoseTrace("Firehose/listDeliveryStreams", null, false); + } + + @Test + public void testListTagsForDeliveryStream() { + txn(() -> firehoseAsyncClient.listTagsForDeliveryStream(ListTagsForDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/listTagsForDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testPutRecord() { + txn(() -> firehoseAsyncClient.putRecord(PutRecordRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/putRecord/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testPutRecordBatch() { + txn(() -> firehoseAsyncClient.putRecordBatch(PutRecordBatchRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/putRecordBatch/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testStartDeliveryStreamEncryption() { + txn(() -> firehoseAsyncClient.startDeliveryStreamEncryption(StartDeliveryStreamEncryptionRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/startDeliveryStreamEncryption/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testStopDeliveryStreamEncryption() { + txn(() -> firehoseAsyncClient.stopDeliveryStreamEncryption(StopDeliveryStreamEncryptionRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/stopDeliveryStreamEncryption/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testTagDeliveryStream() { + txn(() -> firehoseAsyncClient.tagDeliveryStream(TagDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/tagDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testUnTagDeliveryStream() { + txn(() -> firehoseAsyncClient.untagDeliveryStream(UntagDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/untagDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testUpdateDestination() { + txn(() -> firehoseAsyncClient.updateDestination(UpdateDestinationRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/updateDestination/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Trace(dispatcher = true) + private void txn(Supplier> supplier) { + supplier.get(); + } + + private void assertFirehoseTrace(String traceName, String expectedArn, boolean assertSpan) { + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + if (assertSpan) { + // Span events fail to be generated when enough transactions are done in succession + SpanEvent kinesisSpan = introspector.getSpanEvents().stream() + .filter(span -> traceName.equals(span.getName())) + .findFirst().orElse(null); + assertNotNull(kinesisSpan); + assertEquals("aws_kinesis_delivery_streams", kinesisSpan.getAgentAttributes().get("cloud.platform")); + assertEquals(expectedArn, kinesisSpan.getAgentAttributes().get("cloud.resource_id")); + } + Collection transactionTraces = introspector.getTransactionTracesForTransaction( + "OtherTransaction/Custom/software.amazon.awssdk.services.firehose.DefaultFirehoseAsyncClientTest/txn"); + TransactionTrace transactionTrace = transactionTraces.iterator().next(); + List children = transactionTrace.getInitialTraceSegment().getChildren(); + assertEquals(1, children.size()); + TraceSegment trace = children.stream() + .filter(t -> traceName.equals(t.getName())) + .findFirst() + .orElse(null); + assertNotNull(trace); + assertEquals(traceName, trace.getName()); + assertEquals("aws_kinesis_delivery_streams", trace.getTracerAttributes().get("cloud.platform")); + assertEquals(expectedArn, trace.getTracerAttributes().get("cloud.resource_id")); + } + + // This mock SdkAsyncHttpClient allows testing the AWS SDK without making actual HTTP requests. + private static class AsyncHttpClient implements SdkAsyncHttpClient { + private ExecutableHttpRequest executableMock; + private HttpExecuteResponse response; + private SdkHttpFullResponse httpResponse; + + public AsyncHttpClient() { + executableMock = mock(ExecutableHttpRequest.class); + response = mock(HttpExecuteResponse.class, Mockito.RETURNS_DEEP_STUBS); + httpResponse = mock(SdkHttpFullResponse.class, Mockito.RETURNS_DEEP_STUBS); + when(response.httpResponse()).thenReturn(httpResponse); + when(httpResponse.toBuilder().content(any()).build()).thenReturn(httpResponse); + when(httpResponse.isSuccessful()).thenReturn(true); + AbortableInputStream inputStream = AbortableInputStream.create(new StringInputStream("Dont panic")); + when(httpResponse.content()).thenReturn(Optional.of(inputStream)); + try { + when(executableMock.call()).thenReturn(response); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() { + } + + @Override + public CompletableFuture execute(AsyncExecuteRequest asyncExecuteRequest) { + asyncExecuteRequest.responseHandler().onStream(new EmptyPublisher<>()); + return new CompletableFuture<>(); + } + + public HttpExecuteResponse getResponse() { + return response; + } + } + + private static class CredProvider implements AwsCredentialsProvider { + @Override + public AwsCredentials resolveCredentials() { + AwsCredentials credentials = mock(AwsCredentials.class); + when(credentials.accessKeyId()).thenReturn("accessKeyId"); + when(credentials.secretAccessKey()).thenReturn("secretAccessKey"); + return credentials; + } + } +} diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/java/software/amazon/awssdk/services/firehose/DefaultFirehoseClientTest.java b/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/java/software/amazon/awssdk/services/firehose/DefaultFirehoseClientTest.java new file mode 100644 index 0000000000..565c56cf94 --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/java/software/amazon/awssdk/services/firehose/DefaultFirehoseClientTest.java @@ -0,0 +1,221 @@ +package software.amazon.awssdk.services.firehose; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.agent.introspec.InstrumentationTestConfig; +import com.newrelic.agent.introspec.InstrumentationTestRunner; +import com.newrelic.agent.introspec.Introspector; +import com.newrelic.agent.introspec.SpanEvent; +import com.newrelic.agent.introspec.TraceSegment; +import com.newrelic.agent.introspec.TransactionTrace; +import com.newrelic.api.agent.CloudAccountInfo; +import com.newrelic.api.agent.Trace; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.http.AbortableInputStream; +import software.amazon.awssdk.http.ExecutableHttpRequest; +import software.amazon.awssdk.http.HttpExecuteRequest; +import software.amazon.awssdk.http.HttpExecuteResponse; +import software.amazon.awssdk.http.SdkHttpClient; +import software.amazon.awssdk.http.SdkHttpFullResponse; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.firehose.model.CreateDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DeleteDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.DescribeDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.ListDeliveryStreamsRequest; +import software.amazon.awssdk.services.firehose.model.ListTagsForDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordBatchRequest; +import software.amazon.awssdk.services.firehose.model.PutRecordRequest; +import software.amazon.awssdk.services.firehose.model.StartDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.StopDeliveryStreamEncryptionRequest; +import software.amazon.awssdk.services.firehose.model.TagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.UntagDeliveryStreamRequest; +import software.amazon.awssdk.services.firehose.model.UpdateDestinationRequest; +import software.amazon.awssdk.utils.StringInputStream; + +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(InstrumentationTestRunner.class) +@InstrumentationTestConfig(includePrefixes = {"software.amazon.awssdk"}, configName = "dt_enabled.yml") +public class DefaultFirehoseClientTest { + + public static final String ACCOUNT_ID = "111111111111"; + public static final String DELIVERY_STREAM_NAME = "stream-name"; + public static final String DELIVERY_STREAM_ARN = "arn:aws:firehose:us-east-1:111111111111:deliverystream/stream-name"; + public FirehoseClient firehoseClient; + public HttpExecuteResponse response; + + @Before + public void setup() { + MockHttpClient mockHttpClient = new MockHttpClient(); + response = mockHttpClient.getResponse(); + firehoseClient = FirehoseClient.builder() + .httpClient(mockHttpClient) + .credentialsProvider(new DefaultFirehoseClientTest.CredProvider()) + .region(Region.US_EAST_1) + .build(); + AgentBridge.cloud.setAccountInfo(firehoseClient, CloudAccountInfo.AWS_ACCOUNT_ID, ACCOUNT_ID); + } + + @Test + public void testCreateDeliveryStream() { + txn(() -> firehoseClient.createDeliveryStream(CreateDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/createDeliveryStream/stream-name", DELIVERY_STREAM_ARN, true); + } + + @Test + public void testDeleteDeliveryStream() { + txn(() -> firehoseClient.deleteDeliveryStream(DeleteDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/deleteDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testDescribeDeliveryStream() { + txn(() -> firehoseClient.describeDeliveryStream(DescribeDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/describeDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testListDeliveryStreams() { + txn(() -> firehoseClient.listDeliveryStreams(ListDeliveryStreamsRequest.builder().build())); + assertFirehoseTrace("Firehose/listDeliveryStreams", null, false); + } + + @Test + public void testListTagsForDeliveryStream() { + txn(() -> firehoseClient.listTagsForDeliveryStream(ListTagsForDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/listTagsForDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testPutRecord() { + txn(() -> firehoseClient.putRecord(PutRecordRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/putRecord/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testPutRecordBatch() { + txn(() -> firehoseClient.putRecordBatch(PutRecordBatchRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/putRecordBatch/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testStartDeliveryStreamEncryption() { + txn(() -> firehoseClient.startDeliveryStreamEncryption(StartDeliveryStreamEncryptionRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/startDeliveryStreamEncryption/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testStopDeliveryStreamEncryption() { + txn(() -> firehoseClient.stopDeliveryStreamEncryption(StopDeliveryStreamEncryptionRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/stopDeliveryStreamEncryption/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testTagDeliveryStream() { + txn(() -> firehoseClient.tagDeliveryStream(TagDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/tagDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testUnTagDeliveryStream() { + txn(() -> firehoseClient.untagDeliveryStream(UntagDeliveryStreamRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/untagDeliveryStream/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Test + public void testUpdateDestination() { + txn(() -> firehoseClient.updateDestination(UpdateDestinationRequest.builder().deliveryStreamName(DELIVERY_STREAM_NAME).build())); + assertFirehoseTrace("Firehose/updateDestination/stream-name", DELIVERY_STREAM_ARN, false); + } + + @Trace(dispatcher = true) + private void txn(Runnable runnable) { + runnable.run(); + } + + private void assertFirehoseTrace(String traceName, String expectedArn, boolean assertSpan) { + Introspector introspector = InstrumentationTestRunner.getIntrospector(); + if (assertSpan) { + // Span events fail to be generated when enough transactions are done in succession + SpanEvent kinesisSpan = introspector.getSpanEvents().stream() + .filter(span -> traceName.equals(span.getName())) + .findFirst().orElse(null); + assertNotNull(kinesisSpan); + assertEquals("aws_kinesis_delivery_streams", kinesisSpan.getAgentAttributes().get("cloud.platform")); + assertEquals(expectedArn, kinesisSpan.getAgentAttributes().get("cloud.resource_id")); + } + Collection transactionTraces = introspector.getTransactionTracesForTransaction( + "OtherTransaction/Custom/software.amazon.awssdk.services.firehose.DefaultFirehoseClientTest/txn"); + TransactionTrace transactionTrace = transactionTraces.iterator().next(); + List children = transactionTrace.getInitialTraceSegment().getChildren(); + assertEquals(1, children.size()); + TraceSegment trace = children.stream() + .filter(t -> traceName.equals(t.getName())) + .findFirst() + .orElse(null); + assertNotNull(trace); + assertEquals(traceName, trace.getName()); + assertEquals("aws_kinesis_delivery_streams", trace.getTracerAttributes().get("cloud.platform")); + assertEquals(expectedArn, trace.getTracerAttributes().get("cloud.resource_id")); + } + + // This mock SdkAsyncHttpClient allows testing the AWS SDK without making actual HTTP requests. + private static class MockHttpClient implements SdkHttpClient { + private final ExecutableHttpRequest executableMock; + private final HttpExecuteResponse response; + private final SdkHttpFullResponse httpResponse; + + public MockHttpClient() { + executableMock = mock(ExecutableHttpRequest.class); + response = mock(HttpExecuteResponse.class, Mockito.RETURNS_DEEP_STUBS); + httpResponse = mock(SdkHttpFullResponse.class, Mockito.RETURNS_DEEP_STUBS); + when(response.httpResponse()).thenReturn(httpResponse); + when(httpResponse.toBuilder().content(any()).build()).thenReturn(httpResponse); + when(httpResponse.isSuccessful()).thenReturn(true); + AbortableInputStream inputStream = AbortableInputStream.create(new StringInputStream("42")); + when(httpResponse.content()).thenReturn(Optional.of(inputStream)); + try { + when(executableMock.call()).thenReturn(response); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void close() { + } + + @Override + public ExecutableHttpRequest prepareRequest(HttpExecuteRequest httpExecuteRequest) { + return executableMock; + } + + public HttpExecuteResponse getResponse() { + return response; + } + } + + private static class CredProvider implements AwsCredentialsProvider { + @Override + public AwsCredentials resolveCredentials() { + AwsCredentials credentials = mock(AwsCredentials.class); + when(credentials.accessKeyId()).thenReturn("accessKeyId"); + when(credentials.secretAccessKey()).thenReturn("secretAccessKey"); + return credentials; + } + } +} diff --git a/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/resources/dt_enabled.yml b/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/resources/dt_enabled.yml new file mode 100644 index 0000000000..53b0968002 --- /dev/null +++ b/instrumentation/aws-java-sdk-firehose-2.1.0/src/test/resources/dt_enabled.yml @@ -0,0 +1,5 @@ +common: &default_settings + distributed_tracing: + enabled: true + span_events: + enabled: true \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b9ce71b3d6..a9088d8229 100644 --- a/settings.gradle +++ b/settings.gradle @@ -72,6 +72,7 @@ include 'instrumentation:anorm-2.4' include 'instrumentation:aws-bedrock-runtime-2.20' include 'instrumentation:aws-java-sdk-dynamodb-1.11.106' include 'instrumentation:aws-java-sdk-dynamodb-2.15.34' +include 'instrumentation:aws-java-sdk-firehose-2.1.0' include 'instrumentation:aws-java-sdk-kinesis-1.11.106' include 'instrumentation:aws-java-sdk-kinesis-1.11.272' include 'instrumentation:aws-java-sdk-kinesis-2.1.0'