Tracer Version(s)
1.66.0
Java Version(s)
25.0.2
JVM Vendor
Eclipse Adoptium / Temurin
Bug Report
SnsInterceptor derives the DSM topic name from the topic ARN. The single-publish path handles a missing ARN, because a publish to a phone number has neither topicArn nor targetArn:
String snsTopicArn = request.topicArn();
if (null == snsTopicArn) {
snsTopicArn = request.targetArn();
if (null == snsTopicArn) {
return context.request();
}
}
The batch path dereferences it straight away:
String snsTopicArn = request.topicArn();
String snsTopicName = snsTopicArn.substring(snsTopicArn.lastIndexOf(':') + 1);
PublishBatchRequest builds without a topic ARN, and the interceptor runs before marshalling, so a request that the SDK would have rejected with a validation error instead dies with an NPE thrown from the agent. Neither SDK wraps exceptions from modifyRequest (v2) or beforeMarshalling (v1), so it reaches the caller as-is:
java.lang.NullPointerException: Cannot invoke "String.lastIndexOf(int)" because "snsTopicArn" is null
at datadog.trace.instrumentation.aws.v2.sns.SnsInterceptor.modifyRequest
Both the v1 and v2 interceptors have it. I checked the other ARN parsing in the aws-java modules while I was there: AwsSdkClientDecorator guards it in v1 (if (null != topicArn)) and uses Optional.map in v2, so these two batch branches were the only unguarded ones.
Fix is up as #12457. It skips the injection and leaves the request alone, matching what the single-publish path already does. Tests mirror the existing SNS message to phone number doesn't leak exception case, and the aws-java-sns-1.0 and aws-java-sns-2.0 test tasks pass.
Filing this as an issue as well so it can be triaged and labelled. I can't set the inst:/type: labels on the PR myself.
Expected Behavior
A batch publish without a topic ARN should fail the way the SDK would fail it on its own, with a validation error. The agent should not turn it into an NPE.
Reproduction Code
SnsClient client = SnsClient.builder()
.endpointOverride(URI.create("http://localhost:4566"))
.region(Region.US_EAST_1)
.build();
client.publishBatch(PublishBatchRequest.builder()
.publishBatchRequestEntries(
PublishBatchRequestEntry.builder().id("1").message("hello").build())
.build());
With the agent attached this throws NullPointerException from SnsInterceptor. Without it, the SDK reports the missing topic.
Tracer Version(s)
1.66.0
Java Version(s)
25.0.2
JVM Vendor
Eclipse Adoptium / Temurin
Bug Report
SnsInterceptorderives the DSM topic name from the topic ARN. The single-publish path handles a missing ARN, because a publish to a phone number has neithertopicArnnortargetArn:The batch path dereferences it straight away:
PublishBatchRequestbuilds without a topic ARN, and the interceptor runs before marshalling, so a request that the SDK would have rejected with a validation error instead dies with an NPE thrown from the agent. Neither SDK wraps exceptions frommodifyRequest(v2) orbeforeMarshalling(v1), so it reaches the caller as-is:Both the v1 and v2 interceptors have it. I checked the other ARN parsing in the aws-java modules while I was there:
AwsSdkClientDecoratorguards it in v1 (if (null != topicArn)) and usesOptional.mapin v2, so these two batch branches were the only unguarded ones.Fix is up as #12457. It skips the injection and leaves the request alone, matching what the single-publish path already does. Tests mirror the existing
SNS message to phone number doesn't leak exceptioncase, and theaws-java-sns-1.0andaws-java-sns-2.0test tasks pass.Filing this as an issue as well so it can be triaged and labelled. I can't set the
inst:/type:labels on the PR myself.Expected Behavior
A batch publish without a topic ARN should fail the way the SDK would fail it on its own, with a validation error. The agent should not turn it into an NPE.
Reproduction Code
With the agent attached this throws
NullPointerExceptionfromSnsInterceptor. Without it, the SDK reports the missing topic.