diff --git a/dd-trace-api/dd-trace-api.gradle b/dd-trace-api/dd-trace-api.gradle index 8feb58f4a5..e9c3f9e03f 100644 --- a/dd-trace-api/dd-trace-api.gradle +++ b/dd-trace-api/dd-trace-api.gradle @@ -1,6 +1,8 @@ apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/publish.gradle" +minimumBranchCoverage = 0.8 + // These are tested outside of this module since this module mainly just defines 'API' excludedClassesConverage += [ 'datadog.trace.api.DDSpanTypes', 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 f07d3a79f8..5db2e6a3a3 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 @@ -549,9 +549,7 @@ public class Config { private static Set parseIntegerRangeSet(String str, final String settingName) throws NumberFormatException { - if (str == null) { - str = ""; - } + assert str != null; str = str.replaceAll("\\s", ""); if (!str.matches("\\d{3}(?:-\\d{3})?(?:,\\d{3}(?:-\\d{3})?)*")) { log.warn( 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 cf441400d1..cc5c14f570 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 @@ -57,7 +57,7 @@ class ConfigTest extends Specification { def "verify defaults"() { when: - def config = Config.get() + Config config = provider() then: config.serviceName == "unnamed-java-app" @@ -85,6 +85,73 @@ class ConfigTest extends Specification { config.jmxFetchStatsdHost == null config.jmxFetchStatsdPort == DEFAULT_JMX_FETCH_STATSD_PORT config.toString().contains("unnamed-java-app") + + where: + provider << [{ new Config() }, { Config.get() }, { + def props = new Properties() + props.setProperty("something", "unused") + Config.get(props) + }] + } + + def "specify overrides via properties"() { + setup: + def prop = new Properties() + prop.setProperty(SERVICE_NAME, "something else") + prop.setProperty(WRITER_TYPE, "LoggingWriter") + prop.setProperty(AGENT_HOST, "somehost") + prop.setProperty(TRACE_AGENT_PORT, "123") + prop.setProperty(AGENT_UNIX_DOMAIN_SOCKET, "somepath") + prop.setProperty(AGENT_PORT_LEGACY, "456") + prop.setProperty(PRIORITY_SAMPLING, "false") + prop.setProperty(TRACE_RESOLVER_ENABLED, "false") + prop.setProperty(SERVICE_MAPPING, "a:1") + prop.setProperty(GLOBAL_TAGS, "b:2") + prop.setProperty(SPAN_TAGS, "c:3") + prop.setProperty(JMX_TAGS, "d:4") + prop.setProperty(HEADER_TAGS, "e:5") + prop.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") + prop.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111") + prop.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") + prop.setProperty(PARTIAL_FLUSH_MIN_SPANS, "15") + prop.setProperty(RUNTIME_CONTEXT_FIELD_INJECTION, "false") + prop.setProperty(PROPAGATION_STYLE_EXTRACT, "Datadog, B3") + prop.setProperty(PROPAGATION_STYLE_INJECT, "B3, Datadog") + prop.setProperty(JMX_FETCH_ENABLED, "true") + prop.setProperty(JMX_FETCH_METRICS_CONFIGS, "/foo.yaml,/bar.yaml") + prop.setProperty(JMX_FETCH_CHECK_PERIOD, "100") + prop.setProperty(JMX_FETCH_REFRESH_BEANS_PERIOD, "200") + prop.setProperty(JMX_FETCH_STATSD_HOST, "statsd host") + prop.setProperty(JMX_FETCH_STATSD_PORT, "321") + + when: + Config config = Config.get(prop) + + then: + config.serviceName == "something else" + config.writerType == "LoggingWriter" + config.agentHost == "somehost" + config.agentPort == 123 + config.agentUnixDomainSocket == "somepath" + config.prioritySamplingEnabled == false + config.traceResolverEnabled == false + config.serviceMapping == [a: "1"] + config.mergedSpanTags == [b: "2", c: "3"] + config.mergedJmxTags == [b: "2", d: "4", (RUNTIME_ID_TAG): config.getRuntimeId(), (SERVICE): config.serviceName, (LANGUAGE_TAG_KEY): LANGUAGE_TAG_VALUE] + config.headerTags == [e: "5"] + config.httpServerErrorStatuses == (122..457).toSet() + config.httpClientErrorStatuses == (111..111).toSet() + config.httpClientSplitByDomain == true + config.partialFlushMinSpans == 15 + config.runtimeContextFieldInjection == false + config.propagationStylesToExtract.toList() == [Config.PropagationStyle.DATADOG, Config.PropagationStyle.B3] + config.propagationStylesToInject.toList() == [Config.PropagationStyle.B3, Config.PropagationStyle.DATADOG] + config.jmxFetchEnabled == true + config.jmxFetchMetricsConfigs == ["/foo.yaml", "/bar.yaml"] + config.jmxFetchCheckPeriod == 100 + config.jmxFetchRefreshBeansPeriod == 200 + config.jmxFetchStatsdHost == "statsd host" + config.jmxFetchStatsdPort == 321 } def "specify overrides via system properties"() { @@ -117,7 +184,7 @@ class ConfigTest extends Specification { System.setProperty(PREFIX + JMX_FETCH_STATSD_PORT, "321") when: - def config = new Config() + Config config = new Config() then: config.serviceName == "something else" @@ -457,14 +524,22 @@ class ConfigTest extends Specification { System.setProperty(PREFIX + SERVICE_MAPPING, mapString) System.setProperty(PREFIX + SPAN_TAGS, mapString) System.setProperty(PREFIX + HEADER_TAGS, mapString) + def props = new Properties() + props.setProperty(SERVICE_MAPPING, mapString) + props.setProperty(SPAN_TAGS, mapString) + props.setProperty(HEADER_TAGS, mapString) when: def config = new Config() + def propConfig = Config.get(props) then: config.serviceMapping == map config.spanTags == map config.headerTags == map + propConfig.serviceMapping == map + propConfig.spanTags == map + propConfig.headerTags == map where: mapString | map @@ -492,17 +567,25 @@ class ConfigTest extends Specification { setup: System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, value) System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, value) + def props = new Properties() + props.setProperty(HTTP_CLIENT_ERROR_STATUSES, value) + props.setProperty(HTTP_SERVER_ERROR_STATUSES, value) when: def config = new Config() + def propConfig = Config.get(props) then: if (expected) { assert config.httpServerErrorStatuses == expected.toSet() assert config.httpClientErrorStatuses == expected.toSet() + assert propConfig.httpServerErrorStatuses == expected.toSet() + assert propConfig.httpClientErrorStatuses == expected.toSet() } else { assert config.httpServerErrorStatuses == Config.DEFAULT_HTTP_SERVER_ERROR_STATUSES assert config.httpClientErrorStatuses == Config.DEFAULT_HTTP_CLIENT_ERROR_STATUSES + assert propConfig.httpServerErrorStatuses == Config.DEFAULT_HTTP_SERVER_ERROR_STATUSES + assert propConfig.httpClientErrorStatuses == Config.DEFAULT_HTTP_CLIENT_ERROR_STATUSES } where: