From ffdaefb39a2c9d8a0769c46ad659fb139ba02d7c Mon Sep 17 00:00:00 2001 From: Lev Priima Date: Thu, 26 Mar 2020 02:10:43 -0700 Subject: [PATCH 1/5] DD_SERVICE; DD_ENV; DD_VERSION env vars support --- .../trace/agent/test/utils/ConfigUtils.groovy | 8 +- .../main/java/datadog/trace/api/Config.java | 222 +++++++++++------- .../datadog/trace/api/ConfigTest.groovy | 119 +++++++++- .../datadog/opentracing/DDSpanContext.java | 1 - 4 files changed, 256 insertions(+), 94 deletions(-) diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy index c1e31efa693..91a1b3a9f46 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy @@ -19,15 +19,15 @@ class ConfigUtils { assert Modifier.isVolatile(CONFIG_INSTANCE_FIELD.getModifiers()) assert !Modifier.isFinal(CONFIG_INSTANCE_FIELD.getModifiers()) - def existingConfig = Config.get() + def configInstanceFieldValueFromClinit = Config.get() Properties properties = new Properties() properties.put(name, value) - CONFIG_INSTANCE_FIELD.set(null, new Config(properties, existingConfig)) - assert Config.get() != existingConfig + CONFIG_INSTANCE_FIELD.set(null, new Config(properties)) + assert Config.get() != configInstanceFieldValueFromClinit try { return r.call() } finally { - CONFIG_INSTANCE_FIELD.set(null, existingConfig) + CONFIG_INSTANCE_FIELD.set(null, configInstanceFieldValueFromClinit) } } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Config.java b/dd-trace-api/src/main/java/datadog/trace/api/Config.java index 5a5e0b45cdb..4f49ce7f501 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Config.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Config.java @@ -6,6 +6,8 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; @@ -25,6 +27,7 @@ import java.util.UUID; import java.util.regex.Pattern; import lombok.Getter; +import lombok.NonNull; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @@ -64,6 +67,8 @@ public class Config { public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; public static final String SERVICE_MAPPING = "service.mapping"; + private static final String ENV = "env"; + private static final String VERSION = "version"; public static final String TAGS = "tags"; @Deprecated // Use dd.tags instead public static final String GLOBAL_TAGS = "trace.global.tags"; @@ -139,7 +144,8 @@ public class Config { public static final String PROFILING_PROXY_PASSWORD = "profiling.proxy.password"; public static final String RUNTIME_ID_TAG = "runtime-id"; - public static final String SERVICE_TAG = "service"; + private static final String SERVICE = "service"; + public static final String SERVICE_TAG = SERVICE; public static final String HOST_TAG = "host"; public static final String LANGUAGE_TAG_KEY = "language"; public static final String LANGUAGE_TAG_VALUE = "jvm"; @@ -318,8 +324,8 @@ private String profilingProxyPasswordMasker() { private static Properties propertiesFromConfigFile; // Read order: System Properties -> Env Variables, [-> properties file], [-> default value] - // Visible for testing - Config() { + // Visible for testing: groovy tests can access private ctor perfectly fine + private Config() { propertiesFromConfigFile = loadConfigurationFile(); runtimeId = UUID.randomUUID().toString(); @@ -338,7 +344,9 @@ private String profilingProxyPasswordMasker() { } } site = getSettingFromEnvironment(SITE, DEFAULT_SITE); - serviceName = getSettingFromEnvironment(SERVICE_NAME, DEFAULT_SERVICE_NAME); + serviceName = + getSettingFromEnvironment( + SERVICE_NAME, getSettingFromEnvironment(SERVICE, DEFAULT_SERVICE_NAME)); traceEnabled = getBooleanSettingFromEnvironment(TRACE_ENABLED, DEFAULT_TRACE_ENABLED); integrationsEnabled = @@ -357,7 +365,10 @@ private String profilingProxyPasswordMasker() { getBooleanSettingFromEnvironment(TRACE_RESOLVER_ENABLED, DEFAULT_TRACE_RESOLVER_ENABLED); serviceMapping = getMapSettingFromEnvironment(SERVICE_MAPPING, null); - tags = getMapSettingFromEnvironment(TAGS, null); + final Map tagsPreMap = new HashMap<>(getMapSettingFromEnvironment(TAGS, null)); + addPropToMapIfDefinedByEnvironment(tagsPreMap, ENV); + addPropToMapIfDefinedByEnvironment(tagsPreMap, VERSION); + tags = Collections.unmodifiableMap(tagsPreMap); globalTags = getMapSettingFromEnvironment(GLOBAL_TAGS, null); spanTags = getMapSettingFromEnvironment(SPAN_TAGS, null); jmxTags = getMapSettingFromEnvironment(JMX_TAGS, null); @@ -405,17 +416,11 @@ private String profilingProxyPasswordMasker() { RUNTIME_CONTEXT_FIELD_INJECTION, DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION); propagationStylesToExtract = - getEnumSetSettingFromEnvironment( - PROPAGATION_STYLE_EXTRACT, - DEFAULT_PROPAGATION_STYLE_EXTRACT, - PropagationStyle.class, - true); + getEnumSetSettingFromEnvironmentOrDefault( + PROPAGATION_STYLE_EXTRACT, DEFAULT_PROPAGATION_STYLE_EXTRACT); propagationStylesToInject = - getEnumSetSettingFromEnvironment( - PROPAGATION_STYLE_INJECT, - DEFAULT_PROPAGATION_STYLE_INJECT, - PropagationStyle.class, - true); + getEnumSetSettingFromEnvironmentOrDefault( + PROPAGATION_STYLE_INJECT, DEFAULT_PROPAGATION_STYLE_INJECT); jmxFetchEnabled = getBooleanSettingFromEnvironment(JMX_FETCH_ENABLED, DEFAULT_JMX_FETCH_ENABLED); @@ -522,8 +527,9 @@ private String profilingProxyPasswordMasker() { log.debug("New instance: {}", this); } - // Read order: Properties -> Parent - private Config(final Properties properties, final Config parent) { + // Read order: Properties -> Default INSTANCE + private Config(final Properties properties) { + final Config parent = INSTANCE; runtimeId = parent.runtimeId; apiKey = properties.getProperty(API_KEY, parent.apiKey); @@ -597,13 +603,13 @@ private Config(final Properties properties, final Config parent) { properties, RUNTIME_CONTEXT_FIELD_INJECTION, parent.runtimeContextFieldInjection); final Set parsedPropagationStylesToExtract = - getPropertySetValue(properties, PROPAGATION_STYLE_EXTRACT, PropagationStyle.class); + getPropertySetValue(properties, PROPAGATION_STYLE_EXTRACT); propagationStylesToExtract = parsedPropagationStylesToExtract == null ? parent.propagationStylesToExtract : parsedPropagationStylesToExtract; final Set parsedPropagationStylesToInject = - getPropertySetValue(properties, PROPAGATION_STYLE_INJECT, PropagationStyle.class); + getPropertySetValue(properties, PROPAGATION_STYLE_INJECT); propagationStylesToInject = parsedPropagationStylesToInject == null ? parent.propagationStylesToInject @@ -797,13 +803,16 @@ public boolean isIntegrationEnabled( } /** + * @deprecated This method should only be used internally. Use the instance getter instead {@link + * #isIntegrationEnabled(SortedSet, boolean)}. * @param integrationNames * @param defaultEnabled * @return * @deprecated This method should only be used internally. Use the instance getter instead {@link * #isIntegrationEnabled(SortedSet, boolean)}. */ - public static boolean integrationEnabled( + @Deprecated + private static boolean integrationEnabled( final SortedSet integrationNames, final boolean defaultEnabled) { // If default is enabled, we want to enable individually, // if default is disabled, we want to disable individually. @@ -831,6 +840,8 @@ public boolean isDecoratorEnabled(final String name) { } /** + * @deprecated This method should only be used internally. Use the instance getter instead {@link + * #isJmxFetchIntegrationEnabled(SortedSet, boolean)}. * @param integrationNames * @param defaultEnabled * @return @@ -860,6 +871,8 @@ public boolean isTraceAnalyticsIntegrationEnabled( } /** + * @deprecated This method should only be used internally. Use the instance getter instead {@link + * #isTraceAnalyticsIntegrationEnabled(SortedSet, boolean)}. * @param integrationNames * @param defaultEnabled * @return @@ -896,9 +909,10 @@ public static boolean traceAnalyticsIntegrationEnabled( */ private static String getSettingFromEnvironment(final String name, final String defaultValue) { String value; + final String systemPropertyName = propertyNameToSystemPropertyName(name); // System properties and properties provided from command line have the highest precedence - value = System.getProperties().getProperty(propertyNameToSystemPropertyName(name)); + value = System.getProperties().getProperty(systemPropertyName); if (null != value) { return value; } @@ -910,7 +924,7 @@ private static String getSettingFromEnvironment(final String name, final String } // If value is not defined yet, we look at properties optionally defined in a properties file - value = propertiesFromConfigFile.getProperty(propertyNameToSystemPropertyName(name)); + value = propertiesFromConfigFile.getProperty(systemPropertyName); if (null != value) { return value; } @@ -919,6 +933,7 @@ private static String getSettingFromEnvironment(final String name, final String } /** @deprecated This method should only be used internally. Use the explicit getter instead. */ + @NonNull private static Map getMapSettingFromEnvironment( final String name, final String defaultValue) { return parseMap( @@ -931,7 +946,8 @@ private static Map getMapSettingFromEnvironment( * * @deprecated This method should only be used internally. Use the explicit getter instead. */ - public static List getListSettingFromEnvironment( + @NonNull + private static List getListSettingFromEnvironment( final String name, final String defaultValue) { return parseList(getSettingFromEnvironment(name, defaultValue)); } @@ -943,8 +959,7 @@ public static List getListSettingFromEnvironment( */ public static Boolean getBooleanSettingFromEnvironment( final String name, final Boolean defaultValue) { - final String value = getSettingFromEnvironment(name, null); - return value == null || value.trim().isEmpty() ? defaultValue : Boolean.valueOf(value); + return getSettingFromEnvironmentWithLog(name, Boolean.class, defaultValue); } /** @@ -953,13 +968,7 @@ public static Boolean getBooleanSettingFromEnvironment( * @deprecated This method should only be used internally. Use the explicit getter instead. */ public static Float getFloatSettingFromEnvironment(final String name, final Float defaultValue) { - final String value = getSettingFromEnvironment(name, null); - try { - return value == null ? defaultValue : Float.valueOf(value); - } catch (final NumberFormatException e) { - log.warn("Invalid configuration for " + name, e); - return defaultValue; - } + return getSettingFromEnvironmentWithLog(name, Float.class, defaultValue); } /** @@ -967,15 +976,10 @@ public static Float getFloatSettingFromEnvironment(final String name, final Floa * * @deprecated This method should only be used internally. Use the explicit getter instead. */ - public static Double getDoubleSettingFromEnvironment( + @Deprecated + private static Double getDoubleSettingFromEnvironment( final String name, final Double defaultValue) { - final String value = getSettingFromEnvironment(name, null); - try { - return value == null ? defaultValue : Double.valueOf(value); - } catch (final NumberFormatException e) { - log.warn("Invalid configuration for " + name, e); - return defaultValue; - } + return getSettingFromEnvironmentWithLog(name, Double.class, defaultValue); } /** @@ -983,9 +987,13 @@ public static Double getDoubleSettingFromEnvironment( */ private static Integer getIntegerSettingFromEnvironment( final String name, final Integer defaultValue) { - final String value = getSettingFromEnvironment(name, null); + return getSettingFromEnvironmentWithLog(name, Integer.class, defaultValue); + } + + private static T getSettingFromEnvironmentWithLog( + final String name, Class tClass, final T defaultValue) { try { - return value == null ? defaultValue : Integer.valueOf(value); + return valueOf(getSettingFromEnvironment(name, null), tClass, defaultValue); } catch (final NumberFormatException e) { log.warn("Invalid configuration for " + name, e); return defaultValue; @@ -996,28 +1004,21 @@ private static Integer getIntegerSettingFromEnvironment( * Calls {@link #getSettingFromEnvironment(String, String)} and converts the result to a set of * strings splitting by space or comma. */ - private static > Set getEnumSetSettingFromEnvironment( - final String name, - final String defaultValue, - final Class clazz, - final boolean emptyResultMeansUseDefault) { + private static Set getEnumSetSettingFromEnvironmentOrDefault( + final String name, final String defaultValue) { final String value = getSettingFromEnvironment(name, defaultValue); - Set result = - convertStringSetToEnumSet( - parseStringIntoSetOfNonEmptyStrings(value, SPLIT_BY_SPACE_OR_COMMA_REGEX), clazz); + Set result = + convertStringSetToEnumSet(parseStringIntoSetOfNonEmptyStrings(value)); - if (emptyResultMeansUseDefault && result.isEmpty()) { + if (result.isEmpty()) { // Treat empty parsing result as no value and use default instead - result = - convertStringSetToEnumSet( - parseStringIntoSetOfNonEmptyStrings(defaultValue, SPLIT_BY_SPACE_OR_COMMA_REGEX), - clazz); + result = convertStringSetToEnumSet(parseStringIntoSetOfNonEmptyStrings(defaultValue)); } return result; } - private Set getIntegerRangeSettingFromEnvironment( + private static Set getIntegerRangeSettingFromEnvironment( final String name, final Set defaultValue) { final String value = getSettingFromEnvironment(name, null); try { @@ -1035,6 +1036,7 @@ private Set getIntegerRangeSettingFromEnvironment( * @param setting The setting name, e.g. `service.name` * @return The public facing environment variable name */ + @NonNull private static String propertyNameToEnvironmentVariableName(final String setting) { return ENV_REPLACEMENT .matcher(propertyNameToSystemPropertyName(setting).toUpperCase()) @@ -1048,10 +1050,43 @@ private static String propertyNameToEnvironmentVariableName(final String setting * @param setting The setting name, e.g. `service.name` * @return The public facing system property name */ + @NonNull private static String propertyNameToSystemPropertyName(final String setting) { return PREFIX + setting; } + /** + * @param value to parse by tClass::valueOf + * @param tClass should contain static parsing method "T valueOf(String)" + * @param defaultValue + * @param + * @return value == null || value.trim().isEmpty() ? defaultValue : tClass.valueOf(value) + * @throws NumberFormatException + */ + private static T valueOf(final String value, final Class tClass, final T defaultValue) { + if (tClass == null || value == null || value.trim().isEmpty()) { + log.debug("valueOf: using defaultValue '{}' for '{}' of '{}' ", defaultValue, value, tClass); + return defaultValue; + } + try { + return (T) + MethodHandles.publicLookup() + .findStatic(tClass, "valueOf", MethodType.methodType(tClass, String.class)) + .invoke(value); + } catch (NumberFormatException e) { + throw e; + } catch (NoSuchMethodException e) { + log.debug("Can't invoke 'valueOf': ", e); + throw new NumberFormatException(e.toString()); + } catch (IllegalAccessException e) { + log.debug("Can't access 'valueOf': ", e); + throw new NumberFormatException(e.toString()); + } catch (Throwable e) { + log.debug("Can't parse: ", e); + throw new NumberFormatException(e.toString()); + } + } + private static Map getPropertyMapValue( final Properties properties, final String name, final Map defaultValue) { final String value = properties.getProperty(name); @@ -1066,29 +1101,25 @@ private static List getPropertyListValue( private static Boolean getPropertyBooleanValue( final Properties properties, final String name, final Boolean defaultValue) { - final String value = properties.getProperty(name); - return value == null || value.trim().isEmpty() ? defaultValue : Boolean.valueOf(value); + return valueOf(properties.getProperty(name), Boolean.class, defaultValue); } private static Integer getPropertyIntegerValue( final Properties properties, final String name, final Integer defaultValue) { - final String value = properties.getProperty(name); - return value == null || value.trim().isEmpty() ? defaultValue : Integer.valueOf(value); + return valueOf(properties.getProperty(name), Integer.class, defaultValue); } private static Double getPropertyDoubleValue( final Properties properties, final String name, final Double defaultValue) { - final String value = properties.getProperty(name); - return value == null || value.trim().isEmpty() ? defaultValue : Double.valueOf(value); + return valueOf(properties.getProperty(name), Double.class, defaultValue); } - private static > Set getPropertySetValue( - final Properties properties, final String name, final Class clazz) { + private static Set getPropertySetValue( + final Properties properties, final String name) { final String value = properties.getProperty(name); if (value != null) { - final Set result = - convertStringSetToEnumSet( - parseStringIntoSetOfNonEmptyStrings(value, SPLIT_BY_SPACE_OR_COMMA_REGEX), clazz); + final Set result = + convertStringSetToEnumSet(parseStringIntoSetOfNonEmptyStrings(value)); if (!result.isEmpty()) { return result; } @@ -1097,7 +1128,7 @@ private static > Set getPropertySetValue( return null; } - private Set getPropertyIntegerRangeValue( + private static Set getPropertyIntegerRangeValue( final Properties properties, final String name, final Set defaultValue) { final String value = properties.getProperty(name); try { @@ -1108,6 +1139,7 @@ private Set getPropertyIntegerRangeValue( } } + @NonNull private static Map parseMap(final String str, final String settingName) { // If we ever want to have default values besides an empty map, this will need to change. if (str == null || str.trim().isEmpty()) { @@ -1137,9 +1169,9 @@ private static Map parseMap(final String str, final String setti return Collections.unmodifiableMap(map); } - private static Set parseIntegerRangeSet(String str, final String settingName) + @NonNull + private static Set parseIntegerRangeSet(@NonNull String str, final String settingName) throws NumberFormatException { - assert str != null; str = str.replaceAll("\\s", ""); if (!str.matches("\\d{3}(?:-\\d{3})?(?:,\\d{3}(?:-\\d{3})?)*")) { log.warn( @@ -1169,10 +1201,26 @@ private static Set parseIntegerRangeSet(String str, final String settin return Collections.unmodifiableSet(set); } + @NonNull private static Map newHashMap(final int size) { return new HashMap<>(size + 1, 1f); } + /** + * @param map + * @param propName + * @return true if map was modified + */ + private static boolean addPropToMapIfDefinedByEnvironment( + final Map map, final String propName) { + final String val = getSettingFromEnvironment(propName, null); + if (val != null) { + return !val.equals(map.put(propertyNameToSystemPropertyName(propName), val)); + } + return false; + } + + @NonNull private static List parseList(final String str) { if (str == null || str.trim().isEmpty()) { return Collections.emptyList(); @@ -1186,13 +1234,13 @@ private static List parseList(final String str) { return Collections.unmodifiableList(Arrays.asList(tokens)); } - private static Set parseStringIntoSetOfNonEmptyStrings( - final String str, final String regex) { + @NonNull + private static Set parseStringIntoSetOfNonEmptyStrings(final String str) { // Using LinkedHashSet to preserve original string order final Set result = new LinkedHashSet<>(); // Java returns single value when splitting an empty string. We do not need that value, so // we need to throw it out. - for (final String value : str.split(regex)) { + for (final String value : str.split(SPLIT_BY_SPACE_OR_COMMA_REGEX)) { if (!value.isEmpty()) { result.add(value); } @@ -1200,15 +1248,15 @@ private static Set parseStringIntoSetOfNonEmptyStrings( return Collections.unmodifiableSet(result); } - private static > Set convertStringSetToEnumSet( - final Set input, final Class clazz) { + @NonNull + private static Set convertStringSetToEnumSet(final Set input) { // Using LinkedHashSet to preserve original string order - final Set result = new LinkedHashSet<>(); + final Set result = new LinkedHashSet<>(); for (final String value : input) { try { - result.add(Enum.valueOf(clazz, value.toUpperCase())); + result.add(PropagationStyle.valueOf(value.toUpperCase())); } catch (final IllegalArgumentException e) { - log.debug("Cannot recognize config string value: {}, {}", value, clazz); + log.debug("Cannot recognize config string value: {}, {}", value, PropagationStyle.class); } } return Collections.unmodifiableSet(result); @@ -1245,8 +1293,7 @@ private static Properties loadConfigurationFile() { return properties; } - try { - final FileReader fileReader = new FileReader(configurationFile); + try (final FileReader fileReader = new FileReader(configurationFile)) { properties.load(fileReader); } catch (final FileNotFoundException fnf) { log.error("Configuration file '{}' not found.", configurationFilePath); @@ -1259,8 +1306,8 @@ private static Properties loadConfigurationFile() { } /** Returns the detected hostname. First tries locally, then using DNS */ - private String getHostName() { - String possibleHostname = null; + private static String getHostName() { + String possibleHostname; // Try environment variable. This works in almost all environments if (System.getProperty("os.name").startsWith("Windows")) { @@ -1275,12 +1322,11 @@ private String getHostName() { } // Try hostname command - try { - final Process process = Runtime.getRuntime().exec("hostname"); - final BufferedReader reader = - new BufferedReader(new InputStreamReader(process.getInputStream())); + try (final BufferedReader reader = + new BufferedReader( + new InputStreamReader(Runtime.getRuntime().exec("hostname").getInputStream()))) { possibleHostname = reader.readLine(); - } catch (final Exception e) { + } catch (final Exception ignore) { // Ignore. Hostname command is not always available } @@ -1310,7 +1356,7 @@ public static Config get(final Properties properties) { if (properties == null || properties.isEmpty()) { return INSTANCE; } else { - return new Config(properties, INSTANCE); + return new Config(properties); } } } diff --git a/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy b/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy index 5b1bdf15fd7..356b927e809 100644 --- a/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy +++ b/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy @@ -82,6 +82,8 @@ class ConfigTest extends DDSpecification { private static final DD_WRITER_TYPE_ENV = "DD_WRITER_TYPE" private static final DD_SERVICE_MAPPING_ENV = "DD_SERVICE_MAPPING" private static final DD_TAGS_ENV = "DD_TAGS" + private static final DD_ENV_ENV = "DD_ENV" + private static final DD_VERSION_ENV = "DD_VERSION" private static final DD_GLOBAL_TAGS_ENV = "DD_TRACE_GLOBAL_TAGS" private static final DD_SPAN_TAGS_ENV = "DD_TRACE_SPAN_TAGS" private static final DD_HEADER_TAGS_ENV = "DD_TRACE_HEADER_TAGS" @@ -951,6 +953,7 @@ class ConfigTest extends DDSpecification { setup: System.setProperty(PREFIX + CONFIGURATION_FILE, "src/test/resources/dd-java-tracer.properties") environmentVariables.set("DD_SERVICE_NAME", "set-in-env") + environmentVariables.set("DD_SERVICE", "some-other-ignored-name") when: def config = new Config() @@ -961,7 +964,17 @@ class ConfigTest extends DDSpecification { cleanup: System.clearProperty(PREFIX + CONFIGURATION_FILE) System.clearProperty(PREFIX + SERVICE_NAME) - environmentVariables.clear("DD_SERVICE_NAME") + } + + def "verify fallback to DD_SERVICE"() { + setup: + environmentVariables.set("DD_SERVICE", "service-name-from-dd-service-env-var") + + when: + def config = new Config() + + then: + config.serviceName == "service-name-from-dd-service-env-var" } def "verify fallback to properties file that does not exist does not crash app"() { @@ -1218,4 +1231,108 @@ class ConfigTest extends DDSpecification { config.getFinalProfilingUrl() == "https://some.new.url/goes/here" } + def "fallback to DD_TAGS"() { + setup: + environmentVariables.set(DD_TAGS_ENV, "a:1,b:2,c:3") + + when: + Config config = new Config() + + then: + config.mergedSpanTags == [a: "1", c: "3", b: "2"] + } + + def "precedence of DD_ENV and DD_VERSION"() { + setup: + environmentVariables.set(DD_ENV_ENV, "test_env") + environmentVariables.set(DD_VERSION_ENV, "1.2.3") + environmentVariables.set(DD_TAGS_ENV, "dd.env:production , dd.version:3.2.1") + + when: + Config config = new Config() + + then: + config.mergedSpanTags == ["dd.env": "test_env", "dd.version": "1.2.3"] + } + + def "propertyNameToEnvironmentVariableName unit test"() { + expect: + Config.propertyNameToEnvironmentVariableName(Config.SERVICE) == "DD_SERVICE" + } + + def "getProperty*Value unit test"() { + setup: + def p = new Properties() + p.setProperty("a", "42.42") + p.setProperty("intProp", "13") + + expect: + Config.getPropertyDoubleValue(p, "intProp", 40) == 13 + Config.getPropertyDoubleValue(p, "a", 41) == 42.42 + Config.getPropertyIntegerValue(p, "b", 61) == 61 + Config.getPropertyIntegerValue(p, "intProp", 61) == 13 + Config.getPropertyBooleanValue(p, "a", true) == false + } + + def "valueOf positive test"() { + expect: + Config.valueOf(value, tClass, defaultValue) == expected + + where: + value | tClass | defaultValue | expected + null | null | null | null + "" | null | null | null + " " | null | null | null + "1" | null | null | null + "42.42" | Boolean | true | false + "42.42" | Boolean | null | false + "true" | Boolean | null | true + "trUe" | Boolean | null | true + "trUe" | Boolean | false | true + "tru" | Boolean | true | false + "truee" | Boolean | true | false + "true " | Boolean | true | false + " true" | Boolean | true | false + " true " | Boolean | true | false + " true "| Boolean | true | false + null | Float | 43.3 | 43.3 + "42.42" | Float | 21.21 | 42.42f + null | Double | 43.3 | 43.3 + "42.42" | Double | 21.21 | 42.42 + null | Integer | 13 | 13 + "44" | Integer | 21 | 44 + "45" | Long | 21 | 45 + "46" | Short | 21 | 46 + } + + def "valueOf negative test"() { + when: + Config.valueOf(value, tClass, null) + + then: + def exception = thrown(NumberFormatException) + println("cause: " : exception.message) + + where: + value | tClass + "42.42" | Number + "42.42" | Byte + "42.42" | Character + "42.42" | Short + "42.42" | Integer + "42.42" | Long + "42.42" | Object + "42.42" | Object[] + "42.42" | boolean[] + "42.42" | boolean + "42.42" | byte + "42.42" | byte + "42.42" | char + "42.42" | short + "42.42" | int + "42.42" | long + "42.42" | double + "42.42" | float + } + } diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java index 38ad5535d45..dbb1674d3f8 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java @@ -23,7 +23,6 @@ @Slf4j public class DDSpanContext implements io.opentracing.SpanContext { public static final String PRIORITY_SAMPLING_KEY = "_sampling_priority_v1"; - public static final String SAMPLE_RATE_KEY = "_sample_rate"; public static final String ORIGIN_KEY = "_dd.origin"; public static final String DD_MEASURED = "_dd.measured"; public static final Number DD_MEASURED_DEFAULT = 1; From bcc745f28f53d8c6b0f7868e07516d2a829d822a Mon Sep 17 00:00:00 2001 From: Lev Priima Date: Thu, 2 Apr 2020 16:47:38 -0700 Subject: [PATCH 2/5] Config.valueOf("", null, "") with throw NPE --- .../main/java/datadog/trace/api/Config.java | 34 +++++++++---------- .../datadog/trace/api/ConfigTest.groovy | 20 ++++++++--- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Config.java b/dd-trace-api/src/main/java/datadog/trace/api/Config.java index 4f49ce7f501..6b3454a886b 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Config.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Config.java @@ -416,10 +416,10 @@ private Config() { RUNTIME_CONTEXT_FIELD_INJECTION, DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION); propagationStylesToExtract = - getEnumSetSettingFromEnvironmentOrDefault( + getPropagationStyleSetSettingFromEnvironmentOrDefault( PROPAGATION_STYLE_EXTRACT, DEFAULT_PROPAGATION_STYLE_EXTRACT); propagationStylesToInject = - getEnumSetSettingFromEnvironmentOrDefault( + getPropagationStyleSetSettingFromEnvironmentOrDefault( PROPAGATION_STYLE_INJECT, DEFAULT_PROPAGATION_STYLE_INJECT); jmxFetchEnabled = @@ -603,13 +603,13 @@ private Config(final Properties properties) { properties, RUNTIME_CONTEXT_FIELD_INJECTION, parent.runtimeContextFieldInjection); final Set parsedPropagationStylesToExtract = - getPropertySetValue(properties, PROPAGATION_STYLE_EXTRACT); + getPropagationStyleSetFromPropertyValue(properties, PROPAGATION_STYLE_EXTRACT); propagationStylesToExtract = parsedPropagationStylesToExtract == null ? parent.propagationStylesToExtract : parsedPropagationStylesToExtract; final Set parsedPropagationStylesToInject = - getPropertySetValue(properties, PROPAGATION_STYLE_INJECT); + getPropagationStyleSetFromPropertyValue(properties, PROPAGATION_STYLE_INJECT); propagationStylesToInject = parsedPropagationStylesToInject == null ? parent.propagationStylesToInject @@ -1004,15 +1004,16 @@ private static T getSettingFromEnvironmentWithLog( * Calls {@link #getSettingFromEnvironment(String, String)} and converts the result to a set of * strings splitting by space or comma. */ - private static Set getEnumSetSettingFromEnvironmentOrDefault( + private static Set getPropagationStyleSetSettingFromEnvironmentOrDefault( final String name, final String defaultValue) { final String value = getSettingFromEnvironment(name, defaultValue); Set result = - convertStringSetToEnumSet(parseStringIntoSetOfNonEmptyStrings(value)); + convertStringSetToPropagationStyleSet(parseStringIntoSetOfNonEmptyStrings(value)); if (result.isEmpty()) { // Treat empty parsing result as no value and use default instead - result = convertStringSetToEnumSet(parseStringIntoSetOfNonEmptyStrings(defaultValue)); + result = + convertStringSetToPropagationStyleSet(parseStringIntoSetOfNonEmptyStrings(defaultValue)); } return result; @@ -1063,8 +1064,9 @@ private static String propertyNameToSystemPropertyName(final String setting) { * @return value == null || value.trim().isEmpty() ? defaultValue : tClass.valueOf(value) * @throws NumberFormatException */ - private static T valueOf(final String value, final Class tClass, final T defaultValue) { - if (tClass == null || value == null || value.trim().isEmpty()) { + private static T valueOf( + final String value, @NonNull final Class tClass, final T defaultValue) { + if (value == null || value.trim().isEmpty()) { log.debug("valueOf: using defaultValue '{}' for '{}' of '{}' ", defaultValue, value, tClass); return defaultValue; } @@ -1075,11 +1077,8 @@ private static T valueOf(final String value, final Class tClass, final T .invoke(value); } catch (NumberFormatException e) { throw e; - } catch (NoSuchMethodException e) { - log.debug("Can't invoke 'valueOf': ", e); - throw new NumberFormatException(e.toString()); - } catch (IllegalAccessException e) { - log.debug("Can't access 'valueOf': ", e); + } catch (NoSuchMethodException | IllegalAccessException e) { + log.debug("Can't invoke or access 'valueOf': ", e); throw new NumberFormatException(e.toString()); } catch (Throwable e) { log.debug("Can't parse: ", e); @@ -1114,12 +1113,12 @@ private static Double getPropertyDoubleValue( return valueOf(properties.getProperty(name), Double.class, defaultValue); } - private static Set getPropertySetValue( + private static Set getPropagationStyleSetFromPropertyValue( final Properties properties, final String name) { final String value = properties.getProperty(name); if (value != null) { final Set result = - convertStringSetToEnumSet(parseStringIntoSetOfNonEmptyStrings(value)); + convertStringSetToPropagationStyleSet(parseStringIntoSetOfNonEmptyStrings(value)); if (!result.isEmpty()) { return result; } @@ -1249,7 +1248,8 @@ private static Set parseStringIntoSetOfNonEmptyStrings(final String str) } @NonNull - private static Set convertStringSetToEnumSet(final Set input) { + private static Set convertStringSetToPropagationStyleSet( + final Set input) { // Using LinkedHashSet to preserve original string order final Set result = new LinkedHashSet<>(); for (final String value : input) { diff --git a/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy b/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy index 356b927e809..267abf63811 100644 --- a/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy +++ b/dd-trace-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy @@ -1280,10 +1280,6 @@ class ConfigTest extends DDSpecification { where: value | tClass | defaultValue | expected - null | null | null | null - "" | null | null | null - " " | null | null | null - "1" | null | null | null "42.42" | Boolean | true | false "42.42" | Boolean | null | false "true" | Boolean | null | true @@ -1305,6 +1301,22 @@ class ConfigTest extends DDSpecification { "46" | Short | 21 | 46 } + def "valueOf negative test when tClass is null"() { + when: + Config.valueOf(value, tClass, defaultValue) + + then: + def exception = thrown(NullPointerException) + exception.message == "tClass is marked non-null but is null" + + where: + value | tClass | defaultValue + null | null | "42" + "" | null | "43" + " " | null | "44" + "1" | null | "45" + } + def "valueOf negative test"() { when: Config.valueOf(value, tClass, null) From 21d5d038887d6d0f2984c6401c9072406f9850c0 Mon Sep 17 00:00:00 2001 From: Lev Priima Date: Fri, 3 Apr 2020 09:26:14 -0700 Subject: [PATCH 3/5] mark unused public fields @Deprecated in Config.java --- .../main/java/datadog/trace/api/Config.java | 169 ++++++++++-------- 1 file changed, 99 insertions(+), 70 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Config.java b/dd-trace-api/src/main/java/datadog/trace/api/Config.java index 6b3454a886b..30c3843f617 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Config.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Config.java @@ -51,72 +51,99 @@ public class Config { private static final Pattern ENV_REPLACEMENT = Pattern.compile("[^a-zA-Z0-9_]"); - public static final String CONFIGURATION_FILE = "trace.config"; + @Deprecated public static final String CONFIGURATION_FILE = "trace.config"; public static final String API_KEY = "api-key"; public static final String API_KEY_FILE = "api-key-file"; public static final String SITE = "site"; - public static final String SERVICE_NAME = "service.name"; - public static final String TRACE_ENABLED = "trace.enabled"; - public static final String INTEGRATIONS_ENABLED = "integrations.enabled"; - public static final String WRITER_TYPE = "writer.type"; - public static final String AGENT_HOST = "agent.host"; - public static final String TRACE_AGENT_PORT = "trace.agent.port"; - public static final String AGENT_PORT_LEGACY = "agent.port"; + @Deprecated public static final String SERVICE_NAME = "service.name"; + @Deprecated public static final String TRACE_ENABLED = "trace.enabled"; + @Deprecated public static final String INTEGRATIONS_ENABLED = "integrations.enabled"; + @Deprecated public static final String WRITER_TYPE = "writer.type"; + @Deprecated public static final String AGENT_HOST = "agent.host"; + @Deprecated public static final String TRACE_AGENT_PORT = "trace.agent.port"; + @Deprecated public static final String AGENT_PORT_LEGACY = "agent.port"; + + @Deprecated public static final String AGENT_UNIX_DOMAIN_SOCKET = "trace.agent.unix.domain.socket"; - public static final String PRIORITY_SAMPLING = "priority.sampling"; - public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; - public static final String SERVICE_MAPPING = "service.mapping"; + + @Deprecated public static final String PRIORITY_SAMPLING = "priority.sampling"; + @Deprecated public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; + @Deprecated public static final String SERVICE_MAPPING = "service.mapping"; private static final String ENV = "env"; private static final String VERSION = "version"; public static final String TAGS = "tags"; @Deprecated // Use dd.tags instead public static final String GLOBAL_TAGS = "trace.global.tags"; - public static final String SPAN_TAGS = "trace.span.tags"; - public static final String JMX_TAGS = "trace.jmx.tags"; - - public static final String TRACE_ANALYTICS_ENABLED = "trace.analytics.enabled"; - public static final String TRACE_ANNOTATIONS = "trace.annotations"; - public static final String TRACE_EXECUTORS_ALL = "trace.executors.all"; - public static final String TRACE_EXECUTORS = "trace.executors"; - public static final String TRACE_METHODS = "trace.methods"; - public static final String TRACE_CLASSES_EXCLUDE = "trace.classes.exclude"; + @Deprecated public static final String SPAN_TAGS = "trace.span.tags"; + @Deprecated public static final String JMX_TAGS = "trace.jmx.tags"; + + @Deprecated public static final String TRACE_ANALYTICS_ENABLED = "trace.analytics.enabled"; + @Deprecated public static final String TRACE_ANNOTATIONS = "trace.annotations"; + @Deprecated public static final String TRACE_EXECUTORS_ALL = "trace.executors.all"; + @Deprecated public static final String TRACE_EXECUTORS = "trace.executors"; + @Deprecated public static final String TRACE_METHODS = "trace.methods"; + @Deprecated public static final String TRACE_CLASSES_EXCLUDE = "trace.classes.exclude"; + + @Deprecated public static final String TRACE_SAMPLING_SERVICE_RULES = "trace.sampling.service.rules"; + + @Deprecated public static final String TRACE_SAMPLING_OPERATION_RULES = "trace.sampling.operation.rules"; - public static final String TRACE_SAMPLE_RATE = "trace.sample.rate"; - public static final String TRACE_RATE_LIMIT = "trace.rate.limit"; - public static final String TRACE_REPORT_HOSTNAME = "trace.report-hostname"; - public static final String HEADER_TAGS = "trace.header.tags"; - public static final String HTTP_SERVER_ERROR_STATUSES = "http.server.error.statuses"; - public static final String HTTP_CLIENT_ERROR_STATUSES = "http.client.error.statuses"; + + @Deprecated public static final String TRACE_SAMPLE_RATE = "trace.sample.rate"; + @Deprecated public static final String TRACE_RATE_LIMIT = "trace.rate.limit"; + @Deprecated public static final String TRACE_REPORT_HOSTNAME = "trace.report-hostname"; + @Deprecated public static final String HEADER_TAGS = "trace.header.tags"; + @Deprecated public static final String HTTP_SERVER_ERROR_STATUSES = "http.server.error.statuses"; + @Deprecated public static final String HTTP_CLIENT_ERROR_STATUSES = "http.client.error.statuses"; + + @Deprecated public static final String HTTP_SERVER_TAG_QUERY_STRING = "http.server.tag.query-string"; + + @Deprecated public static final String HTTP_CLIENT_TAG_QUERY_STRING = "http.client.tag.query-string"; + + @Deprecated public static final String HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN = "trace.http.client.split-by-domain"; + + @Deprecated public static final String DB_CLIENT_HOST_SPLIT_BY_INSTANCE = "trace.db.client.split-by-instance"; - public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; - public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; - public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans"; + + @Deprecated public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; + @Deprecated public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; + @Deprecated public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans"; + + @Deprecated public static final String RUNTIME_CONTEXT_FIELD_INJECTION = "trace.runtime.context.field.injection"; - public static final String PROPAGATION_STYLE_EXTRACT = "propagation.style.extract"; - public static final String PROPAGATION_STYLE_INJECT = "propagation.style.inject"; - public static final String JMX_FETCH_ENABLED = "jmxfetch.enabled"; - public static final String JMX_FETCH_CONFIG_DIR = "jmxfetch.config.dir"; - public static final String JMX_FETCH_CONFIG = "jmxfetch.config"; + @Deprecated public static final String PROPAGATION_STYLE_EXTRACT = "propagation.style.extract"; + @Deprecated public static final String PROPAGATION_STYLE_INJECT = "propagation.style.inject"; + + @Deprecated public static final String JMX_FETCH_ENABLED = "jmxfetch.enabled"; + @Deprecated public static final String JMX_FETCH_CONFIG_DIR = "jmxfetch.config.dir"; + @Deprecated public static final String JMX_FETCH_CONFIG = "jmxfetch.config"; @Deprecated public static final String JMX_FETCH_METRICS_CONFIGS = "jmxfetch.metrics-configs"; - public static final String JMX_FETCH_CHECK_PERIOD = "jmxfetch.check-period"; + @Deprecated public static final String JMX_FETCH_CHECK_PERIOD = "jmxfetch.check-period"; + + @Deprecated public static final String JMX_FETCH_REFRESH_BEANS_PERIOD = "jmxfetch.refresh-beans-period"; - public static final String JMX_FETCH_STATSD_HOST = "jmxfetch.statsd.host"; - public static final String JMX_FETCH_STATSD_PORT = "jmxfetch.statsd.port"; - public static final String HEALTH_METRICS_ENABLED = "trace.health.metrics.enabled"; + @Deprecated public static final String JMX_FETCH_STATSD_HOST = "jmxfetch.statsd.host"; + @Deprecated public static final String JMX_FETCH_STATSD_PORT = "jmxfetch.statsd.port"; + + @Deprecated public static final String HEALTH_METRICS_ENABLED = "trace.health.metrics.enabled"; + + @Deprecated public static final String HEALTH_METRICS_STATSD_HOST = "trace.health.metrics.statsd.host"; + + @Deprecated public static final String HEALTH_METRICS_STATSD_PORT = "trace.health.metrics.statsd.port"; - public static final String LOGS_INJECTION_ENABLED = "logs.injection"; + @Deprecated public static final String LOGS_INJECTION_ENABLED = "logs.injection"; - public static final String PROFILING_ENABLED = "profiling.enabled"; + @Deprecated public static final String PROFILING_ENABLED = "profiling.enabled"; @Deprecated // Use dd.site instead public static final String PROFILING_URL = "profiling.url"; @Deprecated // Use dd.api-key instead @@ -127,26 +154,34 @@ public class Config { public static final String PROFILING_API_KEY_VERY_OLD = "profiling.apikey"; @Deprecated // Use dd.api-key-file instead public static final String PROFILING_API_KEY_FILE_VERY_OLD = "profiling.apikey.file"; - public static final String PROFILING_TAGS = "profiling.tags"; - public static final String PROFILING_START_DELAY = "profiling.start-delay"; + @Deprecated public static final String PROFILING_TAGS = "profiling.tags"; + @Deprecated public static final String PROFILING_START_DELAY = "profiling.start-delay"; // DANGEROUS! May lead on sigsegv on JVMs before 14 // Not intended for production use + @Deprecated public static final String PROFILING_START_FORCE_FIRST = "profiling.experimental.start-force-first"; - public static final String PROFILING_UPLOAD_PERIOD = "profiling.upload.period"; + + @Deprecated public static final String PROFILING_UPLOAD_PERIOD = "profiling.upload.period"; + + @Deprecated public static final String PROFILING_TEMPLATE_OVERRIDE_FILE = "profiling.jfr-template-override-file"; - public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; + + @Deprecated public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; + + @Deprecated public static final String PROFILING_UPLOAD_COMPRESSION = "profiling.upload.compression"; - public static final String PROFILING_PROXY_HOST = "profiling.proxy.host"; - public static final String PROFILING_PROXY_PORT = "profiling.proxy.port"; - public static final String PROFILING_PROXY_USERNAME = "profiling.proxy.username"; - public static final String PROFILING_PROXY_PASSWORD = "profiling.proxy.password"; + + @Deprecated public static final String PROFILING_PROXY_HOST = "profiling.proxy.host"; + @Deprecated public static final String PROFILING_PROXY_PORT = "profiling.proxy.port"; + @Deprecated public static final String PROFILING_PROXY_USERNAME = "profiling.proxy.username"; + @Deprecated public static final String PROFILING_PROXY_PASSWORD = "profiling.proxy.password"; public static final String RUNTIME_ID_TAG = "runtime-id"; private static final String SERVICE = "service"; - public static final String SERVICE_TAG = SERVICE; - public static final String HOST_TAG = "host"; + @Deprecated public static final String SERVICE_TAG = SERVICE; + @Deprecated public static final String HOST_TAG = "host"; public static final String LANGUAGE_TAG_KEY = "language"; public static final String LANGUAGE_TAG_VALUE = "jvm"; @@ -154,7 +189,7 @@ public class Config { public static final String DEFAULT_SERVICE_NAME = "unnamed-java-app"; private static final boolean DEFAULT_TRACE_ENABLED = true; - public static final boolean DEFAULT_INTEGRATIONS_ENABLED = true; + @Deprecated public static final boolean DEFAULT_INTEGRATIONS_ENABLED = true; public static final String DD_AGENT_WRITER_TYPE = "DDAgentWriter"; public static final String LOGGING_WRITER_TYPE = "LoggingWriter"; private static final String DEFAULT_AGENT_WRITER_TYPE = DD_AGENT_WRITER_TYPE; @@ -182,20 +217,20 @@ public class Config { private static final String DEFAULT_PROPAGATION_STYLE_INJECT = PropagationStyle.DATADOG.name(); private static final boolean DEFAULT_JMX_FETCH_ENABLED = true; - public static final int DEFAULT_JMX_FETCH_STATSD_PORT = 8125; + @Deprecated public static final int DEFAULT_JMX_FETCH_STATSD_PORT = 8125; - public static final boolean DEFAULT_METRICS_ENABLED = false; + @Deprecated public static final boolean DEFAULT_METRICS_ENABLED = false; // No default constants for metrics statsd support -- falls back to jmxfetch values - public static final boolean DEFAULT_LOGS_INJECTION_ENABLED = false; + @Deprecated public static final boolean DEFAULT_LOGS_INJECTION_ENABLED = false; - public static final boolean DEFAULT_PROFILING_ENABLED = false; - public static final int DEFAULT_PROFILING_START_DELAY = 10; - public static final boolean DEFAULT_PROFILING_START_FORCE_FIRST = false; - public static final int DEFAULT_PROFILING_UPLOAD_PERIOD = 60; // 1 min - public static final int DEFAULT_PROFILING_UPLOAD_TIMEOUT = 30; // seconds - public static final String DEFAULT_PROFILING_UPLOAD_COMPRESSION = "on"; - public static final int DEFAULT_PROFILING_PROXY_PORT = 8080; + @Deprecated public static final boolean DEFAULT_PROFILING_ENABLED = false; + @Deprecated public static final int DEFAULT_PROFILING_START_DELAY = 10; + @Deprecated public static final boolean DEFAULT_PROFILING_START_FORCE_FIRST = false; + @Deprecated public static final int DEFAULT_PROFILING_UPLOAD_PERIOD = 60; // 1 min + @Deprecated public static final int DEFAULT_PROFILING_UPLOAD_TIMEOUT = 30; // seconds + @Deprecated public static final String DEFAULT_PROFILING_UPLOAD_COMPRESSION = "on"; + @Deprecated public static final int DEFAULT_PROFILING_PROXY_PORT = 8080; private static final String SPLIT_BY_SPACE_OR_COMMA_REGEX = "[,\\s]+"; @@ -204,9 +239,9 @@ public class Config { private static final boolean DEFAULT_TRACE_EXECUTORS_ALL = false; private static final String DEFAULT_TRACE_EXECUTORS = ""; private static final String DEFAULT_TRACE_METHODS = null; - public static final boolean DEFAULT_TRACE_ANALYTICS_ENABLED = false; - public static final float DEFAULT_ANALYTICS_SAMPLE_RATE = 1.0f; - public static final double DEFAULT_TRACE_RATE_LIMIT = 100; + @Deprecated public static final boolean DEFAULT_TRACE_ANALYTICS_ENABLED = false; + @Deprecated public static final float DEFAULT_ANALYTICS_SAMPLE_RATE = 1.0f; + @Deprecated public static final double DEFAULT_TRACE_RATE_LIMIT = 100; public enum PropagationStyle { DATADOG, @@ -803,8 +838,6 @@ public boolean isIntegrationEnabled( } /** - * @deprecated This method should only be used internally. Use the instance getter instead {@link - * #isIntegrationEnabled(SortedSet, boolean)}. * @param integrationNames * @param defaultEnabled * @return @@ -840,8 +873,6 @@ public boolean isDecoratorEnabled(final String name) { } /** - * @deprecated This method should only be used internally. Use the instance getter instead {@link - * #isJmxFetchIntegrationEnabled(SortedSet, boolean)}. * @param integrationNames * @param defaultEnabled * @return @@ -871,8 +902,6 @@ public boolean isTraceAnalyticsIntegrationEnabled( } /** - * @deprecated This method should only be used internally. Use the instance getter instead {@link - * #isTraceAnalyticsIntegrationEnabled(SortedSet, boolean)}. * @param integrationNames * @param defaultEnabled * @return From 6911c0a1dc11a028d3b73813d6c121136918abd3 Mon Sep 17 00:00:00 2001 From: Lev Priima Date: Wed, 8 Apr 2020 15:03:28 -0700 Subject: [PATCH 4/5] keep unused public fields untouched --- .../trace/agent/test/utils/ConfigUtils.groovy | 6 +- .../main/java/datadog/trace/api/Config.java | 162 +++++++----------- 2 files changed, 66 insertions(+), 102 deletions(-) diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy index 91a1b3a9f46..62f021d38e1 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy @@ -19,15 +19,15 @@ class ConfigUtils { assert Modifier.isVolatile(CONFIG_INSTANCE_FIELD.getModifiers()) assert !Modifier.isFinal(CONFIG_INSTANCE_FIELD.getModifiers()) - def configInstanceFieldValueFromClinit = Config.get() + def existingConfig = Config.get() Properties properties = new Properties() properties.put(name, value) CONFIG_INSTANCE_FIELD.set(null, new Config(properties)) - assert Config.get() != configInstanceFieldValueFromClinit + assert Config.get() != existingConfig try { return r.call() } finally { - CONFIG_INSTANCE_FIELD.set(null, configInstanceFieldValueFromClinit) + CONFIG_INSTANCE_FIELD.set(null, existingConfig) } } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Config.java b/dd-trace-api/src/main/java/datadog/trace/api/Config.java index 30c3843f617..afc24e8849f 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Config.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Config.java @@ -51,99 +51,71 @@ public class Config { private static final Pattern ENV_REPLACEMENT = Pattern.compile("[^a-zA-Z0-9_]"); - @Deprecated public static final String CONFIGURATION_FILE = "trace.config"; + public static final String CONFIGURATION_FILE = "trace.config"; public static final String API_KEY = "api-key"; public static final String API_KEY_FILE = "api-key-file"; public static final String SITE = "site"; - @Deprecated public static final String SERVICE_NAME = "service.name"; - @Deprecated public static final String TRACE_ENABLED = "trace.enabled"; - @Deprecated public static final String INTEGRATIONS_ENABLED = "integrations.enabled"; - @Deprecated public static final String WRITER_TYPE = "writer.type"; - @Deprecated public static final String AGENT_HOST = "agent.host"; - @Deprecated public static final String TRACE_AGENT_PORT = "trace.agent.port"; - @Deprecated public static final String AGENT_PORT_LEGACY = "agent.port"; - - @Deprecated + public static final String SERVICE_NAME = "service.name"; + public static final String TRACE_ENABLED = "trace.enabled"; + public static final String INTEGRATIONS_ENABLED = "integrations.enabled"; + public static final String WRITER_TYPE = "writer.type"; + public static final String AGENT_HOST = "agent.host"; + public static final String TRACE_AGENT_PORT = "trace.agent.port"; + public static final String AGENT_PORT_LEGACY = "agent.port"; public static final String AGENT_UNIX_DOMAIN_SOCKET = "trace.agent.unix.domain.socket"; - - @Deprecated public static final String PRIORITY_SAMPLING = "priority.sampling"; - @Deprecated public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; - @Deprecated public static final String SERVICE_MAPPING = "service.mapping"; + public static final String PRIORITY_SAMPLING = "priority.sampling"; + public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled"; + public static final String SERVICE_MAPPING = "service.mapping"; private static final String ENV = "env"; private static final String VERSION = "version"; public static final String TAGS = "tags"; @Deprecated // Use dd.tags instead public static final String GLOBAL_TAGS = "trace.global.tags"; - @Deprecated public static final String SPAN_TAGS = "trace.span.tags"; - @Deprecated public static final String JMX_TAGS = "trace.jmx.tags"; - - @Deprecated public static final String TRACE_ANALYTICS_ENABLED = "trace.analytics.enabled"; - @Deprecated public static final String TRACE_ANNOTATIONS = "trace.annotations"; - @Deprecated public static final String TRACE_EXECUTORS_ALL = "trace.executors.all"; - @Deprecated public static final String TRACE_EXECUTORS = "trace.executors"; - @Deprecated public static final String TRACE_METHODS = "trace.methods"; - @Deprecated public static final String TRACE_CLASSES_EXCLUDE = "trace.classes.exclude"; - - @Deprecated + public static final String SPAN_TAGS = "trace.span.tags"; + public static final String JMX_TAGS = "trace.jmx.tags"; + public static final String TRACE_ANALYTICS_ENABLED = "trace.analytics.enabled"; + public static final String TRACE_ANNOTATIONS = "trace.annotations"; + public static final String TRACE_EXECUTORS_ALL = "trace.executors.all"; + public static final String TRACE_EXECUTORS = "trace.executors"; + public static final String TRACE_METHODS = "trace.methods"; + public static final String TRACE_CLASSES_EXCLUDE = "trace.classes.exclude"; public static final String TRACE_SAMPLING_SERVICE_RULES = "trace.sampling.service.rules"; - - @Deprecated public static final String TRACE_SAMPLING_OPERATION_RULES = "trace.sampling.operation.rules"; - - @Deprecated public static final String TRACE_SAMPLE_RATE = "trace.sample.rate"; - @Deprecated public static final String TRACE_RATE_LIMIT = "trace.rate.limit"; - @Deprecated public static final String TRACE_REPORT_HOSTNAME = "trace.report-hostname"; - @Deprecated public static final String HEADER_TAGS = "trace.header.tags"; - @Deprecated public static final String HTTP_SERVER_ERROR_STATUSES = "http.server.error.statuses"; - @Deprecated public static final String HTTP_CLIENT_ERROR_STATUSES = "http.client.error.statuses"; - - @Deprecated + public static final String TRACE_SAMPLE_RATE = "trace.sample.rate"; + public static final String TRACE_RATE_LIMIT = "trace.rate.limit"; + public static final String TRACE_REPORT_HOSTNAME = "trace.report-hostname"; + public static final String HEADER_TAGS = "trace.header.tags"; + public static final String HTTP_SERVER_ERROR_STATUSES = "http.server.error.statuses"; + public static final String HTTP_CLIENT_ERROR_STATUSES = "http.client.error.statuses"; public static final String HTTP_SERVER_TAG_QUERY_STRING = "http.server.tag.query-string"; - - @Deprecated public static final String HTTP_CLIENT_TAG_QUERY_STRING = "http.client.tag.query-string"; - - @Deprecated public static final String HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN = "trace.http.client.split-by-domain"; - - @Deprecated public static final String DB_CLIENT_HOST_SPLIT_BY_INSTANCE = "trace.db.client.split-by-instance"; - - @Deprecated public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; - @Deprecated public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; - @Deprecated public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans"; - - @Deprecated + public static final String SPLIT_BY_TAGS = "trace.split-by-tags"; + public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; + public static final String PARTIAL_FLUSH_MIN_SPANS = "trace.partial.flush.min.spans"; public static final String RUNTIME_CONTEXT_FIELD_INJECTION = "trace.runtime.context.field.injection"; + public static final String PROPAGATION_STYLE_EXTRACT = "propagation.style.extract"; + public static final String PROPAGATION_STYLE_INJECT = "propagation.style.inject"; - @Deprecated public static final String PROPAGATION_STYLE_EXTRACT = "propagation.style.extract"; - @Deprecated public static final String PROPAGATION_STYLE_INJECT = "propagation.style.inject"; - - @Deprecated public static final String JMX_FETCH_ENABLED = "jmxfetch.enabled"; - @Deprecated public static final String JMX_FETCH_CONFIG_DIR = "jmxfetch.config.dir"; - @Deprecated public static final String JMX_FETCH_CONFIG = "jmxfetch.config"; + public static final String JMX_FETCH_ENABLED = "jmxfetch.enabled"; + public static final String JMX_FETCH_CONFIG_DIR = "jmxfetch.config.dir"; + public static final String JMX_FETCH_CONFIG = "jmxfetch.config"; @Deprecated public static final String JMX_FETCH_METRICS_CONFIGS = "jmxfetch.metrics-configs"; - @Deprecated public static final String JMX_FETCH_CHECK_PERIOD = "jmxfetch.check-period"; - - @Deprecated + public static final String JMX_FETCH_CHECK_PERIOD = "jmxfetch.check-period"; public static final String JMX_FETCH_REFRESH_BEANS_PERIOD = "jmxfetch.refresh-beans-period"; + public static final String JMX_FETCH_STATSD_HOST = "jmxfetch.statsd.host"; + public static final String JMX_FETCH_STATSD_PORT = "jmxfetch.statsd.port"; - @Deprecated public static final String JMX_FETCH_STATSD_HOST = "jmxfetch.statsd.host"; - @Deprecated public static final String JMX_FETCH_STATSD_PORT = "jmxfetch.statsd.port"; - - @Deprecated public static final String HEALTH_METRICS_ENABLED = "trace.health.metrics.enabled"; - - @Deprecated + public static final String HEALTH_METRICS_ENABLED = "trace.health.metrics.enabled"; public static final String HEALTH_METRICS_STATSD_HOST = "trace.health.metrics.statsd.host"; - - @Deprecated public static final String HEALTH_METRICS_STATSD_PORT = "trace.health.metrics.statsd.port"; - @Deprecated public static final String LOGS_INJECTION_ENABLED = "logs.injection"; + public static final String LOGS_INJECTION_ENABLED = "logs.injection"; - @Deprecated public static final String PROFILING_ENABLED = "profiling.enabled"; + public static final String PROFILING_ENABLED = "profiling.enabled"; @Deprecated // Use dd.site instead public static final String PROFILING_URL = "profiling.url"; @Deprecated // Use dd.api-key instead @@ -154,34 +126,26 @@ public class Config { public static final String PROFILING_API_KEY_VERY_OLD = "profiling.apikey"; @Deprecated // Use dd.api-key-file instead public static final String PROFILING_API_KEY_FILE_VERY_OLD = "profiling.apikey.file"; - @Deprecated public static final String PROFILING_TAGS = "profiling.tags"; - @Deprecated public static final String PROFILING_START_DELAY = "profiling.start-delay"; + public static final String PROFILING_TAGS = "profiling.tags"; + public static final String PROFILING_START_DELAY = "profiling.start-delay"; // DANGEROUS! May lead on sigsegv on JVMs before 14 // Not intended for production use - @Deprecated public static final String PROFILING_START_FORCE_FIRST = "profiling.experimental.start-force-first"; - - @Deprecated public static final String PROFILING_UPLOAD_PERIOD = "profiling.upload.period"; - - @Deprecated + public static final String PROFILING_UPLOAD_PERIOD = "profiling.upload.period"; public static final String PROFILING_TEMPLATE_OVERRIDE_FILE = "profiling.jfr-template-override-file"; - - @Deprecated public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; - - @Deprecated + public static final String PROFILING_UPLOAD_TIMEOUT = "profiling.upload.timeout"; public static final String PROFILING_UPLOAD_COMPRESSION = "profiling.upload.compression"; - - @Deprecated public static final String PROFILING_PROXY_HOST = "profiling.proxy.host"; - @Deprecated public static final String PROFILING_PROXY_PORT = "profiling.proxy.port"; - @Deprecated public static final String PROFILING_PROXY_USERNAME = "profiling.proxy.username"; - @Deprecated public static final String PROFILING_PROXY_PASSWORD = "profiling.proxy.password"; + public static final String PROFILING_PROXY_HOST = "profiling.proxy.host"; + public static final String PROFILING_PROXY_PORT = "profiling.proxy.port"; + public static final String PROFILING_PROXY_USERNAME = "profiling.proxy.username"; + public static final String PROFILING_PROXY_PASSWORD = "profiling.proxy.password"; public static final String RUNTIME_ID_TAG = "runtime-id"; private static final String SERVICE = "service"; - @Deprecated public static final String SERVICE_TAG = SERVICE; - @Deprecated public static final String HOST_TAG = "host"; + public static final String SERVICE_TAG = SERVICE; + public static final String HOST_TAG = "host"; public static final String LANGUAGE_TAG_KEY = "language"; public static final String LANGUAGE_TAG_VALUE = "jvm"; @@ -189,7 +153,7 @@ public class Config { public static final String DEFAULT_SERVICE_NAME = "unnamed-java-app"; private static final boolean DEFAULT_TRACE_ENABLED = true; - @Deprecated public static final boolean DEFAULT_INTEGRATIONS_ENABLED = true; + public static final boolean DEFAULT_INTEGRATIONS_ENABLED = true; public static final String DD_AGENT_WRITER_TYPE = "DDAgentWriter"; public static final String LOGGING_WRITER_TYPE = "LoggingWriter"; private static final String DEFAULT_AGENT_WRITER_TYPE = DD_AGENT_WRITER_TYPE; @@ -217,20 +181,20 @@ public class Config { private static final String DEFAULT_PROPAGATION_STYLE_INJECT = PropagationStyle.DATADOG.name(); private static final boolean DEFAULT_JMX_FETCH_ENABLED = true; - @Deprecated public static final int DEFAULT_JMX_FETCH_STATSD_PORT = 8125; + public static final int DEFAULT_JMX_FETCH_STATSD_PORT = 8125; - @Deprecated public static final boolean DEFAULT_METRICS_ENABLED = false; + public static final boolean DEFAULT_METRICS_ENABLED = false; // No default constants for metrics statsd support -- falls back to jmxfetch values - @Deprecated public static final boolean DEFAULT_LOGS_INJECTION_ENABLED = false; + public static final boolean DEFAULT_LOGS_INJECTION_ENABLED = false; - @Deprecated public static final boolean DEFAULT_PROFILING_ENABLED = false; - @Deprecated public static final int DEFAULT_PROFILING_START_DELAY = 10; - @Deprecated public static final boolean DEFAULT_PROFILING_START_FORCE_FIRST = false; - @Deprecated public static final int DEFAULT_PROFILING_UPLOAD_PERIOD = 60; // 1 min - @Deprecated public static final int DEFAULT_PROFILING_UPLOAD_TIMEOUT = 30; // seconds - @Deprecated public static final String DEFAULT_PROFILING_UPLOAD_COMPRESSION = "on"; - @Deprecated public static final int DEFAULT_PROFILING_PROXY_PORT = 8080; + public static final boolean DEFAULT_PROFILING_ENABLED = false; + public static final int DEFAULT_PROFILING_START_DELAY = 10; + public static final boolean DEFAULT_PROFILING_START_FORCE_FIRST = false; + public static final int DEFAULT_PROFILING_UPLOAD_PERIOD = 60; // 1 min + public static final int DEFAULT_PROFILING_UPLOAD_TIMEOUT = 30; // seconds + public static final String DEFAULT_PROFILING_UPLOAD_COMPRESSION = "on"; + public static final int DEFAULT_PROFILING_PROXY_PORT = 8080; private static final String SPLIT_BY_SPACE_OR_COMMA_REGEX = "[,\\s]+"; @@ -239,9 +203,9 @@ public class Config { private static final boolean DEFAULT_TRACE_EXECUTORS_ALL = false; private static final String DEFAULT_TRACE_EXECUTORS = ""; private static final String DEFAULT_TRACE_METHODS = null; - @Deprecated public static final boolean DEFAULT_TRACE_ANALYTICS_ENABLED = false; - @Deprecated public static final float DEFAULT_ANALYTICS_SAMPLE_RATE = 1.0f; - @Deprecated public static final double DEFAULT_TRACE_RATE_LIMIT = 100; + public static final boolean DEFAULT_TRACE_ANALYTICS_ENABLED = false; + public static final float DEFAULT_ANALYTICS_SAMPLE_RATE = 1.0f; + public static final double DEFAULT_TRACE_RATE_LIMIT = 100; public enum PropagationStyle { DATADOG, From 12b5b0ab08770f4092fc78521146867b1338d605 Mon Sep 17 00:00:00 2001 From: Lev Priima Date: Fri, 10 Apr 2020 09:35:29 -0700 Subject: [PATCH 5/5] retrun 2arg Config ctor --- .../trace/agent/test/utils/ConfigUtils.groovy | 2 +- .../src/main/java/datadog/trace/api/Config.java | 13 ++++++------- .../java/datadog/opentracing/DDSpanContext.java | 1 + .../writer/ddagent/TraceProcessingDisruptor.java | 3 ++- .../api/sampling/RateByServiceSamplerTest.groovy | 3 ++- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy index 62f021d38e1..c1e31efa693 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ConfigUtils.groovy @@ -22,7 +22,7 @@ class ConfigUtils { def existingConfig = Config.get() Properties properties = new Properties() properties.put(name, value) - CONFIG_INSTANCE_FIELD.set(null, new Config(properties)) + CONFIG_INSTANCE_FIELD.set(null, new Config(properties, existingConfig)) assert Config.get() != existingConfig try { return r.call() diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Config.java b/dd-trace-api/src/main/java/datadog/trace/api/Config.java index afc24e8849f..5dc753a186b 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Config.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Config.java @@ -143,7 +143,7 @@ public class Config { public static final String PROFILING_PROXY_PASSWORD = "profiling.proxy.password"; public static final String RUNTIME_ID_TAG = "runtime-id"; - private static final String SERVICE = "service"; + public static final String SERVICE = "service"; public static final String SERVICE_TAG = SERVICE; public static final String HOST_TAG = "host"; public static final String LANGUAGE_TAG_KEY = "language"; @@ -323,8 +323,8 @@ private String profilingProxyPasswordMasker() { private static Properties propertiesFromConfigFile; // Read order: System Properties -> Env Variables, [-> properties file], [-> default value] - // Visible for testing: groovy tests can access private ctor perfectly fine - private Config() { + // Visible for testing + Config() { propertiesFromConfigFile = loadConfigurationFile(); runtimeId = UUID.randomUUID().toString(); @@ -526,9 +526,8 @@ private Config() { log.debug("New instance: {}", this); } - // Read order: Properties -> Default INSTANCE - private Config(final Properties properties) { - final Config parent = INSTANCE; + // Read order: Properties -> Parent + private Config(final Properties properties, final Config parent) { runtimeId = parent.runtimeId; apiKey = properties.getProperty(API_KEY, parent.apiKey); @@ -1349,7 +1348,7 @@ public static Config get(final Properties properties) { if (properties == null || properties.isEmpty()) { return INSTANCE; } else { - return new Config(properties); + return new Config(properties, INSTANCE); } } } diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java index dbb1674d3f8..38ad5535d45 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDSpanContext.java @@ -23,6 +23,7 @@ @Slf4j public class DDSpanContext implements io.opentracing.SpanContext { public static final String PRIORITY_SAMPLING_KEY = "_sampling_priority_v1"; + public static final String SAMPLE_RATE_KEY = "_sample_rate"; public static final String ORIGIN_KEY = "_dd.origin"; public static final String DD_MEASURED = "_dd.measured"; public static final Number DD_MEASURED_DEFAULT = 1; diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/TraceProcessingDisruptor.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/TraceProcessingDisruptor.java index 86d0e7177b3..67c8b91adf9 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/TraceProcessingDisruptor.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/ddagent/TraceProcessingDisruptor.java @@ -3,6 +3,7 @@ import com.lmax.disruptor.EventHandler; import datadog.common.exec.DaemonThreadFactory; import datadog.opentracing.DDSpan; +import datadog.opentracing.DDSpanContext; import datadog.trace.common.writer.DDAgentWriter; import java.util.List; import lombok.extern.slf4j.Slf4j; @@ -65,7 +66,7 @@ public void onEvent( // attempt to have agent scale the metrics properly ((DDSpan) event.data.get(0).getLocalRootSpan()) .context() - .setMetric("_sample_rate", 1d / event.representativeCount); + .setMetric(DDSpanContext.SAMPLE_RATE_KEY, 1d / event.representativeCount); } try { final byte[] serializedTrace = api.serializeTrace(event.data); diff --git a/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy b/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy index 5b147764f31..4ecf4637001 100644 --- a/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy @@ -2,6 +2,7 @@ package datadog.trace.api.sampling import datadog.opentracing.DDSpan +import datadog.opentracing.DDSpanContext import datadog.opentracing.DDTracer import datadog.opentracing.SpanFactory import datadog.trace.api.DDTags @@ -68,7 +69,7 @@ class RateByServiceSamplerTest extends DDSpecification { // sets correctly on root span span.getSamplingPriority() == PrioritySampling.SAMPLER_KEEP // RateByServiceSamler must not set the sample rate - span.getMetrics().get("_sample_rate") == null + span.getMetrics().get(DDSpanContext.SAMPLE_RATE_KEY) == null } def "sampling priority set when service later"() {