Skip to content

Commit 8e86faf

Browse files
committed
Avoid Metadata.key allocations on grpc
1 parent 710ca87 commit 8e86faf

6 files changed

Lines changed: 47 additions & 8 deletions

File tree

dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/client/GrpcInjectAdapter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package datadog.trace.instrumentation.armeria.grpc.client;
22

33
import datadog.context.propagation.CarrierSetter;
4+
import datadog.trace.api.cache.DDCache;
5+
import datadog.trace.api.cache.DDCaches;
46
import io.grpc.Metadata;
7+
import java.util.function.Function;
58
import javax.annotation.ParametersAreNonnullByDefault;
69

710
@ParametersAreNonnullByDefault
811
public final class GrpcInjectAdapter implements CarrierSetter<Metadata> {
12+
private static final Function<String, Metadata.Key<String>> KEY_MAKER =
13+
key -> Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
14+
private static final DDCache<String, Metadata.Key<String>> KEY_CACHE =
15+
DDCaches.newFixedSizeCache(64);
916

1017
public static final GrpcInjectAdapter SETTER = new GrpcInjectAdapter();
1118

1219
@Override
1320
public void set(final Metadata carrier, final String key, final String value) {
14-
Metadata.Key<String> metadataKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
21+
Metadata.Key<String> metadataKey = KEY_CACHE.computeIfAbsent(key, KEY_MAKER);
1522
if (carrier.containsKey(metadataKey)) {
1623
carrier.removeAll(
1724
metadataKey); // Remove existing to ensure identical behavior with other carriers

dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/GrpcExtractAdapter.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
package datadog.trace.instrumentation.armeria.grpc.server;
22

3+
import datadog.trace.api.cache.DDCache;
4+
import datadog.trace.api.cache.DDCaches;
35
import datadog.trace.bootstrap.instrumentation.api.AgentPropagation;
46
import io.grpc.Metadata;
7+
import java.util.function.Function;
58

69
public final class GrpcExtractAdapter implements AgentPropagation.ContextVisitor<Metadata> {
10+
private static final Function<String, Metadata.Key<String>> KEY_MAKER =
11+
key -> Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
12+
private static final DDCache<String, Metadata.Key<String>> KEY_CACHE =
13+
DDCaches.newFixedSizeCache(64);
714

815
public static final GrpcExtractAdapter GETTER = new GrpcExtractAdapter();
916

1017
@Override
1118
public void forEachKey(Metadata carrier, AgentPropagation.KeyClassifier classifier) {
1219
for (String key : carrier.keys()) {
1320
if (!key.endsWith(Metadata.BINARY_HEADER_SUFFIX) && !key.startsWith(":")) {
14-
if (!classifier.accept(
15-
key, carrier.get(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)))) {
21+
if (!classifier.accept(key, carrier.get(KEY_CACHE.computeIfAbsent(key, KEY_MAKER)))) {
1622
return;
1723
}
1824
}

dd-java-agent/instrumentation/armeria/armeria-grpc-0.84/src/main/java/datadog/trace/instrumentation/armeria/grpc/server/TracingServerInterceptor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import static datadog.trace.instrumentation.armeria.grpc.server.GrpcServerDecorator.SERVER_PATHWAY_EDGE_TAGS;
1313

1414
import datadog.trace.api.Config;
15+
import datadog.trace.api.cache.DDCache;
16+
import datadog.trace.api.cache.DDCaches;
1517
import datadog.trace.api.function.TriConsumer;
1618
import datadog.trace.api.function.TriFunction;
1719
import datadog.trace.api.gateway.CallbackProvider;
@@ -43,6 +45,10 @@
4345
import javax.annotation.Nonnull;
4446

4547
public class TracingServerInterceptor implements ServerInterceptor {
48+
private static final Function<String, Metadata.Key<String>> KEY_MAKER =
49+
key -> Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
50+
private static final DDCache<String, Metadata.Key<String>> KEY_CACHE =
51+
DDCaches.newFixedSizeCache(64);
4652

4753
public static final TracingServerInterceptor INSTANCE = new TracingServerInterceptor();
4854
private static final Set<String> IGNORED_METHODS = Config.get().getGrpcIgnoredInboundMethods();
@@ -294,7 +300,7 @@ private static void callIGCallbackHeaders(
294300
}
295301
for (String key : metadata.keys()) {
296302
if (!key.endsWith(Metadata.BINARY_HEADER_SUFFIX) && !key.startsWith(":")) {
297-
Metadata.Key<String> mdKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
303+
Metadata.Key<String> mdKey = KEY_CACHE.computeIfAbsent(key, KEY_MAKER);
298304
for (String value : metadata.getAll(mdKey)) {
299305
headerCb.accept(reqCtx, key, value);
300306
}

dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/GrpcInjectAdapter.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package datadog.trace.instrumentation.grpc.client;
22

33
import datadog.context.propagation.CarrierSetter;
4+
import datadog.trace.api.cache.DDCache;
5+
import datadog.trace.api.cache.DDCaches;
46
import io.grpc.Metadata;
7+
import java.util.function.Function;
58
import javax.annotation.ParametersAreNonnullByDefault;
69

710
@ParametersAreNonnullByDefault
811
public final class GrpcInjectAdapter implements CarrierSetter<Metadata> {
12+
private static final Function<String, Metadata.Key<String>> KEY_MAKER =
13+
key -> Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
14+
private static final DDCache<String, Metadata.Key<String>> KEY_CACHE =
15+
DDCaches.newFixedSizeCache(64);
16+
917
public static final GrpcInjectAdapter SETTER = new GrpcInjectAdapter();
1018

1119
@Override
1220
public void set(final Metadata carrier, final String key, final String value) {
13-
Metadata.Key<String> metadataKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
21+
Metadata.Key<String> metadataKey = KEY_CACHE.computeIfAbsent(key, KEY_MAKER);
1422
if (carrier.containsKey(metadataKey)) {
1523
carrier.removeAll(
1624
metadataKey); // Remove existing to ensure identical behavior with other carriers

dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/GrpcExtractAdapter.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
package datadog.trace.instrumentation.grpc.server;
22

3+
import datadog.trace.api.cache.DDCache;
4+
import datadog.trace.api.cache.DDCaches;
35
import datadog.trace.bootstrap.instrumentation.api.AgentPropagation;
46
import io.grpc.Metadata;
7+
import java.util.function.Function;
58

69
public final class GrpcExtractAdapter implements AgentPropagation.ContextVisitor<Metadata> {
10+
private static final Function<String, Metadata.Key<String>> KEY_MAKER =
11+
key -> Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
12+
private static final DDCache<String, Metadata.Key<String>> KEY_CACHE =
13+
DDCaches.newFixedSizeCache(64);
714

815
public static final GrpcExtractAdapter GETTER = new GrpcExtractAdapter();
916

1017
@Override
1118
public void forEachKey(Metadata carrier, AgentPropagation.KeyClassifier classifier) {
1219
for (String key : carrier.keys()) {
1320
if (!key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) {
14-
if (!classifier.accept(
15-
key, carrier.get(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER)))) {
21+
if (!classifier.accept(key, carrier.get(KEY_CACHE.computeIfAbsent(key, KEY_MAKER)))) {
1622
return;
1723
}
1824
}

dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/TracingServerInterceptor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import static datadog.trace.instrumentation.grpc.server.GrpcServerDecorator.SERVER_PATHWAY_EDGE_TAGS;
1414

1515
import datadog.trace.api.Config;
16+
import datadog.trace.api.cache.DDCache;
17+
import datadog.trace.api.cache.DDCaches;
1618
import datadog.trace.api.function.TriConsumer;
1719
import datadog.trace.api.function.TriFunction;
1820
import datadog.trace.api.gateway.CallbackProvider;
@@ -44,6 +46,10 @@
4446
import javax.annotation.Nonnull;
4547

4648
public class TracingServerInterceptor implements ServerInterceptor {
49+
private static final Function<String, Metadata.Key<String>> KEY_MAKER =
50+
key -> Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
51+
private static final DDCache<String, Metadata.Key<String>> KEY_CACHE =
52+
DDCaches.newFixedSizeCache(64);
4753

4854
public static final TracingServerInterceptor INSTANCE = new TracingServerInterceptor();
4955
private static final Set<String> IGNORED_METHODS = Config.get().getGrpcIgnoredInboundMethods();
@@ -295,7 +301,7 @@ private static void callIGCallbackHeaders(
295301
}
296302
for (String key : metadata.keys()) {
297303
if (!key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) {
298-
Metadata.Key<String> mdKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
304+
Metadata.Key<String> mdKey = KEY_CACHE.computeIfAbsent(key, KEY_MAKER);
299305
for (String value : metadata.getAll(mdKey)) {
300306
headerCb.accept(reqCtx, key, value);
301307
}

0 commit comments

Comments
 (0)