diff --git a/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java b/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java index a0f4a6bd37d..52957b643a0 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/sampling/RateByServiceTraceSampler.java @@ -6,8 +6,9 @@ import datadog.trace.api.sampling.SamplingMechanism; import datadog.trace.common.writer.RemoteResponseListener; import datadog.trace.core.CoreSpan; -import java.util.HashMap; +import java.util.Collections; import java.util.Map; +import java.util.TreeMap; import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,8 +72,8 @@ public void onResponse( } log.debug("Update service sampler rates: {} -> {}", endpoint, responseJson); - final Map> updatedEnvServiceRates = - new HashMap<>(newServiceRates.size() * 2); + final TreeMap> updatedEnvServiceRates = + new TreeMap<>(String::compareToIgnoreCase); RateSampler fallbackSampler = RateSamplersByEnvAndService.DEFAULT_SAMPLER; for (final Map.Entry entry : newServiceRates.entrySet()) { @@ -87,7 +88,7 @@ public void onResponse( } else { Map serviceRates = updatedEnvServiceRates.computeIfAbsent( - envAndService.lowerEnv, env -> new HashMap<>(newServiceRates.size() * 2)); + envAndService.lowerEnv, env -> new TreeMap<>(String::compareToIgnoreCase)); serviceRates.computeIfAbsent( envAndService.lowerService, @@ -114,38 +115,34 @@ private static RateSampler createRateSampler(final double sampleRate) { private static final class RateSamplersByEnvAndService { private static final RateSampler DEFAULT_SAMPLER = createRateSampler(DEFAULT_RATE); - private final Map> envServiceRates; + private final Map> envServiceRates; private final RateSampler fallbackSampler; RateSamplersByEnvAndService() { - this(new HashMap<>(0), DEFAULT_SAMPLER); + this(Collections.emptyMap(), DEFAULT_SAMPLER); } RateSamplersByEnvAndService( - Map> envServiceRates, RateSampler fallbackSampler) { + Map> envServiceRates, RateSampler fallbackSampler) { this.envServiceRates = envServiceRates; this.fallbackSampler = fallbackSampler; } // used in tests only RateSampler getSampler(EnvAndService envAndService) { - return getSamplerImpl(envAndService.lowerEnv, envAndService.lowerService); + return getSampler(envAndService.lowerEnv, envAndService.lowerService); } public RateSampler getSampler(String env, String service) { - return getSamplerImpl(env.toLowerCase(), service.toLowerCase()); - } - - private RateSampler getSamplerImpl(String lowerEnv, String lowerService) { - if (EnvAndService.isFallback(lowerEnv, lowerService)) { + if (EnvAndService.isFallback(env, service)) { return fallbackSampler; } - Map serviceRates = envServiceRates.get(lowerEnv); + Map serviceRates = envServiceRates.get(env); if (serviceRates == null) { return fallbackSampler; } - RateSampler sampler = serviceRates.get(lowerService); + RateSampler sampler = serviceRates.get(service); return null == sampler ? fallbackSampler : sampler; } }