Skip to content

Commit

Permalink
performance improvements to kinesis instrumentation
Browse files Browse the repository at this point in the history
  • Loading branch information
obenkenobi committed Oct 30, 2024
1 parent f3fbc84 commit b1111e9
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

package com.newrelic.agent.bridge;

import com.newrelic.api.agent.Cloud;
import com.newrelic.api.agent.Logs;
import com.newrelic.api.agent.NewRelic;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ public class KinesisUtil {

public static final Map<AmazonWebServiceRequest, Token> requestTokenMap = AgentBridge.collectionFactory.createConcurrentWeakKeyedMap();

private static final Function<StreamRawData, StreamProcessedData> CACHE =
AgentBridge.collectionFactory.createAccessTimeBasedCache(3600, 8, KinesisUtil::processStreamData);
private static final Function<StreamRawData, String> ARN_CACHE =
AgentBridge.collectionFactory.createAccessTimeBasedCache(3600, 8, KinesisUtil::createArn);
private KinesisUtil() {}

public static String getRegion(String serviceName, URI endpoint, String overrideRegion) {
Expand All @@ -44,8 +44,8 @@ public static void setTraceInformation(String kinesisOperation, AmazonWebService
Token token = KinesisUtil.getToken(request);
if (token != null) {
token.linkAndExpire();
KinesisUtil.cleanToken(request);
}
KinesisUtil.cleanToken(request);
TracedMethod tracedMethod = NewRelic.getAgent().getTransaction().getTracedMethod();
KinesisUtil.setTraceDetails(kinesisOperation, tracedMethod, streamRawData);
}
Expand All @@ -70,7 +70,7 @@ public static void setTraceDetails(String kinesisOperation, TracedMethod tracedM
}

public static String createTraceName(String kinesisOperation, StreamRawData streamRawData) {
String streamName = CACHE.apply(streamRawData).getStreamName();
String streamName = streamRawData.getStreamName();
if (streamName != null && !streamName.isEmpty()) {
return kinesisOperation + "/" + streamName;
}
Expand All @@ -79,17 +79,11 @@ public static String createTraceName(String kinesisOperation, StreamRawData stre

public static CloudParameters createCloudParams(StreamRawData streamRawData) {
return CloudParameters.provider(PLATFORM)
.resourceId(CACHE.apply(streamRawData).getCloudResourceId())
.resourceId(ARN_CACHE.apply(streamRawData))
.build();
}

public static StreamProcessedData processStreamData(StreamRawData streamRawData) {
String cloudResourceId = createCloudResourceId(streamRawData);
String streamName = streamRawData.getStreamName();
return new StreamProcessedData(streamName, cloudResourceId);
}

public static String createCloudResourceId(StreamRawData streamRawData) {
public static String createArn(StreamRawData streamRawData) {
String accountId = streamRawData.getAccountId();
if (accountId == null || accountId.isEmpty()) {
return null;
Expand All @@ -105,7 +99,7 @@ public static String createCloudResourceId(StreamRawData streamRawData) {
return null;
}

return "arn:aws:kinesis:" + region + ':' + accountId + ":stream/" + streamRawData.getStreamName();
return "arn:aws:kinesis:" + region + ':' + accountId + ":stream/" + streamName;
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,25 @@
import com.newrelic.agent.bridge.AgentBridge;
import com.newrelic.api.agent.CloudAccountInfo;

import java.lang.ref.WeakReference;
import java.util.Objects;

public class StreamRawData {
private final String streamName;
private final Object client;
private final WeakReference<Object> client;
private final String region;

public StreamRawData(String streamName, Object client, String region) {
this.streamName = streamName;
this.client = client;
this.client = new WeakReference<>(client);
this.region = region;
}

public String getStreamName() {
return streamName;
}
public String getAccountId() {
return AgentBridge.cloud.getAccountInfo(client, CloudAccountInfo.AWS_ACCOUNT_ID);
return AgentBridge.cloud.getAccountInfo(client.get(), CloudAccountInfo.AWS_ACCOUNT_ID);
}

public String getRegion() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public class KinesisUtil {

public static final Map<AmazonWebServiceRequest, Token> requestTokenMap = AgentBridge.collectionFactory.createConcurrentWeakKeyedMap();

private static final Function<StreamRawData, StreamProcessedData> CACHE =
AgentBridge.collectionFactory.createAccessTimeBasedCache(3600, 8, KinesisUtil::processStreamData);
private static final Function<StreamRawData, String> ARN_CACHE =
AgentBridge.collectionFactory.createAccessTimeBasedCache(3600, 8, KinesisUtil::createArn);
private KinesisUtil() {}

public static void setTokenForRequest(AmazonWebServiceRequest request) {
Expand All @@ -34,8 +34,8 @@ public static void setTraceInformation(String kinesisOperation, AmazonWebService
Token token = KinesisUtil.getToken(request);
if (token != null) {
token.linkAndExpire();
KinesisUtil.cleanToken(request);
}
KinesisUtil.cleanToken(request);
TracedMethod tracedMethod = NewRelic.getAgent().getTransaction().getTracedMethod();
KinesisUtil.setTraceDetails(kinesisOperation, tracedMethod, streamRawData);
}
Expand All @@ -60,7 +60,7 @@ public static void setTraceDetails(String kinesisOperation, TracedMethod tracedM
}

public static String createTraceName(String kinesisOperation, StreamRawData streamRawData) {
String streamName = CACHE.apply(streamRawData).getStreamName();
String streamName = streamRawData.getStreamName();
if (streamName != null && !streamName.isEmpty()) {
return kinesisOperation + "/" + streamName;
}
Expand All @@ -69,17 +69,11 @@ public static String createTraceName(String kinesisOperation, StreamRawData stre

public static CloudParameters createCloudParams(StreamRawData streamRawData) {
return CloudParameters.provider(PLATFORM)
.resourceId(CACHE.apply(streamRawData).getCloudResourceId())
.resourceId(ARN_CACHE.apply(streamRawData))
.build();
}

public static StreamProcessedData processStreamData(StreamRawData streamRawData) {
String cloudResourceId = createCloudResourceId(streamRawData);
String streamName = streamRawData.getStreamName();
return new StreamProcessedData(streamName, cloudResourceId);
}

public static String createCloudResourceId(StreamRawData streamRawData) {
public static String createArn(StreamRawData streamRawData) {
String accountId = streamRawData.getAccountId();
if (accountId == null || accountId.isEmpty()) {
return null;
Expand All @@ -95,7 +89,7 @@ public static String createCloudResourceId(StreamRawData streamRawData) {
return null;
}

return "arn:aws:kinesis:" + region + ':' + accountId + ":stream/" + streamRawData.getStreamName();
return "arn:aws:kinesis:" + region + ':' + accountId + ":stream/" + streamName;
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,25 @@
import com.newrelic.agent.bridge.AgentBridge;
import com.newrelic.api.agent.CloudAccountInfo;

import java.lang.ref.WeakReference;
import java.util.Objects;

public class StreamRawData {
private final String streamName;
private final Object client;
private final WeakReference<Object> client;
private final String region;

public StreamRawData(String streamName, Object client, String region) {
this.streamName = streamName;
this.client = client;
this.client = new WeakReference<>(client);
this.region = region;
}

public String getStreamName() {
return streamName;
}
public String getAccountId() {
return AgentBridge.cloud.getAccountInfo(client, CloudAccountInfo.AWS_ACCOUNT_ID);
return AgentBridge.cloud.getAccountInfo(client.get(), CloudAccountInfo.AWS_ACCOUNT_ID);
}

public String getRegion() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,20 @@
import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
import software.amazon.awssdk.regions.Region;

import java.lang.ref.WeakReference;
import java.util.Objects;

public class StreamRawData {
private final String streamName;
private final String providedArn;
private final Object client;
private final SdkClientConfiguration config;
private final WeakReference<Object> clientRef;
private final WeakReference<SdkClientConfiguration> configRef;

public StreamRawData(String streamName, String providedArn, Object client, SdkClientConfiguration config) {
this.streamName = streamName;
this.providedArn = providedArn;
this.client = client;
this.config = config;
this.clientRef = new WeakReference<>(client);
this.configRef = new WeakReference<>(config);
}

public String getStreamName() {
Expand All @@ -30,15 +31,19 @@ public String getProvidedArn() {
}

public String getAccountId() {
return AgentBridge.cloud.getAccountInfo(client, CloudAccountInfo.AWS_ACCOUNT_ID);
return AgentBridge.cloud.getAccountInfo(clientRef.get(), CloudAccountInfo.AWS_ACCOUNT_ID);
}

public String getRegion() {
SdkClientConfiguration config = configRef.get();
if (config == null) {
return null;
}
Region option = config.option(AwsClientOption.AWS_REGION);
if (option == null) {
return null;
}
return config.option(AwsClientOption.AWS_REGION).toString();
return option.toString();
}

@Override
Expand All @@ -52,13 +57,13 @@ public boolean equals(Object o) {
StreamRawData that = (StreamRawData) o;
return Objects.equals(streamName, that.streamName) &&
Objects.equals(providedArn, that.providedArn) &&
Objects.equals(client, that.client) &&
Objects.equals(clientRef, that.clientRef) &&
// config uses Object.equals, so should be fast
Objects.equals(config, that.config);
Objects.equals(configRef, that.configRef);
}

@Override
public int hashCode() {
return Objects.hash(streamName, providedArn, client, config);
return Objects.hash(streamName, providedArn, clientRef, configRef);
}
}

0 comments on commit b1111e9

Please sign in to comment.