Skip to content

NullPointerException from SnsInterceptor when publishing an SNS batch without a topic ARN #12480

Description

@anjeongkyun

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions