diff --git a/internal-api/src/main/java/datadog/trace/api/ConfigOrigin.java b/internal-api/src/main/java/datadog/trace/api/ConfigOrigin.java index 935f410ebe1..850c39c9dea 100644 --- a/internal-api/src/main/java/datadog/trace/api/ConfigOrigin.java +++ b/internal-api/src/main/java/datadog/trace/api/ConfigOrigin.java @@ -19,6 +19,8 @@ public enum ConfigOrigin { DD_CONFIG("dd_config"), /** set for cases where it is difficult/not possible to determine the source of a config. */ UNKNOWN("unknown"), + /** set when the config is calculated from multiple configs */ + CALCULATED("calculated"), /** set when the user has not set any configuration for the key (defaults to a value) */ DEFAULT("default"); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java index 1edeb072c80..f7b890f653e 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java @@ -255,7 +255,12 @@ public Map getMergedMap(String key, String... aliases) { String value = sources[i].get(key, aliases); Map parsedMap = ConfigConverter.parseMap(value, key); if (!parsedMap.isEmpty()) { - origin = sources[i].origin(); + if (origin != ConfigOrigin.DEFAULT) { + // if we already have a non-default origin, the value is calculated from multiple sources + origin = ConfigOrigin.CALCULATED; + } else { + origin = sources[i].origin(); + } } merged.putAll(parsedMap); } @@ -277,7 +282,12 @@ public Map getMergedTagsMap(String key, String... aliases) { Map parsedMap = ConfigConverter.parseTraceTagsMap(value, ':', Arrays.asList(',', ' ')); if (!parsedMap.isEmpty()) { - origin = sources[i].origin(); + if (origin != ConfigOrigin.DEFAULT) { + // if we already have a non-default origin, the value is calculated from multiple sources + origin = ConfigOrigin.CALCULATED; + } else { + origin = sources[i].origin(); + } } merged.putAll(parsedMap); } @@ -298,7 +308,12 @@ public Map getOrderedMap(String key) { String value = sources[i].get(key); Map parsedMap = ConfigConverter.parseOrderedMap(value, key); if (!parsedMap.isEmpty()) { - origin = sources[i].origin(); + if (origin != ConfigOrigin.DEFAULT) { + // if we already have a non-default origin, the value is calculated from multiple sources + origin = ConfigOrigin.CALCULATED; + } else { + origin = sources[i].origin(); + } } merged.putAll(parsedMap); } @@ -322,7 +337,13 @@ public Map getMergedMapWithOptionalMappings( Map parsedMap = ConfigConverter.parseMapWithOptionalMappings(value, key, defaultPrefix, lowercaseKeys); if (!parsedMap.isEmpty()) { - origin = sources[i].origin(); + if (origin != ConfigOrigin.DEFAULT) { + // if we already have a non-default origin, the value is calculated from multiple + // sources + origin = ConfigOrigin.CALCULATED; + } else { + origin = sources[i].origin(); + } } merged.putAll(parsedMap); } diff --git a/internal-api/src/test/groovy/datadog/trace/api/ConfigCollectorTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/ConfigCollectorTest.groovy index 12a52136eb0..fd16d9b56bf 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ConfigCollectorTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ConfigCollectorTest.groovy @@ -64,22 +64,26 @@ class ConfigCollectorTest extends DDSpecification { def "should collect merged data from multiple sources"() { setup: - injectEnvConfig(Strings.toEnvVar(configKey), configValue1) - injectSysConfig(configKey, configValue2) + injectEnvConfig(Strings.toEnvVar(configKey), envValue) + if (jvmValue != null) { + injectSysConfig(configKey, jvmValue) + } expect: def setting = ConfigCollector.get().collect().get(configKey) setting.stringValue() == expectedValue - setting.origin == ConfigOrigin.JVM_PROP + setting.origin == expectedOrigin where: - configKey | configValue1 | configValue2 | expectedValue + configKey | envValue | jvmValue | expectedValue | expectedOrigin // ConfigProvider.getMergedMap - TracerConfig.TRACE_PEER_SERVICE_MAPPING | "service1:best_service,userService:my_service" | "service2:backup_service" | "service2:backup_service,service1:best_service,userService:my_service" + TracerConfig.TRACE_PEER_SERVICE_MAPPING | "service1:best_service,userService:my_service" | "service2:backup_service" | "service2:backup_service,service1:best_service,userService:my_service" | ConfigOrigin.CALCULATED // ConfigProvider.getOrderedMap - TracerConfig.TRACE_HTTP_SERVER_PATH_RESOURCE_NAME_MAPPING | "/asdf/*:/test,/b:some" | "/a:prop" | "/asdf/*:/test,/b:some,/a:prop" + TracerConfig.TRACE_HTTP_SERVER_PATH_RESOURCE_NAME_MAPPING | "/asdf/*:/test,/b:some" | "/a:prop" | "/asdf/*:/test,/b:some,/a:prop" | ConfigOrigin.CALCULATED // ConfigProvider.getMergedMapWithOptionalMappings - TracerConfig.HEADER_TAGS | "j:ten" | "e:five,b:six" | "e:five,j:ten,b:six" + TracerConfig.HEADER_TAGS | "j:ten" | "e:five,b:six" | "e:five,j:ten,b:six" | ConfigOrigin.CALCULATED + // ConfigProvider.getMergedMap, but only one source + TracerConfig.TRACE_PEER_SERVICE_MAPPING | "service1:best_service,userService:my_service" | null | "service1:best_service,userService:my_service" | ConfigOrigin.ENV } def "default not-null config settings are collected"() {