Skip to content

Commit 47b5654

Browse files
committed
Small improvement to agent feedback sampling
Previously, I updated this code to be case-insensitive. In doing so, I introduced a call to String.toLowerCase which had a negative impact on response time and allocation. By switching to TreeMap, I can use String::compareToIgnoreCase which avoids the allocation and has a better average complexity than toLowerCase. This change provides a 1-1.5% improvement in a span creation throughput stress tests.
1 parent d5592c6 commit 47b5654

File tree

1 file changed

+13
-18
lines changed

1 file changed

+13
-18
lines changed

dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package datadog.trace.common.sampling;
22

3-
import datadog.trace.api.cache.DDCache;
4-
import datadog.trace.api.cache.DDCaches;
5-
import datadog.trace.api.sampling.PrioritySampling;
63
import datadog.trace.api.sampling.SamplingMechanism;
74
import datadog.trace.common.writer.RemoteResponseListener;
85
import datadog.trace.core.CoreSpan;
9-
import java.util.HashMap;
6+
import java.util.Collections;
107
import java.util.Map;
8+
import java.util.TreeMap;
9+
1110
import java.util.function.Function;
1211
import org.slf4j.Logger;
1312
import org.slf4j.LoggerFactory;
@@ -71,8 +70,8 @@ public void onResponse(
7170
}
7271

7372
log.debug("Update service sampler rates: {} -> {}", endpoint, responseJson);
74-
final Map<String, Map<String, RateSampler>> updatedEnvServiceRates =
75-
new HashMap<>(newServiceRates.size() * 2);
73+
final TreeMap<String, TreeMap<String, RateSampler>> updatedEnvServiceRates =
74+
new TreeMap<>(String::compareToIgnoreCase);
7675

7776
RateSampler fallbackSampler = RateSamplersByEnvAndService.DEFAULT_SAMPLER;
7877
for (final Map.Entry<String, Number> entry : newServiceRates.entrySet()) {
@@ -87,7 +86,7 @@ public void onResponse(
8786
} else {
8887
Map<String, RateSampler> serviceRates =
8988
updatedEnvServiceRates.computeIfAbsent(
90-
envAndService.lowerEnv, env -> new HashMap<>(newServiceRates.size() * 2));
89+
envAndService.lowerEnv, env -> new TreeMap<>(String::compareToIgnoreCase));
9190

9291
serviceRates.computeIfAbsent(
9392
envAndService.lowerService,
@@ -114,38 +113,34 @@ private static RateSampler createRateSampler(final double sampleRate) {
114113
private static final class RateSamplersByEnvAndService {
115114
private static final RateSampler DEFAULT_SAMPLER = createRateSampler(DEFAULT_RATE);
116115

117-
private final Map<String, Map<String, RateSampler>> envServiceRates;
116+
private final Map<String, TreeMap<String, RateSampler>> envServiceRates;
118117
private final RateSampler fallbackSampler;
119118

120119
RateSamplersByEnvAndService() {
121-
this(new HashMap<>(0), DEFAULT_SAMPLER);
120+
this(Collections.emptyMap(), DEFAULT_SAMPLER);
122121
}
123122

124123
RateSamplersByEnvAndService(
125-
Map<String, Map<String, RateSampler>> envServiceRates, RateSampler fallbackSampler) {
124+
Map<String, TreeMap<String, RateSampler>> envServiceRates, RateSampler fallbackSampler) {
126125
this.envServiceRates = envServiceRates;
127126
this.fallbackSampler = fallbackSampler;
128127
}
129128

130129
// used in tests only
131130
RateSampler getSampler(EnvAndService envAndService) {
132-
return getSamplerImpl(envAndService.lowerEnv, envAndService.lowerService);
131+
return getSampler(envAndService.lowerEnv, envAndService.lowerService);
133132
}
134133

135134
public RateSampler getSampler(String env, String service) {
136-
return getSamplerImpl(env.toLowerCase(), service.toLowerCase());
137-
}
138-
139-
private RateSampler getSamplerImpl(String lowerEnv, String lowerService) {
140-
if (EnvAndService.isFallback(lowerEnv, lowerService)) {
135+
if (EnvAndService.isFallback(env, service)) {
141136
return fallbackSampler;
142137
}
143138

144-
Map<String, RateSampler> serviceRates = envServiceRates.get(lowerEnv);
139+
Map<String, RateSampler> serviceRates = envServiceRates.get(env);
145140
if (serviceRates == null) {
146141
return fallbackSampler;
147142
}
148-
RateSampler sampler = serviceRates.get(lowerService);
143+
RateSampler sampler = serviceRates.get(service);
149144
return null == sampler ? fallbackSampler : sampler;
150145
}
151146
}

0 commit comments

Comments
 (0)