Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[
+ "datadog.trace.api.TracePropagationStyle:build_time,"
+ "datadog.trace.api.TracePropagationBehaviorExtract:build_time,"
+ "datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl:build_time,"
+ "datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl: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,"
Expand Down
7 changes: 0 additions & 7 deletions internal-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ val excludedClassesCoverage by extra(
// Bootstrap API
"datadog.trace.bootstrap.ActiveSubsystems",
"datadog.trace.bootstrap.ContextStore.Factory",
"datadog.trace.bootstrap.config.provider.ConfigProvider.Singleton",
"datadog.trace.bootstrap.instrumentation.api.java.lang.ProcessImplInstrumentationHelpers",
"datadog.trace.bootstrap.instrumentation.api.Tags",
"datadog.trace.bootstrap.instrumentation.api.CommonTagValues",
Expand Down Expand Up @@ -167,7 +166,6 @@ val excludedClassesCoverage by extra(
"datadog.trace.api.Config",
"datadog.trace.api.Config.HostNameHolder",
"datadog.trace.api.Config.RuntimeIdHolder",
"datadog.trace.api.ConfigCollector",
"datadog.trace.api.DynamicConfig",
"datadog.trace.api.DynamicConfig.Builder",
"datadog.trace.api.DynamicConfig.Snapshot",
Expand Down Expand Up @@ -249,9 +247,6 @@ val excludedClassesBranchCoverage by extra(
"datadog.trace.api.ClassloaderConfigurationOverrides.Lazy",
"datadog.trace.util.stacktrace.HotSpotStackWalker",
"datadog.trace.util.stacktrace.StackWalkerFactory",
// Tested using forked process
"datadog.trace.api.env.CapturedEnvironment",
"datadog.trace.api.env.CapturedEnvironment.ProcessInfo",
"datadog.trace.util.TempLocationManager",
"datadog.trace.util.TempLocationManager.*",
// Branches depend on RUM injector state that cannot be reliably controlled in unit tests
Expand All @@ -261,8 +256,6 @@ val excludedClassesBranchCoverage by extra(

val excludedClassesInstructionCoverage by extra(
listOf(
"datadog.trace.bootstrap.config.provider.EnvironmentConfigSource",
"datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource",
"datadog.trace.util.stacktrace.StackWalkerFactory"
)
)
Expand Down
4 changes: 4 additions & 0 deletions internal-api/src/main/java/datadog/trace/api/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -654,6 +654,8 @@
import datadog.trace.api.profiling.ProfilingEnablement;
import datadog.trace.api.rum.RumInjectorConfig;
import datadog.trace.api.rum.RumInjectorConfig.PrivacyLevel;
import datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl;
import datadog.trace.api.telemetry.ConfigInversionMetricCollectorProvider;
import datadog.trace.api.telemetry.OtelEnvMetricCollectorImpl;
import datadog.trace.api.telemetry.OtelEnvMetricCollectorProvider;
import datadog.trace.bootstrap.config.provider.CapturedEnvironmentConfigSource;
Expand Down Expand Up @@ -1248,6 +1250,8 @@ public static String getHostName() {
static {
// Bind telemetry collector to config module before initializing ConfigProvider
OtelEnvMetricCollectorProvider.register(OtelEnvMetricCollectorImpl.getInstance());
ConfigInversionMetricCollectorProvider.register(
ConfigInversionMetricCollectorImpl.getInstance());
}

// Read order: System Properties -> Env Variables, [-> properties file], [-> default value]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,25 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConfigInversionMetricCollector
implements MetricCollector<ConfigInversionMetricCollector.ConfigInversionMetric> {
private static final Logger log = LoggerFactory.getLogger(ConfigInversionMetricCollector.class);
public class ConfigInversionMetricCollectorImpl
implements MetricCollector<ConfigInversionMetricCollectorImpl.ConfigInversionMetric>,
ConfigInversionMetricCollector {
private static final Logger log =
LoggerFactory.getLogger(ConfigInversionMetricCollectorImpl.class);
private static final String CONFIG_INVERSION_KEY_TAG = "config_name:";
private static final String CONFIG_INVERSION_METRIC_NAME = "untracked.config.detected";
private static final String NAMESPACE = "tracers";
private static final ConfigInversionMetricCollector INSTANCE =
new ConfigInversionMetricCollector();
private static final ConfigInversionMetricCollectorImpl INSTANCE =
new ConfigInversionMetricCollectorImpl();

private final BlockingQueue<ConfigInversionMetricCollector.ConfigInversionMetric> metricsQueue;
private final BlockingQueue<ConfigInversionMetricCollectorImpl.ConfigInversionMetric>
metricsQueue;

private ConfigInversionMetricCollector() {
private ConfigInversionMetricCollectorImpl() {
this.metricsQueue = new ArrayBlockingQueue<>(RAW_QUEUE_SIZE);
}

public static ConfigInversionMetricCollector getInstance() {
public static ConfigInversionMetricCollectorImpl getInstance() {
return INSTANCE;
}

Expand All @@ -34,7 +37,7 @@ public void setUndocumentedEnvVarMetric(String configName) {

private void setMetricConfigInversionMetric(final String... tags) {
if (!metricsQueue.offer(
new ConfigInversionMetricCollector.ConfigInversionMetric(
new ConfigInversionMetricCollectorImpl.ConfigInversionMetric(
NAMESPACE, true, CONFIG_INVERSION_METRIC_NAME, "count", 1, tags))) {
log.debug("Unable to add telemetry metric {} for {}", CONFIG_INVERSION_METRIC_NAME, tags[0]);
}
Expand All @@ -46,11 +49,11 @@ public void prepareMetrics() {
}

@Override
public Collection<ConfigInversionMetricCollector.ConfigInversionMetric> drain() {
public Collection<ConfigInversionMetricCollectorImpl.ConfigInversionMetric> drain() {
if (this.metricsQueue.isEmpty()) {
return Collections.emptyList();
}
List<ConfigInversionMetricCollector.ConfigInversionMetric> drained =
List<ConfigInversionMetricCollectorImpl.ConfigInversionMetric> drained =
new ArrayList<>(this.metricsQueue.size());
this.metricsQueue.drainTo(drained);
return drained;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package datadog.trace.api.telemetry

import datadog.trace.test.util.DDSpecification

import static datadog.trace.api.telemetry.ConfigInversionMetricCollector.CONFIG_INVERSION_METRIC_NAME
import static ConfigInversionMetricCollectorImpl.CONFIG_INVERSION_METRIC_NAME

class ConfigInversionMetricCollectorTest extends DDSpecification {
class ConfigInversionMetricCollectorImplTest extends DDSpecification {

def "should emit metric when unsupported env var is used"() {
setup:
def collector = ConfigInversionMetricCollector.getInstance()
def collector = ConfigInversionMetricCollectorImpl.getInstance()

when:
ConfigInversionMetricCollectorTestHelper.checkAndEmitUnsupported("DD_UNKNOWN_FEATURE")
Expand All @@ -28,7 +28,7 @@ class ConfigInversionMetricCollectorTest extends DDSpecification {

def "should not emit metric when supported env var is used"() {
setup:
def collector = ConfigInversionMetricCollector.getInstance()
def collector = ConfigInversionMetricCollectorImpl.getInstance()

when:
ConfigInversionMetricCollectorTestHelper.checkAndEmitUnsupported("DD_ENV")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ public class ConfigInversionMetricCollectorTestHelper {
private static final Set<String> SUPPORTED_ENV_VARS =
new HashSet<>(Arrays.asList("DD_ENV", "DD_SERVICE"));

private static final ConfigInversionMetricCollector configInversionMetricCollector =
ConfigInversionMetricCollector.getInstance();
private static final ConfigInversionMetricCollectorImpl configInversionMetricCollector =
ConfigInversionMetricCollectorImpl.getInstance();

public static void checkAndEmitUnsupported(String envVarName) {
if (!SUPPORTED_ENV_VARS.contains(envVarName)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package datadog.telemetry.metric;

import datadog.trace.api.telemetry.ConfigInversionMetricCollector;
import datadog.trace.api.telemetry.ConfigInversionMetricCollectorImpl;
import datadog.trace.api.telemetry.MetricCollector;
import edu.umd.cs.findbugs.annotations.NonNull;

public class ConfigInversionMetricPeriodicAction extends MetricPeriodicAction {
@Override
@NonNull
public MetricCollector collector() {
return ConfigInversionMetricCollector.getInstance();
return ConfigInversionMetricCollectorImpl.getInstance();
}
}
43 changes: 43 additions & 0 deletions utils/config-utils/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,56 @@ plugins {

apply(from = "$rootDir/gradle/java.gradle")

val minimumBranchCoverage by extra(0.7)
val minimumInstructionCoverage by extra(0.7)

val excludedClassesCoverage by extra(
listOf(
"datadog.trace.api.ConfigCollector",
"datadog.trace.api.env.CapturedEnvironment",
"datadog.trace.api.env.CapturedEnvironment.ProcessInfo",
// tested in internal-api
"datadog.trace.api.telemetry.OtelEnvMetricCollectorProvider",
"datadog.trace.api.telemetry.ConfigInversionMetricCollectorProvider",
"datadog.trace.bootstrap.config.provider.CapturedEnvironmentConfigSource",
"datadog.trace.bootstrap.config.provider.ConfigConverter.ValueOfLookup",
// tested in internal-api
"datadog.trace.bootstrap.config.provider.ConfigProvider",
"datadog.trace.bootstrap.config.provider.ConfigProvider.ConfigMergeResolver",
"datadog.trace.bootstrap.config.provider.ConfigProvider.ConfigValueResolver",
"datadog.trace.bootstrap.config.provider.ConfigProvider.Singleton",
"datadog.trace.bootstrap.config.provider.ConfigProvider.Source",
"datadog.trace.bootstrap.config.provider.EnvironmentConfigSource",
// tested in internal-api
"datadog.trace.bootstrap.config.provider.OtelEnvironmentConfigSource",
"datadog.trace.bootstrap.config.provider.stableconfig.Selector",
// tested in internal-api
"datadog.trace.bootstrap.config.provider.StableConfigParser",
"datadog.trace.bootstrap.config.provider.SystemPropertiesConfigSource",
)
)

val excludedClassesBranchCoverage by extra(
listOf(
"datadog.trace.bootstrap.config.provider.AgentArgsInjector",
"datadog.trace.util.ConfigStrings"
)
)

val excludedClassesInstructionCoverage by extra(
listOf(
"datadog.trace.config.inversion.GeneratedSupportedConfigurations"
)
)

dependencies {
implementation(project(":components:environment"))
implementation(project(":components:yaml"))
implementation(project(":dd-trace-api"))
implementation(libs.slf4j)

testImplementation(project(":utils:test-utils"))
testImplementation("org.snakeyaml:snakeyaml-engine:2.9")
}

tasks.named("javadoc") {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package datadog.trace.api.telemetry;

public interface ConfigInversionMetricCollector {
void setUndocumentedEnvVarMetric(String configName);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package datadog.trace.api.telemetry;

public final class ConfigInversionMetricCollectorProvider {
private static ConfigInversionMetricCollector INSTANCE = null;

private ConfigInversionMetricCollectorProvider() {}

public static ConfigInversionMetricCollector get() {
if (INSTANCE == null) {
throw new IllegalStateException(
"ConfigInversionMetricCollectorService has not been registered.");
}
return INSTANCE;
}

public static void register(ConfigInversionMetricCollector instance) {
INSTANCE = instance;
}
}