From b40c03380553d35b62f03480bcd7d26a261ad2b2 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Wed, 27 Aug 2025 10:12:28 +0200 Subject: [PATCH] feat(config): Refactoring config into its own module Using `utils` for now as it has `:dd-trace-api` as dependency so can't be considered as a `:component`. --- .../java/datadog/trace/bootstrap/Agent.java | 4 +- .../civisibility/CiVisibilitySmokeTest.groovy | 5 +- .../trace/civisibility/ProcessHierarchy.java | 2 +- .../buildsystem/BuildSystemModuleImpl.java | 47 ++++------ .../civisibility/ci/CITagsProviderTest.groovy | 7 +- .../test/InstrumentationSpecification.groovy | 4 +- ...veImageGeneratorRunnerInstrumentation.java | 2 +- .../legacy/GradleProjectConfigurator.groovy | 3 +- .../gradle/GradleDaemonInjectionUtils.java | 2 +- .../datadog/smoketest/MavenSmokeTest.groovy | 7 +- internal-api/build.gradle.kts | 1 + .../main/java/datadog/trace/api/Config.java | 12 ++- .../java/datadog/trace/api/DynamicConfig.java | 11 +-- .../datadog/trace/api/InstrumenterConfig.java | 7 ++ .../api/git/UserSuppliedGitInfoBuilder.java | 6 +- ...r.java => OtelEnvMetricCollectorImpl.java} | 25 +++--- .../java/datadog/trace/util/PidHelper.java | 12 +-- .../main/java/datadog/trace/util/Strings.java | 80 ----------------- .../trace/api/ConfigCollectorTest.groovy | 6 +- .../git/UserSuppliedGitInfoBuilderTest.groovy | 22 ++--- ... => OtelEnvMetricCollectorImplTest.groovy} | 18 ++-- .../datadog/trace/util/StringsTest.groovy | 2 +- settings.gradle.kts | 1 + .../metric/OtelEnvMetricPeriodicAction.java | 4 +- .../TelemetryRunnableSpecification.groovy | 5 +- .../TelemetryServiceSpecification.groovy | 12 +-- .../TelemetrySystemSpecification.groovy | 6 +- utils/config-utils/build.gradle.kts | 14 +++ .../datadog/trace/api/ConfigCollector.java | 0 .../java/datadog/trace/api/ConfigOrigin.java | 0 .../java/datadog/trace/api/ConfigSetting.java | 0 .../trace/api/env/CapturedEnvironment.java | 0 .../api/telemetry/OtelEnvMetricCollector.java | 9 ++ .../OtelEnvMetricCollectorProvider.java | 18 ++++ .../config/provider/AgentArgsInjector.java | 5 +- .../config/provider/AgentArgsParser.java | 0 .../CapturedEnvironmentConfigSource.java | 0 .../config/provider/ConfigConverter.java | 16 ++-- .../config/provider/ConfigProvider.java | 0 .../provider/EnvironmentConfigSource.java | 2 +- .../provider/OtelEnvironmentConfigSource.java | 23 +++-- .../provider/PropertiesConfigSource.java | 2 +- .../config/provider/StableConfigParser.java | 0 .../config/provider/StableConfigSource.java | 2 +- .../SystemPropertiesConfigSource.java | 2 +- .../config/provider/stableconfig/Rule.java | 0 .../provider/stableconfig/Selector.java | 0 .../provider/stableconfig/StableConfig.java | 0 .../StableConfigMappingException.java | 0 .../datadog/trace/util/ConfigStrings.java | 87 +++++++++++++++++++ 50 files changed, 282 insertions(+), 211 deletions(-) rename internal-api/src/main/java/datadog/trace/api/telemetry/{OtelEnvMetricCollector.java => OtelEnvMetricCollectorImpl.java} (74%) rename internal-api/src/test/groovy/datadog/trace/api/telemetry/{OtelEnvMetricCollectorTest.groovy => OtelEnvMetricCollectorImplTest.groovy} (95%) create mode 100644 utils/config-utils/build.gradle.kts rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/api/ConfigCollector.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/api/ConfigOrigin.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/api/ConfigSetting.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/api/env/CapturedEnvironment.java (100%) create mode 100644 utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java create mode 100644 utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorProvider.java rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java (92%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsParser.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/CapturedEnvironmentConfigSource.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java (97%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java (84%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java (94%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java (92%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java (97%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java (85%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Selector.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfig.java (100%) rename {internal-api => utils/config-utils}/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java (100%) create mode 100644 utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index cebdff72ce0..db0990aa8fd 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -14,8 +14,8 @@ import static datadog.trace.util.AgentThreadFactory.AgentThread.PROFILER_STARTUP; import static datadog.trace.util.AgentThreadFactory.AgentThread.TRACE_STARTUP; import static datadog.trace.util.AgentThreadFactory.newAgentThread; -import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; -import static datadog.trace.util.Strings.toEnvVar; +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName; +import static datadog.trace.util.ConfigStrings.toEnvVar; import datadog.environment.EnvironmentVariables; import datadog.environment.JavaVirtualMachine; diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 1e8c15fd819..d434360d14c 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -4,10 +4,11 @@ import datadog.trace.api.Config import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.config.CiVisibilityConfig import datadog.trace.api.config.GeneralConfig -import datadog.trace.util.Strings import spock.lang.Specification import spock.util.environment.Jvm +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName + abstract class CiVisibilitySmokeTest extends Specification { static final List SMOKE_IGNORED_TAGS = ["content.meta.['_dd.integration']"] @@ -73,7 +74,7 @@ abstract class CiVisibilitySmokeTest extends Specification { argMap.put(CiVisibilityConfig.CIVISIBILITY_DEBUG_PORT, "5055") } - String agentArgs = argMap.collect { k, v -> "${Strings.propertyNameToSystemPropertyName(k)}=${v}" }.join(",") + String agentArgs = argMap.collect { k, v -> "${propertyNameToSystemPropertyName(k)}=${v}" }.join(",") arguments += "-javaagent:${AGENT_JAR}=${agentArgs}".toString() return arguments diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java index 3c899cb25f3..446bfd5978f 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/ProcessHierarchy.java @@ -3,7 +3,7 @@ import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_HOST; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.extractContextAndGetSpanContext; -import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName; import datadog.environment.SystemProperties; import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java index 2dc9fc47825..acde85fd5fe 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java @@ -1,6 +1,7 @@ package datadog.trace.civisibility.domain.buildsystem; import static datadog.context.propagation.Propagators.defaultPropagator; +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName; import datadog.communication.ddagent.TracerVersion; import datadog.context.propagation.CarrierSetter; @@ -31,7 +32,6 @@ import datadog.trace.civisibility.ipc.SignalType; import datadog.trace.civisibility.source.LinesResolver; import datadog.trace.civisibility.source.SourcePathResolver; -import datadog.trace.util.Strings; import java.net.InetSocketAddress; import java.nio.file.Path; import java.util.Collection; @@ -148,81 +148,72 @@ private Map getPropertiesPropagatedToChildProcess( } propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_ITR_ENABLED), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_ITR_ENABLED), Boolean.toString(executionSettings.isItrEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_ENABLED), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_ENABLED), Boolean.toString(executionSettings.isCodeCoverageEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_TEST_SKIPPING_ENABLED), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_TEST_SKIPPING_ENABLED), Boolean.toString(executionSettings.isTestSkippingEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_FLAKY_RETRY_ENABLED), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_FLAKY_RETRY_ENABLED), Boolean.toString(executionSettings.isFlakyTestRetriesEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( + propertyNameToSystemPropertyName( CiVisibilityConfig.CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED), Boolean.toString(executionSettings.isImpactedTestsDetectionEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( + propertyNameToSystemPropertyName( CiVisibilityConfig.CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED), Boolean.toString(executionSettings.getEarlyFlakeDetectionSettings().isEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.TEST_MANAGEMENT_ENABLED), + propertyNameToSystemPropertyName(CiVisibilityConfig.TEST_MANAGEMENT_ENABLED), Boolean.toString(executionSettings.getTestManagementSettings().isEnabled())); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.TEST_FAILED_TEST_REPLAY_ENABLED), + propertyNameToSystemPropertyName(CiVisibilityConfig.TEST_FAILED_TEST_REPLAY_ENABLED), Boolean.toString(executionSettings.isFailedTestReplayEnabled())); // explicitly disable build instrumentation in child processes, // because some projects run "embedded" Maven/Gradle builds as part of their integration tests, // and we don't want to show those as if they were regular build executions propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( + propertyNameToSystemPropertyName( CiVisibilityConfig.CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED), Boolean.toString(false)); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION), TracerVersion.TRACER_VERSION); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME), serviceName); + propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME), serviceName); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME_SET_BY_USER), + propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME_SET_BY_USER), String.valueOf(userProvidedServiceName)); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME), - moduleName); + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME), moduleName); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_TEST_COMMAND), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_TEST_COMMAND), startCommand); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_HOST), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_HOST), signalServerAddress != null ? signalServerAddress.getHostName() : null); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT), String.valueOf(signalServerAddress != null ? signalServerAddress.getPort() : 0)); List coverageIncludedPackages = sessionSettings.getCoverageIncludedPackages(); propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( - CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_INCLUDES), + propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_INCLUDES), String.join(":", coverageIncludedPackages)); if (jacocoAgent != null && !config.isCiVisibilityCoverageLinesDisabled()) { @@ -234,7 +225,7 @@ private Map getPropertiesPropagatedToChildProcess( // This setting is only relevant if per-test code coverage is enabled, // otherwise it has no effect. propagatedSystemProperties.put( - Strings.propertyNameToSystemPropertyName( + propertyNameToSystemPropertyName( CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_LINES_ENABLED), Boolean.toString(true)); } diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/ci/CITagsProviderTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/ci/CITagsProviderTest.groovy index 799cbafb476..6939a087692 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/ci/CITagsProviderTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/ci/CITagsProviderTest.groovy @@ -8,7 +8,6 @@ import datadog.trace.civisibility.ci.env.CiEnvironmentImpl import datadog.trace.civisibility.git.CILocalGitInfoBuilder import datadog.trace.civisibility.git.CIProviderGitInfoBuilder import datadog.trace.civisibility.git.tree.GitClient -import datadog.trace.util.Strings import org.junit.Rule import org.junit.contrib.java.lang.system.EnvironmentVariables import org.junit.contrib.java.lang.system.RestoreSystemProperties @@ -17,6 +16,8 @@ import spock.lang.Specification import java.nio.file.Path import java.nio.file.Paths +import static datadog.trace.util.ConfigStrings.propertyNameToEnvironmentVariableName + abstract class CITagsProviderTest extends Specification { static final CI_WORKSPACE_PATH_FOR_TESTS = "ci/ci_workspace_for_tests" @@ -70,7 +71,7 @@ abstract class CITagsProviderTest extends Specification { environmentVariables.set(it.key, it.value) } - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_COMMIT_SHA), "1234567890123456789012345678901234567890") + environmentVariables.set(propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_COMMIT_SHA), "1234567890123456789012345678901234567890") when: CIProviderInfoFactory ciProviderInfoFactory = new CIProviderInfoFactory(Config.get(), GIT_FOLDER_FOR_TESTS, new CiEnvironmentImpl(System.getenv())) @@ -89,7 +90,7 @@ abstract class CITagsProviderTest extends Specification { environmentVariables.set(it.key, it.value) } - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_REPOSITORY_URL), "local supplied repo url") + environmentVariables.set(propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_REPOSITORY_URL), "local supplied repo url") when: CIProviderInfoFactory ciProviderInfoFactory = new CIProviderInfoFactory(Config.get(), GIT_FOLDER_FOR_TESTS, new CiEnvironmentImpl(System.getenv())) diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy index 05ae9c50323..4dba1ca39df 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy @@ -50,7 +50,7 @@ import datadog.trace.core.PendingTrace import datadog.trace.core.datastreams.DefaultDataStreamsMonitoring import datadog.trace.test.util.DDSpecification import datadog.trace.util.AgentTaskScheduler -import datadog.trace.util.Strings +import datadog.trace.util.ConfigStrings import de.thetaphi.forbiddenapis.SuppressForbidden import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import groovy.transform.stc.ClosureParams @@ -117,7 +117,7 @@ abstract class InstrumentationSpecification extends DDSpecification implements A StringBuilder ddEnvVars = new StringBuilder() for (Map.Entry entry : System.getProperties().entrySet()) { if (entry.getKey().toString().startsWith("dd.")) { - ddEnvVars.append(Strings.systemPropertyNameToEnvironmentVariableName(entry.getKey().toString())) + ddEnvVars.append(ConfigStrings.systemPropertyNameToEnvironmentVariableName(entry.getKey().toString())) .append("=").append(entry.getValue()).append(",") } } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java index 382a8266c78..b61ab5e7531 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java @@ -100,7 +100,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[ + "datadog.trace.api.ResolverCacheConfig$5:build_time," + "datadog.trace.api.TracePropagationStyle:build_time," + "datadog.trace.api.TracePropagationBehaviorExtract:build_time," - + "datadog.trace.api.telemetry.OtelEnvMetricCollector:build_time," + + "datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl:build_time," + "datadog.trace.api.profiling.ProfilingEnablement:build_time," + "datadog.trace.bootstrap.config.provider.ConfigConverter:build_time," + "datadog.trace.bootstrap.config.provider.ConfigConverter$ValueOfLookup:build_time," diff --git a/dd-java-agent/instrumentation/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleProjectConfigurator.groovy b/dd-java-agent/instrumentation/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleProjectConfigurator.groovy index 2065a267ba7..cc7b1bf205d 100644 --- a/dd-java-agent/instrumentation/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleProjectConfigurator.groovy +++ b/dd-java-agent/instrumentation/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleProjectConfigurator.groovy @@ -4,6 +4,7 @@ import datadog.trace.api.Config import datadog.trace.api.civisibility.domain.BuildSessionSettings import datadog.trace.api.config.CiVisibilityConfig import datadog.trace.bootstrap.DatadogClassLoader +import datadog.trace.util.ConfigStrings import datadog.trace.util.Strings import org.gradle.api.Project import org.gradle.api.Task @@ -73,7 +74,7 @@ class GradleProjectConfigurator { } String taskPath = task.getPath() - jvmArgs.add("-D" + Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME) + '=' + taskPath) + jvmArgs.add("-D" + ConfigStrings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME) + '=' + taskPath) jvmArgs.add("-javaagent:" + config.ciVisibilityAgentJarFile.toPath()) diff --git a/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java b/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java index 7cf8c0eac61..69528065c3e 100644 --- a/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java +++ b/dd-java-agent/instrumentation/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleDaemonInjectionUtils.java @@ -1,7 +1,7 @@ package datadog.trace.instrumentation.gradle; import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION; -import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName; import datadog.environment.SystemProperties; import datadog.trace.api.Config; diff --git a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy index ac36da72230..8a56ab596a6 100644 --- a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy +++ b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy @@ -1,6 +1,5 @@ package datadog.smoketest - import datadog.trace.api.civisibility.CIConstants import datadog.trace.api.config.CiVisibilityConfig import datadog.trace.api.config.GeneralConfig @@ -20,7 +19,11 @@ import spock.util.environment.Jvm import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory -import java.nio.file.* +import java.nio.file.FileVisitResult +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.SimpleFileVisitor import java.nio.file.attribute.BasicFileAttributes import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException diff --git a/internal-api/build.gradle.kts b/internal-api/build.gradle.kts index 2231ad87739..94c381e6a5f 100644 --- a/internal-api/build.gradle.kts +++ b/internal-api/build.gradle.kts @@ -279,6 +279,7 @@ dependencies { api(project(":components:environment")) api(project(":components:json")) api(project(":components:yaml")) + api(project(":utils:config-utils")) api(project(":utils:time-utils")) // has to be loaded by system classloader: diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index a705725c31c..bb4e4f65d12 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -634,7 +634,7 @@ import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; import static datadog.trace.util.CollectionUtils.tryMakeImmutableList; import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet; -import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName; +import static datadog.trace.util.ConfigStrings.propertyNameToEnvironmentVariableName; import datadog.environment.EnvironmentVariables; import datadog.environment.JavaVirtualMachine; @@ -652,11 +652,14 @@ import datadog.trace.api.profiling.ProfilingEnablement; import datadog.trace.api.rum.RumInjectorConfig; import datadog.trace.api.rum.RumInjectorConfig.PrivacyLevel; +import datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl; +import datadog.trace.api.telemetry.OtelEnvMetricCollectorProvider; import datadog.trace.bootstrap.config.provider.CapturedEnvironmentConfigSource; import datadog.trace.bootstrap.config.provider.ConfigProvider; import datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.context.TraceScope; +import datadog.trace.util.ConfigStrings; import datadog.trace.util.PidHelper; import datadog.trace.util.RandomUtils; import datadog.trace.util.Strings; @@ -1239,6 +1242,11 @@ public static String getHostName() { private final RumInjectorConfig rumInjectorConfig; + static { + // Bind telemetry collector to config module before initializing ConfigProvider + OtelEnvMetricCollectorProvider.register(OtelEnvMetricCollectorImpl.getInstance()); + } + // Read order: System Properties -> Env Variables, [-> properties file], [-> default value] private Config() { this(ConfigProvider.createDefault()); @@ -5246,7 +5254,7 @@ static String initHostName() { } catch (Throwable t) { // Ignore } - possibleHostname = Strings.trim(possibleHostname); + possibleHostname = ConfigStrings.trim(possibleHostname); if (!possibleHostname.isEmpty()) { log.debug("Determined hostname from file {}", hostNameFile); return possibleHostname; diff --git a/internal-api/src/main/java/datadog/trace/api/DynamicConfig.java b/internal-api/src/main/java/datadog/trace/api/DynamicConfig.java index 1f995ccf7a5..ce886edefc1 100644 --- a/internal-api/src/main/java/datadog/trace/api/DynamicConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/DynamicConfig.java @@ -11,10 +11,11 @@ import static datadog.trace.api.config.TracerConfig.TRACE_SAMPLE_RATE; import static datadog.trace.api.config.TracerConfig.TRACE_SAMPLING_RULES; import static datadog.trace.util.CollectionUtils.tryMakeImmutableMap; +import static datadog.trace.util.ConfigStrings.normalizedHeaderTag; +import static datadog.trace.util.ConfigStrings.trim; import datadog.trace.api.sampling.SamplingRule.SpanSamplingRule; import datadog.trace.api.sampling.SamplingRule.TraceSamplingRule; -import datadog.trace.util.Strings; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -248,11 +249,11 @@ static Map cleanMapping( } static String key(Map.Entry association) { - return Strings.trim(association.getKey()); + return trim(association.getKey()); } static String value(Map.Entry association) { - return Strings.trim(association.getValue()); + return trim(association.getValue()); } static String lowerKey(Map.Entry association) { @@ -263,7 +264,7 @@ static String requestTag(Map.Entry association) { String requestTag = value(association); if (requestTag.isEmpty()) { // normalization is only applied when generating default tag names; see ConfigConverter - requestTag = "http.request.headers." + Strings.normalizedHeaderTag(association.getKey()); + requestTag = "http.request.headers." + normalizedHeaderTag(association.getKey()); } return requestTag; } @@ -272,7 +273,7 @@ static String responseTag(Map.Entry association) { String responseTag = value(association); if (responseTag.isEmpty()) { // normalization is only applied when generating default tag names; see ConfigConverter - responseTag = "http.response.headers." + Strings.normalizedHeaderTag(association.getKey()); + responseTag = "http.response.headers." + normalizedHeaderTag(association.getKey()); } return responseTag; } diff --git a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java index 532d1472c6e..38ec6957f69 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -77,6 +77,8 @@ import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet; import datadog.trace.api.profiling.ProfilingEnablement; +import datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl; +import datadog.trace.api.telemetry.OtelEnvMetricCollectorProvider; import datadog.trace.bootstrap.config.provider.ConfigProvider; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.Method; @@ -172,6 +174,11 @@ public class InstrumenterConfig { private final boolean rumEnabled; + static { + // Bind telemetry collector to config module before initializing ConfigProvider + OtelEnvMetricCollectorProvider.register(OtelEnvMetricCollectorImpl.getInstance()); + } + private InstrumenterConfig() { this(ConfigProvider.createDefault()); } diff --git a/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java b/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java index 92a37b109b4..eb64437f4a5 100644 --- a/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java +++ b/internal-api/src/main/java/datadog/trace/api/git/UserSuppliedGitInfoBuilder.java @@ -6,7 +6,7 @@ import datadog.trace.api.config.GeneralConfig; import datadog.trace.bootstrap.config.provider.ConfigProvider; import datadog.trace.bootstrap.instrumentation.api.Tags; -import datadog.trace.util.Strings; +import datadog.trace.util.ConfigStrings; import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,7 +82,7 @@ public GitInfo build(@Nullable String repositoryPath) { if (repoUrl == null || repoUrl.isEmpty()) { log.error( "Could not resolve git repository URL (can be provided via " - + Strings.propertyNameToEnvironmentVariableName(DD_GIT_REPOSITORY_URL) + + ConfigStrings.propertyNameToEnvironmentVariableName(DD_GIT_REPOSITORY_URL) + " env var or corresponding system property, " + GeneralConfig.TAGS + " config property or by embedding git metadata at build time)"); @@ -94,7 +94,7 @@ public GitInfo build(@Nullable String repositoryPath) { "Git commit SHA could not be resolved or is invalid: " + commitSha + " (can be provided via " - + Strings.propertyNameToEnvironmentVariableName(DD_GIT_COMMIT_SHA) + + ConfigStrings.propertyNameToEnvironmentVariableName(DD_GIT_COMMIT_SHA) + " env var or corresponding system property, " + GeneralConfig.TAGS + " config property or by embedding git metadata at build time; must be a full-length SHA"); diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java similarity index 74% rename from internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java rename to internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java index 11837723a5c..5f01d884a65 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorImpl.java @@ -9,27 +9,28 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OtelEnvMetricCollector - implements MetricCollector { - private static final Logger log = LoggerFactory.getLogger(OtelEnvMetricCollector.class); +public class OtelEnvMetricCollectorImpl + implements MetricCollector, OtelEnvMetricCollector { + private static final Logger log = LoggerFactory.getLogger(OtelEnvMetricCollectorImpl.class); private static final String OTEL_ENV_HIDING_METRIC_NAME = "otel.env.hiding"; private static final String OTEL_ENV_INVALID_METRIC_NAME = "otel.env.invalid"; private static final String OTEL_ENV_UNSUPPORTED_METRIC_NAME = "otel.env.unsupported"; private static final String CONFIG_OTEL_KEY_TAG = "config_opentelemetry:"; private static final String CONFIG_DATADOG_KEY_TAG = "config_datadog:"; private static final String NAMESPACE = "tracers"; - private static final OtelEnvMetricCollector INSTANCE = new OtelEnvMetricCollector(); + private static final OtelEnvMetricCollectorImpl INSTANCE = new OtelEnvMetricCollectorImpl(); - private final BlockingQueue metricsQueue; + private final BlockingQueue metricsQueue; - private OtelEnvMetricCollector() { + private OtelEnvMetricCollectorImpl() { this.metricsQueue = new ArrayBlockingQueue<>(RAW_QUEUE_SIZE); } - public static OtelEnvMetricCollector getInstance() { + public static OtelEnvMetricCollectorImpl getInstance() { return INSTANCE; } + @Override public void setHidingOtelEnvVarMetric(String otelName, String ddName) { setMetricOtelEnvVarMetric( OTEL_ENV_HIDING_METRIC_NAME, @@ -37,6 +38,7 @@ public void setHidingOtelEnvVarMetric(String otelName, String ddName) { CONFIG_DATADOG_KEY_TAG + ddName); } + @Override public void setInvalidOtelEnvVarMetric(String otelName, String ddName) { setMetricOtelEnvVarMetric( OTEL_ENV_INVALID_METRIC_NAME, @@ -44,13 +46,15 @@ public void setInvalidOtelEnvVarMetric(String otelName, String ddName) { CONFIG_DATADOG_KEY_TAG + ddName); } + @Override public void setUnsupportedOtelEnvVarMetric(String otelName) { setMetricOtelEnvVarMetric(OTEL_ENV_UNSUPPORTED_METRIC_NAME, CONFIG_OTEL_KEY_TAG + otelName); } private void setMetricOtelEnvVarMetric(String metricName, final String... tags) { if (!metricsQueue.offer( - new OtelEnvMetricCollector.OtelEnvMetric(NAMESPACE, true, metricName, "count", 1, tags))) { + new OtelEnvMetricCollectorImpl.OtelEnvMetric( + NAMESPACE, true, metricName, "count", 1, tags))) { log.debug("Unable to add telemetry metric {} for {}", metricName, tags[0]); } } @@ -61,11 +65,12 @@ public void prepareMetrics() { } @Override - public Collection drain() { + public Collection drain() { if (this.metricsQueue.isEmpty()) { return Collections.emptyList(); } - List drained = new ArrayList<>(this.metricsQueue.size()); + List drained = + new ArrayList<>(this.metricsQueue.size()); this.metricsQueue.drainTo(drained); return drained; } diff --git a/internal-api/src/main/java/datadog/trace/util/PidHelper.java b/internal-api/src/main/java/datadog/trace/util/PidHelper.java index 43fd7fa96ec..357262448d8 100644 --- a/internal-api/src/main/java/datadog/trace/util/PidHelper.java +++ b/internal-api/src/main/java/datadog/trace/util/PidHelper.java @@ -44,12 +44,12 @@ private static String findPid() { if (JavaVirtualMachine.isJavaVersionAtLeast(9)) { try { pid = - Strings.trim( - ((Supplier) - Class.forName("datadog.trace.util.JDK9PidSupplier") - .getDeclaredConstructor() - .newInstance()) - .get()); + ((Supplier) + Class.forName("datadog.trace.util.JDK9PidSupplier") + .getDeclaredConstructor() + .newInstance()) + .get() + .trim(); } catch (Throwable e) { log.debug("JDK9PidSupplier not available", e); } diff --git a/internal-api/src/main/java/datadog/trace/util/Strings.java b/internal-api/src/main/java/datadog/trace/util/Strings.java index 301b7223f04..67bc7d520bf 100644 --- a/internal-api/src/main/java/datadog/trace/util/Strings.java +++ b/internal-api/src/main/java/datadog/trace/util/Strings.java @@ -6,7 +6,6 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.concurrent.ThreadLocalRandom; -import javax.annotation.Nonnull; import javax.annotation.Nullable; public final class Strings { @@ -15,14 +14,6 @@ public final class Strings { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - public static String toEnvVar(String string) { - return string.replace('.', '_').replace('-', '_').toUpperCase(); - } - - public static String toEnvVarLowerCase(String string) { - return string.replace('.', '_').replace('-', '_').toLowerCase(); - } - /** com.foo.Bar -> com/foo/Bar.class */ public static String getResourceName(final String className) { if (!className.endsWith(".class")) { @@ -71,77 +62,6 @@ public static String replaceFirst(String str, String delimiter, String replaceme return sb.toString(); } - /** - * Converts the property name, e.g. 'service.name' into a public environment variable name, e.g. - * `DD_SERVICE_NAME`. - * - * @param setting The setting name, e.g. `service.name` - * @return The public facing environment variable name - */ - @Nonnull - public static String propertyNameToEnvironmentVariableName(final String setting) { - return "DD_" + toEnvVar(setting); - } - - /** - * Converts the system property name, e.g. 'dd.service.name' into a public environment variable - * name, e.g. `DD_SERVICE_NAME`. - * - * @param setting The system property name, e.g. `dd.service.name` - * @return The public facing environment variable name - */ - @Nonnull - public static String systemPropertyNameToEnvironmentVariableName(final String setting) { - return setting.replace('.', '_').replace('-', '_').toUpperCase(); - } - - /** - * Converts the property name, e.g. 'service.name' into a public system property name, e.g. - * `dd.service.name`. - * - * @param setting The setting name, e.g. `service.name` - * @return The public facing system property name - */ - @Nonnull - public static String propertyNameToSystemPropertyName(final String setting) { - return "dd." + setting; - } - - @Nonnull - public static String normalizedHeaderTag(String str) { - if (str.isEmpty()) { - return ""; - } - StringBuilder builder = new StringBuilder(str.length()); - int firstNonWhiteSpace = -1; - int lastNonWhitespace = -1; - for (int i = 0; i < str.length(); i++) { - char c = str.charAt(i); - if (Character.isWhitespace(c)) { - builder.append('_'); - } else { - firstNonWhiteSpace = firstNonWhiteSpace == -1 ? i : firstNonWhiteSpace; - lastNonWhitespace = i; - if (Character.isLetterOrDigit(c) || c == '_' || c == '-' || c == '/') { - builder.append(Character.toLowerCase(c)); - } else { - builder.append('_'); - } - } - } - if (firstNonWhiteSpace == -1) { - return ""; - } else { - str = builder.substring(firstNonWhiteSpace, lastNonWhitespace + 1); - return str; - } - } - - @Nonnull - public static String trim(final String string) { - return null == string ? "" : string.trim(); - } - public static String sha256(String input) throws NoSuchAlgorithmException { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); 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 5e49e44d84b..3927e1dbc2d 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/ConfigCollectorTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/ConfigCollectorTest.groovy @@ -11,7 +11,7 @@ import datadog.trace.api.iast.telemetry.Verbosity import datadog.trace.api.naming.SpanNaming import datadog.trace.bootstrap.config.provider.ConfigProvider import datadog.trace.test.util.DDSpecification -import datadog.trace.util.Strings +import datadog.trace.util.ConfigStrings import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_WEAK_HASH_ALGORITHMS import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_HEARTBEAT_INTERVAL @@ -20,7 +20,7 @@ class ConfigCollectorTest extends DDSpecification { def "non-default config settings get collected"() { setup: - injectEnvConfig(Strings.toEnvVar(configKey), configValue) + injectEnvConfig(ConfigStrings.toEnvVar(configKey), configValue) expect: def setting = ConfigCollector.get().collect().get(configKey) @@ -65,7 +65,7 @@ class ConfigCollectorTest extends DDSpecification { def "should collect merged data from multiple sources"() { setup: - injectEnvConfig(Strings.toEnvVar(configKey), envValue) + injectEnvConfig(ConfigStrings.toEnvVar(configKey), envValue) if (jvmValue != null) { injectSysConfig(configKey, jvmValue) } diff --git a/internal-api/src/test/groovy/datadog/trace/api/git/UserSuppliedGitInfoBuilderTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/git/UserSuppliedGitInfoBuilderTest.groovy index 3d5c886a490..21ea13d5ed9 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/git/UserSuppliedGitInfoBuilderTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/git/UserSuppliedGitInfoBuilderTest.groovy @@ -3,7 +3,7 @@ package datadog.trace.api.git import datadog.trace.api.config.GeneralConfig import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.test.util.DDSpecification -import datadog.trace.util.Strings +import datadog.trace.util.ConfigStrings class UserSuppliedGitInfoBuilderTest extends DDSpecification { @@ -22,7 +22,7 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "user supplied git info: env var #envVariable"() { setup: - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(envVariable), value) + environmentVariables.set(ConfigStrings.propertyNameToEnvironmentVariableName(envVariable), value) when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) @@ -48,7 +48,7 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "user supplied git info: system property #systemProperty"() { setup: - System.setProperty(Strings.propertyNameToSystemPropertyName(systemProperty), value) + System.setProperty(ConfigStrings.propertyNameToSystemPropertyName(systemProperty), value) when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) @@ -74,7 +74,7 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "branch name is normalized"() { setup: - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_BRANCH), "origin/myBranch") + environmentVariables.set(ConfigStrings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_BRANCH), "origin/myBranch") when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) @@ -86,7 +86,7 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "tag can be supplied in branch var"() { setup: - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_BRANCH), "refs/tags/myTag") + environmentVariables.set(ConfigStrings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_BRANCH), "refs/tags/myTag") when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) @@ -99,8 +99,8 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "dedicated tag var has preference over tag supplied inside branch var"() { setup: - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_TAG), "myProvidedTag") - environmentVariables.set(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_BRANCH), "refs/tags/myTag") + environmentVariables.set(ConfigStrings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_TAG), "myProvidedTag") + environmentVariables.set(ConfigStrings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_BRANCH), "refs/tags/myTag") when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) @@ -113,7 +113,7 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "git info is extracted from global tags"() { setup: - injectEnvConfig(Strings.toEnvVar(GeneralConfig.TAGS), Tags.GIT_REPOSITORY_URL + ":repo_url," + Tags.GIT_COMMIT_SHA + ":commit_sha") + injectEnvConfig(ConfigStrings.toEnvVar(GeneralConfig.TAGS), Tags.GIT_REPOSITORY_URL + ":repo_url," + Tags.GIT_COMMIT_SHA + ":commit_sha") when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) @@ -126,9 +126,9 @@ class UserSuppliedGitInfoBuilderTest extends DDSpecification { def "global tags have lower priority than dedicated environment variables"() { setup: - injectEnvConfig(Strings.toEnvVar(GeneralConfig.TAGS), Tags.GIT_REPOSITORY_URL + ":repo_url," + Tags.GIT_COMMIT_SHA + ":commit_sha") - injectEnvConfig(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_REPOSITORY_URL), "overridden_repo_url") - injectEnvConfig(Strings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_COMMIT_SHA), "overridden_commit_sha") + injectEnvConfig(ConfigStrings.toEnvVar(GeneralConfig.TAGS), Tags.GIT_REPOSITORY_URL + ":repo_url," + Tags.GIT_COMMIT_SHA + ":commit_sha") + injectEnvConfig(ConfigStrings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_REPOSITORY_URL), "overridden_repo_url") + injectEnvConfig(ConfigStrings.propertyNameToEnvironmentVariableName(UserSuppliedGitInfoBuilder.DD_GIT_COMMIT_SHA), "overridden_commit_sha") when: def gitInfo = new UserSuppliedGitInfoBuilder().build(null) diff --git a/internal-api/src/test/groovy/datadog/trace/api/telemetry/OtelEnvMetricCollectorTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/telemetry/OtelEnvMetricCollectorImplTest.groovy similarity index 95% rename from internal-api/src/test/groovy/datadog/trace/api/telemetry/OtelEnvMetricCollectorTest.groovy rename to internal-api/src/test/groovy/datadog/trace/api/telemetry/OtelEnvMetricCollectorImplTest.groovy index c5970aeb012..486966eed7d 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/telemetry/OtelEnvMetricCollectorTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/telemetry/OtelEnvMetricCollectorImplTest.groovy @@ -9,14 +9,14 @@ import datadog.trace.test.util.DDSpecification // Note that if DD_TRACE_OTEL_ENABLED is set, its value will overwrite the one in OTEL_SDK_DISABLED. -class OtelEnvMetricCollectorTest extends DDSpecification { +class OtelEnvMetricCollectorImplTest extends DDSpecification { def "otel disabled - no metric"() { setup: injectEnvConfig('DD_SERVICE_NAME', 'DD_TEST_SERVICE', false) injectEnvConfig('OTEL_SERVICE_NAME', 'OTEL_TEST_SERVICE', false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'false', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -30,7 +30,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { setup: injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) injectEnvConfig('OTEL_SDK_DISABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -53,7 +53,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { setup: injectEnvConfig('OTEL_SERVICE_NAME', 'OTEL_TEST_SERVICE', false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -69,7 +69,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { injectEnvConfig('OTEL_SERVICE_NAME', 'OTEL_TEST_SERVICE', false) injectEnvConfig('OTEL_PROPAGATORS', 'MyStyle', false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -86,7 +86,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { injectEnvConfig(otelEnvKey, otelEnvValue, false) injectEnvConfig(ddEnvKey, ddEnvValue, false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -128,7 +128,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { injectEnvConfig('OTEL_RESOURCE_ATTRIBUTES', 'env=oteltest,version=0.0.1', false) injectEnvConfig('DD_TAGS', 'env=ddtest,version=0.0.2', false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -151,7 +151,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { setup: injectEnvConfig(otelEnvKey, otelEnvValue, false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() @@ -179,7 +179,7 @@ class OtelEnvMetricCollectorTest extends DDSpecification { setup: injectEnvConfig(otelEnvKey, otelEnvValue, false) injectEnvConfig('DD_TRACE_OTEL_ENABLED', 'true', false) - def collector = OtelEnvMetricCollector.getInstance() + def collector = OtelEnvMetricCollectorImpl.getInstance() when: collector.prepareMetrics() diff --git a/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy b/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy index 6479b9eed1f..ead4b6fd729 100644 --- a/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/util/StringsTest.groovy @@ -63,7 +63,7 @@ class StringsTest extends DDSpecification { def "test envvar from property"() { expect: - "FOO_BAR_QUX" == Strings.toEnvVar("foo.bar-qux") + "FOO_BAR_QUX" == ConfigStrings.toEnvVar("foo.bar-qux") } def "test replace strings"() { diff --git a/settings.gradle.kts b/settings.gradle.kts index 267fec213c3..8c4f627e6f4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -140,6 +140,7 @@ include( // misc include( ":dd-java-agent:testing", + ":utils:config-utils", ":utils:container-utils", ":utils:socket-utils", ":utils:test-agent-utils:decoder", diff --git a/telemetry/src/main/java/datadog/telemetry/metric/OtelEnvMetricPeriodicAction.java b/telemetry/src/main/java/datadog/telemetry/metric/OtelEnvMetricPeriodicAction.java index c63bd5b33ae..6a9999ff5a3 100644 --- a/telemetry/src/main/java/datadog/telemetry/metric/OtelEnvMetricPeriodicAction.java +++ b/telemetry/src/main/java/datadog/telemetry/metric/OtelEnvMetricPeriodicAction.java @@ -1,13 +1,13 @@ package datadog.telemetry.metric; import datadog.trace.api.telemetry.MetricCollector; -import datadog.trace.api.telemetry.OtelEnvMetricCollector; +import datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl; import edu.umd.cs.findbugs.annotations.NonNull; public class OtelEnvMetricPeriodicAction extends MetricPeriodicAction { @Override @NonNull public MetricCollector collector() { - return OtelEnvMetricCollector.getInstance(); + return OtelEnvMetricCollectorImpl.getInstance(); } } diff --git a/telemetry/src/test/groovy/datadog/telemetry/TelemetryRunnableSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/TelemetryRunnableSpecification.groovy index 6ddebef3782..16e392b872d 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/TelemetryRunnableSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/TelemetryRunnableSpecification.groovy @@ -5,7 +5,8 @@ import datadog.trace.api.config.GeneralConfig import datadog.trace.api.telemetry.MetricCollector import datadog.trace.api.time.TimeSource import datadog.trace.test.util.DDSpecification -import datadog.trace.util.Strings +import datadog.trace.util.ConfigStrings + import java.util.concurrent.CyclicBarrier import java.util.concurrent.TimeUnit @@ -35,7 +36,7 @@ class TelemetryRunnableSpecification extends DDSpecification { void 'happy path'() { setup: - injectEnvConfig(Strings.toEnvVar(GeneralConfig.TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL), "65") + injectEnvConfig(ConfigStrings.toEnvVar(GeneralConfig.TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL), "65") TelemetryRunnable.ThreadSleeper sleeperMock = Mock() TickSleeper sleeper = new TickSleeper(delegate: sleeperMock) TimeSource timeSource = Mock() diff --git a/telemetry/src/test/groovy/datadog/telemetry/TelemetryServiceSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/TelemetryServiceSpecification.groovy index a1248729cf3..556d22eba83 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/TelemetryServiceSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/TelemetryServiceSpecification.groovy @@ -1,12 +1,12 @@ package datadog.telemetry -import datadog.telemetry.dependency.Dependency -import datadog.telemetry.api.Integration import datadog.telemetry.api.DistributionSeries +import datadog.telemetry.api.Integration import datadog.telemetry.api.LogMessage import datadog.telemetry.api.LogMessageLevel import datadog.telemetry.api.Metric import datadog.telemetry.api.RequestType +import datadog.telemetry.dependency.Dependency import datadog.trace.api.ConfigOrigin import datadog.trace.api.ConfigSetting import datadog.trace.api.config.AppSecConfig @@ -15,7 +15,7 @@ import datadog.trace.api.config.ProfilingConfig import datadog.trace.api.telemetry.Endpoint import datadog.trace.api.telemetry.ProductChange import datadog.trace.test.util.DDSpecification -import datadog.trace.util.Strings +import datadog.trace.util.ConfigStrings class TelemetryServiceSpecification extends DDSpecification { def confKeyValue = ConfigSetting.of("confkey", "confvalue", ConfigOrigin.DEFAULT) @@ -482,9 +482,9 @@ class TelemetryServiceSpecification extends DDSpecification { def 'app-started must include activated products info'() { setup: - injectEnvConfig(Strings.toEnvVar(AppSecConfig.APPSEC_ENABLED), appsecConfig) - injectEnvConfig(Strings.toEnvVar(ProfilingConfig.PROFILING_ENABLED), profilingConfig) - injectEnvConfig(Strings.toEnvVar(DebuggerConfig.DYNAMIC_INSTRUMENTATION_ENABLED), dynInstrConfig) + injectEnvConfig(ConfigStrings.toEnvVar(AppSecConfig.APPSEC_ENABLED), appsecConfig) + injectEnvConfig(ConfigStrings.toEnvVar(ProfilingConfig.PROFILING_ENABLED), profilingConfig) + injectEnvConfig(ConfigStrings.toEnvVar(DebuggerConfig.DYNAMIC_INSTRUMENTATION_ENABLED), dynInstrConfig) TestTelemetryRouter testHttpClient = new TestTelemetryRouter() TelemetryService telemetryService = new TelemetryService(testHttpClient, 10000, false) diff --git a/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy index f92b4e836a3..c4957e91822 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/TelemetrySystemSpecification.groovy @@ -7,7 +7,7 @@ import datadog.telemetry.dependency.DependencyService import datadog.telemetry.dependency.LocationsCollectingTransformer import datadog.trace.api.config.GeneralConfig import datadog.trace.test.util.DDSpecification -import datadog.trace.util.Strings +import datadog.trace.util.ConfigStrings import okhttp3.HttpUrl import okhttp3.OkHttpClient import java.lang.instrument.Instrumentation @@ -43,8 +43,8 @@ class TelemetrySystemSpecification extends DDSpecification { void 'start-stop telemetry system'() { setup: - injectEnvConfig(Strings.toEnvVar(GeneralConfig.SITE), "datad0g.com") - injectEnvConfig(Strings.toEnvVar(GeneralConfig.API_KEY), "api-key") + injectEnvConfig(ConfigStrings.toEnvVar(GeneralConfig.SITE), "datad0g.com") + injectEnvConfig(ConfigStrings.toEnvVar(GeneralConfig.API_KEY), "api-key") def instrumentation = Mock(Instrumentation) when: diff --git a/utils/config-utils/build.gradle.kts b/utils/config-utils/build.gradle.kts new file mode 100644 index 00000000000..9ead8f2137b --- /dev/null +++ b/utils/config-utils/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + `java-library` +} + +apply(from = "$rootDir/gradle/java.gradle") + +dependencies { + implementation(project(":components:environment")) + implementation(project(":components:yaml")) + implementation(project(":dd-trace-api")) + implementation(libs.slf4j) + + testImplementation(project(":utils:test-utils")) +} diff --git a/internal-api/src/main/java/datadog/trace/api/ConfigCollector.java b/utils/config-utils/src/main/java/datadog/trace/api/ConfigCollector.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/api/ConfigCollector.java rename to utils/config-utils/src/main/java/datadog/trace/api/ConfigCollector.java diff --git a/internal-api/src/main/java/datadog/trace/api/ConfigOrigin.java b/utils/config-utils/src/main/java/datadog/trace/api/ConfigOrigin.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/api/ConfigOrigin.java rename to utils/config-utils/src/main/java/datadog/trace/api/ConfigOrigin.java diff --git a/internal-api/src/main/java/datadog/trace/api/ConfigSetting.java b/utils/config-utils/src/main/java/datadog/trace/api/ConfigSetting.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/api/ConfigSetting.java rename to utils/config-utils/src/main/java/datadog/trace/api/ConfigSetting.java diff --git a/internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java b/utils/config-utils/src/main/java/datadog/trace/api/env/CapturedEnvironment.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/api/env/CapturedEnvironment.java rename to utils/config-utils/src/main/java/datadog/trace/api/env/CapturedEnvironment.java diff --git a/utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java new file mode 100644 index 00000000000..13cf568ddff --- /dev/null +++ b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollector.java @@ -0,0 +1,9 @@ +package datadog.trace.api.telemetry; + +public interface OtelEnvMetricCollector { + void setHidingOtelEnvVarMetric(String otelName, String ddName); + + void setInvalidOtelEnvVarMetric(String otelName, String ddName); + + void setUnsupportedOtelEnvVarMetric(String otelName); +} diff --git a/utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorProvider.java b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorProvider.java new file mode 100644 index 00000000000..7e55ff3819b --- /dev/null +++ b/utils/config-utils/src/main/java/datadog/trace/api/telemetry/OtelEnvMetricCollectorProvider.java @@ -0,0 +1,18 @@ +package datadog.trace.api.telemetry; + +public final class OtelEnvMetricCollectorProvider { + private static OtelEnvMetricCollector INSTANCE = null; + + private OtelEnvMetricCollectorProvider() {} + + public static OtelEnvMetricCollector get() { + if (INSTANCE == null) { + throw new IllegalStateException("OtelEnvMetricCollectorService has not been registered."); + } + return INSTANCE; + } + + public static void register(OtelEnvMetricCollector instance) { + INSTANCE = instance; + } +} diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java similarity index 92% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java index 3254c30db7d..dc53f44976e 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsInjector.java @@ -1,8 +1,9 @@ package datadog.trace.bootstrap.config.provider; +import static datadog.trace.util.ConfigStrings.toEnvVar; + import datadog.environment.EnvironmentVariables; import datadog.environment.SystemProperties; -import datadog.trace.util.Strings; import java.util.Map; public class AgentArgsInjector { @@ -29,7 +30,7 @@ public static void injectAgentArgsConfig(Map args) { continue; } - String envVarName = Strings.toEnvVar(propertyName); + String envVarName = toEnvVar(propertyName); String envVarValue = EnvironmentVariables.get(envVarName); if (envVarValue != null) { // env variables should have higher priority than agent arguments diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsParser.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsParser.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsParser.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/AgentArgsParser.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/CapturedEnvironmentConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/CapturedEnvironmentConfigSource.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/CapturedEnvironmentConfigSource.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/CapturedEnvironmentConfigSource.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java similarity index 97% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java index 742c0853a7b..53024a3273a 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigConverter.java @@ -1,6 +1,8 @@ package datadog.trace.bootstrap.config.provider; -import datadog.trace.util.Strings; +import static datadog.trace.util.ConfigStrings.normalizedHeaderTag; +import static datadog.trace.util.ConfigStrings.trim; + import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -65,7 +67,7 @@ static List parseList(final String str) { @Nonnull @SuppressForbidden static List parseList(final String str, final String separator) { - String trimmed = Strings.trim(str); + String trimmed = trim(str); if (trimmed.isEmpty()) { return Collections.emptyList(); } @@ -87,7 +89,7 @@ static Map parseMap(final String str, final String settingName) static Map parseMap( final String str, final String settingName, final char keyValueSeparator) { // If we ever want to have default values besides an empty map, this will need to change. - String trimmed = Strings.trim(str); + String trimmed = trim(str); if (trimmed.isEmpty()) { return Collections.emptyMap(); } @@ -100,7 +102,7 @@ static Map parseMap( static Map parseTraceTagsMap( final String str, final char keyValueSeparator, final List argSeparators) { // If we ever want to have default values besides an empty map, this will need to change. - String trimmed = Strings.trim(str); + String trimmed = trim(str); if (trimmed.isEmpty()) { return Collections.emptyMap(); } @@ -130,7 +132,7 @@ static Map parseMapWithOptionalMappings( final String settingName, final String defaultPrefix, boolean lowercaseKeys) { - String trimmed = Strings.trim(str); + String trimmed = trim(str); if (trimmed.isEmpty()) { return Collections.emptyMap(); } @@ -142,7 +144,7 @@ static Map parseMapWithOptionalMappings( @Nonnull static Map parseOrderedMap(final String str, final String settingName) { // If we ever want to have default values besides an empty map, this will need to change. - String trimmed = Strings.trim(str); + String trimmed = trim(str); if (trimmed.isEmpty()) { return Collections.emptyMap(); } @@ -337,7 +339,7 @@ private static void loadMapWithOptionalMapping( return; } if (Character.isLetter(key.charAt(0))) { - value = defaultPrefix + Strings.normalizedHeaderTag(key); + value = defaultPrefix + normalizedHeaderTag(key); } else { // tags must start with a letter throw new BadFormatException( diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/ConfigProvider.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java similarity index 84% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java index c8531f6a094..392b10d66ad 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/EnvironmentConfigSource.java @@ -1,7 +1,7 @@ package datadog.trace.bootstrap.config.provider; import static datadog.trace.api.ConfigOrigin.ENV; -import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName; +import static datadog.trace.util.ConfigStrings.propertyNameToEnvironmentVariableName; import datadog.environment.EnvironmentVariables; import datadog.trace.api.ConfigOrigin; diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java similarity index 94% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java index 863a59fdcf8..89f18f8f5ea 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java @@ -14,14 +14,14 @@ import static datadog.trace.api.config.TracerConfig.RESPONSE_HEADER_TAGS; import static datadog.trace.api.config.TracerConfig.TRACE_PROPAGATION_STYLE; import static datadog.trace.api.config.TracerConfig.TRACE_SAMPLE_RATE; -import static datadog.trace.util.Strings.toEnvVar; +import static datadog.trace.util.ConfigStrings.toEnvVar; +import static datadog.trace.util.ConfigStrings.toEnvVarLowerCase; import datadog.environment.EnvironmentVariables; import datadog.environment.SystemProperties; import datadog.trace.api.ConfigOrigin; import datadog.trace.api.TracePropagationStyle; -import datadog.trace.api.telemetry.OtelEnvMetricCollector; -import datadog.trace.util.Strings; +import datadog.trace.api.telemetry.OtelEnvMetricCollectorProvider; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; @@ -47,8 +47,6 @@ final class OtelEnvironmentConfigSource extends ConfigProvider.Source { private final Properties otelConfigFile = loadOtelConfigFile(); private final Properties datadogConfigFile; - private static final OtelEnvMetricCollector otelEnvMetricCollector = - OtelEnvMetricCollector.getInstance(); @Override protected String get(String key) { @@ -146,8 +144,8 @@ private String getOtelProperty(String otelSysProp, String ddSysProp) { if (null != ddValue) { String otelEnvVar = toEnvVar(otelSysProp); log.warn("Both {} and {} are set, ignoring {}", toEnvVar(ddSysProp), otelEnvVar, otelEnvVar); - otelEnvMetricCollector.setHidingOtelEnvVarMetric( - Strings.toEnvVarLowerCase(otelSysProp), Strings.toEnvVarLowerCase(ddSysProp)); + OtelEnvMetricCollectorProvider.get() + .setHidingOtelEnvVarMetric(toEnvVarLowerCase(otelSysProp), toEnvVarLowerCase(ddSysProp)); return null; } return otelValue; @@ -291,8 +289,8 @@ private static String mapPropagationStyle(String propagators) { buf.append(TracePropagationStyle.valueOfDisplayName(style)).append(','); } catch (IllegalArgumentException e) { log.warn("OTEL_PROPAGATORS={} is not supported", style); - otelEnvMetricCollector.setInvalidOtelEnvVarMetric( - "otel_propagators", "dd_trace_propagation_style"); + OtelEnvMetricCollectorProvider.get() + .setInvalidOtelEnvVarMetric("otel_propagators", "dd_trace_propagation_style"); } } } @@ -326,8 +324,8 @@ private String mapSampleRate(String tracesSampler) { } log.warn("OTEL_TRACES_SAMPLER={} is not supported", tracesSampler); - otelEnvMetricCollector.setInvalidOtelEnvVarMetric( - "otel_traces_sampler", "dd_trace_sample_rate"); + OtelEnvMetricCollectorProvider.get() + .setInvalidOtelEnvVarMetric("otel_traces_sampler", "dd_trace_sample_rate"); return null; } @@ -343,7 +341,8 @@ private String mapDataCollection(String type) { } log.warn("OTEL_{}_EXPORTER={} is not supported", type, exporter.toUpperCase(Locale.ROOT)); - otelEnvMetricCollector.setUnsupportedOtelEnvVarMetric("otel_" + type + "_exporter"); + OtelEnvMetricCollectorProvider.get() + .setUnsupportedOtelEnvVarMetric("otel_" + type + "_exporter"); return null; } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java similarity index 92% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java index a3391a54ef6..77d48385905 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/PropertiesConfigSource.java @@ -1,6 +1,6 @@ package datadog.trace.bootstrap.config.provider; -import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName; import datadog.trace.api.ConfigOrigin; import java.util.Properties; diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigParser.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java similarity index 97% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java index 917fbec2bda..9650c954044 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/StableConfigSource.java @@ -1,6 +1,6 @@ package datadog.trace.bootstrap.config.provider; -import static datadog.trace.util.Strings.propertyNameToEnvironmentVariableName; +import static datadog.trace.util.ConfigStrings.propertyNameToEnvironmentVariableName; import datadog.trace.api.ConfigOrigin; import datadog.trace.bootstrap.config.provider.stableconfig.StableConfigMappingException; diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java similarity index 85% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java index 0ad6e15fa6d..853c74c3285 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java +++ b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/SystemPropertiesConfigSource.java @@ -1,7 +1,7 @@ package datadog.trace.bootstrap.config.provider; import static datadog.trace.api.ConfigOrigin.JVM_PROP; -import static datadog.trace.util.Strings.propertyNameToSystemPropertyName; +import static datadog.trace.util.ConfigStrings.propertyNameToSystemPropertyName; import datadog.environment.SystemProperties; import datadog.trace.api.ConfigOrigin; diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Rule.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Selector.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Selector.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Selector.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/Selector.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfig.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfig.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfig.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfig.java diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java b/utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java similarity index 100% rename from internal-api/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java rename to utils/config-utils/src/main/java/datadog/trace/bootstrap/config/provider/stableconfig/StableConfigMappingException.java diff --git a/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java b/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java new file mode 100644 index 00000000000..137280ad539 --- /dev/null +++ b/utils/config-utils/src/main/java/datadog/trace/util/ConfigStrings.java @@ -0,0 +1,87 @@ +package datadog.trace.util; + +import javax.annotation.Nonnull; + +public final class ConfigStrings { + + private ConfigStrings() {} + + public static String toEnvVar(String string) { + return string.replace('.', '_').replace('-', '_').toUpperCase(); + } + + public static String toEnvVarLowerCase(String string) { + return string.replace('.', '_').replace('-', '_').toLowerCase(); + } + + /** + * Converts the property name, e.g. 'service.name' into a public environment variable name, e.g. + * `DD_SERVICE_NAME`. + * + * @param setting The setting name, e.g. `service.name` + * @return The public facing environment variable name + */ + @Nonnull + public static String propertyNameToEnvironmentVariableName(final String setting) { + return "DD_" + toEnvVar(setting); + } + + /** + * Converts the system property name, e.g. 'dd.service.name' into a public environment variable + * name, e.g. `DD_SERVICE_NAME`. + * + * @param setting The system property name, e.g. `dd.service.name` + * @return The public facing environment variable name + */ + @Nonnull + public static String systemPropertyNameToEnvironmentVariableName(final String setting) { + return setting.replace('.', '_').replace('-', '_').toUpperCase(); + } + + /** + * Converts the property name, e.g. 'service.name' into a public system property name, e.g. + * `dd.service.name`. + * + * @param setting The setting name, e.g. `service.name` + * @return The public facing system property name + */ + @Nonnull + public static String propertyNameToSystemPropertyName(final String setting) { + return "dd." + setting; + } + + @Nonnull + public static String normalizedHeaderTag(String str) { + if (str.isEmpty()) { + return ""; + } + StringBuilder builder = new StringBuilder(str.length()); + int firstNonWhiteSpace = -1; + int lastNonWhitespace = -1; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (Character.isWhitespace(c)) { + builder.append('_'); + } else { + firstNonWhiteSpace = firstNonWhiteSpace == -1 ? i : firstNonWhiteSpace; + lastNonWhitespace = i; + if (Character.isLetterOrDigit(c) || c == '_' || c == '-' || c == '/') { + builder.append(Character.toLowerCase(c)); + } else { + builder.append('_'); + } + } + } + if (firstNonWhiteSpace == -1) { + return ""; + } else { + str = builder.substring(firstNonWhiteSpace, lastNonWhitespace + 1); + return str; + } + } + + @Nonnull + public static String trim(final String string) { + return null == string ? "" : string.trim(); + } +}