diff --git a/build.gradle.kts b/build.gradle.kts index eb7d87b4c43..c4047c225f3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,8 @@ plugins { id("datadog.dump-hanged-test") id("com.diffplug.spotless") version "6.13.0" - id("com.github.spotbugs") version "5.0.14" - id("de.thetaphi.forbiddenapis") version "3.8" + id("com.github.spotbugs") version "6.4.4" + id("de.thetaphi.forbiddenapis") version "3.10" id("io.github.gradle-nexus.publish-plugin") version "2.0.0" id("com.gradleup.shadow") version "8.3.6" apply false id("me.champeau.jmh") version "0.7.3" apply false diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 1987bd5f91d..1fde159ccce 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { testImplementation("org.objenesis", "objenesis", "3.0.1") testImplementation(libs.groovy) testImplementation("javax.servlet", "javax.servlet-api", "3.0.1") - testImplementation("com.github.spotbugs", "spotbugs-annotations", "4.2.0") + testImplementation(libs.spotbugs.annotations) } sourceSets { diff --git a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java index 3864ccbded1..f4728952673 100644 --- a/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java +++ b/communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java @@ -11,6 +11,7 @@ import datadog.remoteconfig.DefaultConfigurationPoller; import datadog.trace.api.Config; import datadog.trace.util.AgentTaskScheduler; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.security.Security; import java.util.ArrayList; import java.util.List; @@ -31,6 +32,7 @@ public class SharedCommunicationObjects { * HTTP client for making requests to Datadog agent. Depending on configuration, this client may * use regular HTTP, UDS or named pipe. */ + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public OkHttpClient agentHttpClient; /** @@ -39,10 +41,18 @@ public class SharedCommunicationObjects { */ private volatile OkHttpClient intakeHttpClient; + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public long httpClientTimeout; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public boolean forceClearTextHttpForIntakeClient; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public HttpUrl agentUrl; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public Monitoring monitoring; + private volatile DDAgentFeaturesDiscovery featuresDiscovery; private ConfigurationPoller configurationPoller; diff --git a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java b/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java index 80ed525130d..fa95190412a 100644 --- a/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java +++ b/communication/src/main/java/datadog/communication/monitor/DDAgentStatsDClientManager.java @@ -14,6 +14,8 @@ public final class DDAgentStatsDClientManager implements StatsDClientManager { private static final DDAgentStatsDClientManager INSTANCE = new DDAgentStatsDClientManager(); + private DDAgentStatsDClientManager() {} + private static final boolean USE_LOGGING_CLIENT = LOGGING_WRITER_TYPE.equals(Config.get().getWriterType()); 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 6fe43876afa..654ce1ba411 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 @@ -56,6 +56,7 @@ import datadog.trace.util.AgentTaskScheduler; import datadog.trace.util.AgentThreadFactory.AgentThread; import datadog.trace.util.throwable.FatalAgentMisconfigurationError; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.instrument.Instrumentation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -198,6 +199,7 @@ private static void safelySetContextClassLoader(ClassLoader classLoader) { *

The Agent is considered to start successfully if Instrumentation can be activated. All other * pieces are considered optional. */ + @SuppressFBWarnings("AT_STALE_THREAD_WRITE_OF_PRIMITIVE") public static void start( final Object bootstrapInitTelemetry, final Instrumentation inst, @@ -446,6 +448,7 @@ private static void injectAgentArgsConfig(String agentArgs) { } } + @SuppressFBWarnings("AT_STALE_THREAD_WRITE_OF_PRIMITIVE") private static void configureCiVisibility(URL agentJarURL) { // Retro-compatibility for the old way to configure CI Visibility if ("true".equals(ddGetProperty("dd.integration.junit.enabled")) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/PatchLogger.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/PatchLogger.java index 8f28ca27b69..eea5b4adbb7 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/PatchLogger.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/PatchLogger.java @@ -29,7 +29,7 @@ public static PatchLogger getAnonymousLogger(final String resourceBundleName) { return SAFE_LOGGER; } - protected PatchLogger(final String name, final String resourceBundleName) { + private PatchLogger(final String name, final String resourceBundleName) { // super(name, resourceBundleName); } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java index 7142ac3a505..be2179818ea 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/jms/SessionState.java @@ -2,7 +2,6 @@ import datadog.trace.api.Config; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayDeque; import java.util.Collections; import java.util.Comparator; @@ -65,7 +64,6 @@ public int compare(Map.Entry o1, Map.Entry 1) { + int execs = executions.incrementAndGet(); + boolean success = successfulExecutionSeen.get() | (status != TestStatus.fail); + successfulExecutionSeen.set(success); + if (execs > 1) { totalRetryCount.incrementAndGet(); } boolean lastExecution = !retriesLeft(); - boolean retry = executions > 1; // first execution is not a retry + boolean retry = execs > 1; // first execution is not a retry return new ExecutionOutcomeImpl( status == TestStatus.fail && (!lastExecution || suppressFailures), lastExecution, - lastExecution && !successfulExecutionSeen, + lastExecution && !success, false, retry ? RetryReason.atr : null); } private boolean retriesLeft() { - return !successfulExecutionSeen && executions < maxExecutions; + return !successfulExecutionSeen.get() && executions.get() < maxExecutions; } @Override @@ -57,7 +58,7 @@ public boolean applicable() { public boolean suppressFailures() { // do not suppress failures for last execution (unless flag to suppress all failures is set); // the +1 is because this method is called _before_ subsequent execution is registered - return executions + 1 < maxExecutions || suppressFailures; + return executions.get() + 1 < maxExecutions || suppressFailures; } @Override diff --git a/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy b/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy index 7d0a121d385..a30f58d6d66 100644 --- a/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy +++ b/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy @@ -6,11 +6,13 @@ import datadog.trace.agent.test.utils.OkHttpUtils import datadog.trace.api.gateway.IGSpanInfo import datadog.trace.api.gateway.RequestContext import datadog.trace.api.gateway.RequestContextSlot +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import okhttp3.OkHttpClient import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.TimeUnit +@SuppressFBWarnings("HSM_HIDING_METHOD") class IastRequestTestRunner extends IastAgentTestRunner implements IastRequestContextPreparationTrait { private static final LinkedBlockingQueue TAINTED_OBJECTS = new LinkedBlockingQueue<>() diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java index 52bf8511bdd..e11712e2030 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastSystem.java @@ -55,6 +55,7 @@ import datadog.trace.api.iast.telemetry.Verbosity; import datadog.trace.util.AgentTaskScheduler; import datadog.trace.util.stacktrace.StackWalkerFactory; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.instrument.Instrumentation; import java.lang.reflect.Constructor; import java.lang.reflect.UndeclaredThrowableException; @@ -70,7 +71,11 @@ public class IastSystem { private static final Logger LOGGER = LoggerFactory.getLogger(IastSystem.class); + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public static boolean DEBUG = false; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public static Verbosity VERBOSITY = Verbosity.OFF; public static void start(final SubscriptionService ss) { diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java index 36efc48205a..bbf6be3fe53 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/propagation/StringModuleImpl.java @@ -224,7 +224,6 @@ public void onStringConcatFactory( } @Override - @SuppressFBWarnings("ES_COMPARING_PARAMETER_STRING_WITH_EQ") public void onStringSubSequence( @Nonnull CharSequence self, int beginIndex, int endIndex, @Nullable CharSequence result) { if (self == result || !canBeTainted(result)) { @@ -722,7 +721,6 @@ public void onStringReplace( /** This method is used to make an {@code CallSite.Around} of the {@code String.replace} method */ @Override - @SuppressFBWarnings("ES_COMPARING_PARAMETER_STRING_WITH_EQ") public String onStringReplace( @Nonnull String self, CharSequence oldCharSeq, CharSequence newCharSeq) { final IastContext ctx = IastContext.Provider.get(); @@ -805,7 +803,6 @@ public String onStringReplace( } @Override - @SuppressFBWarnings("ES_COMPARING_PARAMETER_STRING_WITH_EQ") public void onStringValueOf(Object param, @Nonnull String result) { if (param == null || !canBeTainted(result)) { return; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java index 673b3113728..4a70d267635 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/taint/TaintedMap.java @@ -102,7 +102,7 @@ class TaintedMapImpl implements TaintedMap, Runnable { /** * Flag for the current alive tainted objects (red/black style marking for max age calculation). */ - protected boolean generation; + protected volatile boolean generation; /** Whether to collect the {@link IastMetric#TAINTED_FLAT_MODE} metric or not */ protected boolean collectFlatBucketMetric; diff --git a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java index 2d8a4979938..62ca9ea29fe 100644 --- a/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java +++ b/dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/EnvironmentChecker.java @@ -50,7 +50,7 @@ public static boolean checkEnvironment(String temp, StringBuilder sb) { boolean result = false; result |= checkJFR(sb); result |= checkDdprof(sb); - if (!result) {; + if (!result) { appendLine("Profiler is not supported on this JVM.", sb); return false; } else { diff --git a/dd-java-agent/agent-profiling/profiling-utils/src/main/java/com/datadog/profiling/utils/Timestamper.java b/dd-java-agent/agent-profiling/profiling-utils/src/main/java/com/datadog/profiling/utils/Timestamper.java index 24da6779d5d..8f7fafeb415 100644 --- a/dd-java-agent/agent-profiling/profiling-utils/src/main/java/com/datadog/profiling/utils/Timestamper.java +++ b/dd-java-agent/agent-profiling/profiling-utils/src/main/java/com/datadog/profiling/utils/Timestamper.java @@ -1,5 +1,6 @@ package com.datadog.profiling.utils; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; public interface Timestamper { @@ -33,6 +34,7 @@ static boolean override(Timestamper timestamper) { Registration.INSTANCE, Timestamper.DEFAULT, timestamper); } + @SuppressFBWarnings("SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR") final class Singleton { // static final Timestamper TIMESTAMPER = Registration.INSTANCE.pending; diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/usm/UsmMessageImpl.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/usm/UsmMessageImpl.java index 0833d933394..92a48581f44 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/usm/UsmMessageImpl.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/usm/UsmMessageImpl.java @@ -22,7 +22,7 @@ enum MessageType { private static final Logger log = LoggerFactory.getLogger(BaseUsmMessage.class); // TODO: sync with systemprobe code - static final NativeLong USM_IOCTL_ID = new NativeLong(0xda7ad09L);; + static final NativeLong USM_IOCTL_ID = new NativeLong(0xda7ad09L); abstract static class BaseUsmMessage implements UsmMessage { diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java index fae17c9531d..87fa53f15bc 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java @@ -100,8 +100,8 @@ public class AppSecConfigServiceImpl implements AppSecConfigService { .build() .adapter(Types.newParameterizedType(Map.class, String.class, Object.class)); - private boolean hasUserWafConfig; - private boolean defaultConfigActivated; + private volatile boolean hasUserWafConfig; + private volatile boolean defaultConfigActivated; private final AtomicBoolean subscribedToRulesAndData = new AtomicBoolean(); private final Set usedDDWafConfigKeys = Collections.newSetFromMap(new ConcurrentHashMap<>()); diff --git a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java index 1bf6dfab1c3..7e3241ab4bc 100644 --- a/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java +++ b/dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/AppSecRequestContext.java @@ -14,6 +14,7 @@ import datadog.trace.api.http.StoredBodySupplier; import datadog.trace.api.internal.TraceSegment; import datadog.trace.util.stacktrace.StackTraceEvent; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.Closeable; import java.util.ArrayList; import java.util.Arrays; @@ -40,6 +41,7 @@ // TODO: different methods to be called by different parts perhaps splitting it would make sense // or at least create separate interfaces +@SuppressFBWarnings("AT_STALE_THREAD_WRITE_OF_PRIMITIVE") public class AppSecRequestContext implements DataBundle, Closeable { private static final Logger log = LoggerFactory.getLogger(AppSecRequestContext.class); diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index cacc90e7d92..04f99145da0 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -1,5 +1,4 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - import java.util.concurrent.atomic.AtomicBoolean plugins { @@ -29,7 +28,6 @@ tasks.named("processResources") { sourceSets { "main_java6" { java.srcDirs "${project.projectDir}/src/main/java6" - } main.resources.srcDir(includedAgentDir) } @@ -43,7 +41,7 @@ tasks.named("compileJava") { } dependencies { - main_java6CompileOnly 'de.thetaphi:forbiddenapis:3.8' + main_java6CompileOnly libs.forbiddenapis testImplementation sourceSets.main_java6.output } 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 6da827a1b76..491af0df614 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 @@ -251,7 +251,7 @@ abstract class InstrumentationSpecification extends DDSpecification implements A } } - boolean originalAppSecRuntimeValue + volatile boolean originalAppSecRuntimeValue @Shared ConcurrentHashMap> spanFinishLocations = new ConcurrentHashMap<>() diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle index 7e5b182cc28..05d8ee76555 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle @@ -117,7 +117,7 @@ dependencies { baseTestImplementation group: 'com.typesafe.akka', name: 'akka-http-spray-json_2.11', version: '10.0.10' iastTestImplementation project(':dd-java-agent:agent-iast:iast-test-fixtures') - iastTestCompileOnly group: 'de.thetaphi', name: 'forbiddenapis', version: '3.4' + iastTestCompileOnly libs.forbiddenapis iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.8') iastTestRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java index b9ae249e0d1..b0b027bcfd7 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java @@ -24,7 +24,6 @@ import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; import datadog.trace.api.iast.propagation.PropagationModule; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; import scala.collection.Iterator; import scala.collection.immutable.Seq; @@ -61,7 +60,6 @@ public void methodAdvice(MethodTransformer transformer) { HttpRequestInstrumentation.class.getName() + "$EntityAdvice"); } - @SuppressFBWarnings("BC_IMPOSSIBLE_INSTANCEOF") @RequiresRequestContext(RequestContextSlot.IAST) static class RequestHeadersAdvice { @Advice.OnMethodExit(suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java index 34b9e7a1490..f1cf128078e 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java @@ -19,7 +19,6 @@ import datadog.trace.api.iast.InstrumentationBridge; import datadog.trace.api.iast.Propagation; import datadog.trace.api.iast.propagation.PropagationModule; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; /** Propagates taint when fetching the {@link HttpRequest} from the {@link RequestContext}. */ @@ -46,7 +45,6 @@ public void methodAdvice(MethodTransformer transformer) { RequestContextInstrumentation.class.getName() + "$GetRequestAdvice"); } - @SuppressFBWarnings("BC_IMPOSSIBLE_INSTANCEOF") @RequiresRequestContext(RequestContextSlot.IAST) static class GetRequestAdvice { @Advice.OnMethodExit(suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintRequestFunction.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintRequestFunction.java index c881037cf1c..cd80b65b56f 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintRequestFunction.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/helpers/TaintRequestFunction.java @@ -6,7 +6,6 @@ import datadog.trace.api.iast.SourceTypes; import datadog.trace.api.iast.propagation.PropagationModule; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import scala.Tuple1; import scala.compat.java8.JFunction1; @@ -14,7 +13,6 @@ public class TaintRequestFunction implements JFunction1, Tup public static final TaintRequestFunction INSTANCE = new TaintRequestFunction(); @Override - @SuppressFBWarnings("BC_IMPOSSIBLE_INSTANCEOF") public Tuple1 apply(Tuple1 v1) { HttpRequest httpRequest = v1._1(); diff --git a/dd-java-agent/instrumentation/exception-profiling/build.gradle b/dd-java-agent/instrumentation/exception-profiling/build.gradle index 6f90365731c..02eee944f48 100644 --- a/dd-java-agent/instrumentation/exception-profiling/build.gradle +++ b/dd-java-agent/instrumentation/exception-profiling/build.gradle @@ -11,7 +11,7 @@ apply from: "$rootDir/gradle/java.gradle" apply plugin: "idea" dependencies { - testImplementation 'de.thetaphi:forbiddenapis:3.8' + testImplementation libs.forbiddenapis testImplementation libs.bundles.junit5 testImplementation libs.bundles.jmc testImplementation libs.commons.math diff --git a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleLauncherInstrumentation.java b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleLauncherInstrumentation.java index 94bbc34fcc4..5c16964e933 100644 --- a/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleLauncherInstrumentation.java +++ b/dd-java-agent/instrumentation/gradle/gradle-8.3/src/main/groovy/datadog/trace/instrumentation/gradle/GradleLauncherInstrumentation.java @@ -6,7 +6,6 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -50,9 +49,6 @@ public String[] helperClassNames() { }; } - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "jvmOptions is the return value of the original method") public static class PropertiesAugmentationAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void addJavaagentToGradleDaemonProperties( diff --git a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ExtractAdapter.java b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ExtractAdapter.java index f2a22b28923..af76f7b8fa4 100644 --- a/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ExtractAdapter.java +++ b/dd-java-agent/instrumentation/grizzly/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/ExtractAdapter.java @@ -12,6 +12,8 @@ public class ExtractAdapter implements AgentPropagation.Co @SuppressWarnings("rawtypes") private static final ExtractAdapter GETTER = new ExtractAdapter(); + private ExtractAdapter() {} + @SuppressWarnings("unchecked") public static AgentPropagation.ContextVisitor requestGetter() { return (AgentPropagation.ContextVisitor) GETTER; diff --git a/dd-java-agent/instrumentation/junit/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java index a5dae830aa8..94fe65f9f4a 100644 --- a/dd-java-agent/instrumentation/junit/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/execution/MUnitExecutionInstrumentation.java @@ -17,7 +17,6 @@ import datadog.trace.instrumentation.junit4.MUnitUtils; import datadog.trace.instrumentation.junit4.TestEventsHandlerHolder; import datadog.trace.util.Strings; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; @@ -122,9 +121,6 @@ public static Future apply( } @SuppressWarnings("bytebuddy-exception-suppression") - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "result is the return value of the original method") @Advice.OnMethodExit public static void returnResult( @Advice.Enter Future overriddenResult, diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java index cc5ff7d2e40..0a30861948f 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/cucumber-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5CucumberSkipInstrumentation.java @@ -14,7 +14,6 @@ import datadog.trace.api.civisibility.events.TestEventsHandler; import datadog.trace.api.civisibility.telemetry.tag.SkipReason; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collection; import java.util.Set; import net.bytebuddy.asm.Advice; @@ -85,10 +84,6 @@ public void methodAdvice(MethodTransformer transformer) { * available in CL where this instrumentation is injected */ public static class JUnit5SkipAdvice { - - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "skipResult is the return value of the instrumented method") @Advice.OnMethodExit public static void shouldBeSkipped( @Advice.This TestDescriptor testDescriptor, diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java index 2e5686f5fc7..0841857fa4a 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/src/main/java/datadog/trace/instrumentation/junit5/order/JUnit5TestOrderInstrumentation.java @@ -13,7 +13,6 @@ import datadog.trace.instrumentation.junit5.JUnitPlatformUtils; import datadog.trace.instrumentation.junit5.TestEventsHandlerHolder; import datadog.trace.util.Strings; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Optional; import java.util.Set; import net.bytebuddy.asm.Advice; @@ -76,9 +75,6 @@ public static void onGetClassOrdererEnter() { CallDepthThreadLocalMap.incrementCallDepth(JupiterConfiguration.class); } - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "classOrderer is the return value of the instrumented method") @Advice.OnMethodExit public static void onGetClassOrdererExit( @Advice.Return(readOnly = false) Optional classOrderer) { @@ -105,9 +101,6 @@ public static void onGetMethodOrdererEnter() { CallDepthThreadLocalMap.incrementCallDepth(JupiterConfiguration.class); } - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "methodOrderer is the return value of the instrumented method") @Advice.OnMethodExit public static void onGetMethodOrdererExit( @Advice.Return(readOnly = false) Optional methodOrderer) { diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockSkipInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockSkipInstrumentation.java index 465b85ff991..397cbb031a5 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockSkipInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SpockSkipInstrumentation.java @@ -14,7 +14,6 @@ import datadog.trace.api.civisibility.telemetry.tag.SkipReason; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import datadog.trace.bootstrap.CallDepthThreadLocalMap; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Set; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -85,9 +84,6 @@ public static void beforeSkipCheck() { } @SuppressWarnings("bytebuddy-exception-suppression") - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "skipResult is the return value of the instrumented method") @Advice.OnMethodExit public static void shouldBeSkipped( @Advice.This SpockNode spockNode, diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5SpockParameterizedExecutionInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5SpockParameterizedExecutionInstrumentation.java index a7642ad3259..6e5d505fb95 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5SpockParameterizedExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5SpockParameterizedExecutionInstrumentation.java @@ -8,7 +8,6 @@ import datadog.trace.api.Config; import datadog.trace.instrumentation.junit5.JUnitPlatformUtils; import datadog.trace.util.Strings; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -62,9 +61,6 @@ public void methodAdvice(MethodTransformer transformer) { public static class SpockParameterizedExecutionAdvice { @SuppressWarnings("bytebuddy-exception-suppression") - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "executionListener is a field in the instrumented class") @Advice.OnMethodExit public static void afterConstructor( @Advice.FieldValue(value = "executionListener", readOnly = false) diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java index ad5ab0f6f1a..bacbafe3464 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5Instrumentation.java @@ -11,7 +11,6 @@ import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.InstrumentationContext; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collections; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -76,9 +75,6 @@ public void methodAdvice(MethodTransformer transformer) { } public static class ContextStoreAdvice { - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "executionRequest is the argument of the original method") @Advice.OnMethodEnter public static void setContextStores(@Advice.This TestEngine testEngine) { ContextStore contextStore = @@ -89,9 +85,6 @@ public static void setContextStores(@Advice.This TestEngine testEngine) { } public static class JUnit5Advice { - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "executionRequest is the argument of the original method") @Advice.OnMethodEnter public static void addTracingListener( @Advice.This TestEngine testEngine, diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SkipInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SkipInstrumentation.java index 35218d456a9..3ab0b783ddb 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SkipInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnit5SkipInstrumentation.java @@ -15,7 +15,6 @@ import datadog.trace.api.civisibility.events.TestEventsHandler; import datadog.trace.api.civisibility.telemetry.tag.SkipReason; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collection; import java.util.Set; import net.bytebuddy.asm.Advice; @@ -76,10 +75,6 @@ public void methodAdvice(MethodTransformer transformer) { * available in CL where this instrumentation is injected */ public static class JUnit5SkipAdvice { - - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "skipResult is the return value of the instrumented method") @Advice.OnMethodExit public static void shouldBeSkipped( @Advice.This TestDescriptor testDescriptor, diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java b/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java index 019b4a6b4dd..18ea443fb60 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/execution/JUnit5ExecutionStoreInstrumentation.java @@ -14,7 +14,6 @@ import datadog.trace.instrumentation.junit5.JUnitPlatformUtils; import datadog.trace.instrumentation.junit5.TestEventsHandlerHolder; import datadog.trace.util.Strings; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collections; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -73,9 +72,6 @@ public void methodAdvice(MethodTransformer transformer) { } public static class ContextStoreAdvice { - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "executionRequest is the argument of the original method") @Advice.OnMethodEnter public static void setContextStores() { ContextStore contextStore = diff --git a/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java index 15895b8d721..6d9c65cd400 100644 --- a/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java +++ b/dd-java-agent/instrumentation/karate/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java @@ -4,9 +4,11 @@ import datadog.trace.api.civisibility.events.TestDescriptor; import datadog.trace.api.civisibility.events.TestEventsHandler; import datadog.trace.api.civisibility.events.TestSuiteDescriptor; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; public abstract class TestEventsHandlerHolder { + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public static volatile TestEventsHandler TEST_EVENTS_HANDLER; static { diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle index 453ab37dfe6..fa4ebbd3eb1 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle @@ -60,7 +60,6 @@ dependencies { testFixturesApi project(':dd-trace-api') testFixturesApi project(':dd-java-agent:instrumentation:trace-annotation') testFixturesApi project(':dd-java-agent:instrumentation-testing') - testFixturesApi 'com.github.spotbugs:spotbugs-annotations:4.2.0' testImplementation libs.kotlin testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/src/latestDepTest/kotlin/KotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines/src/latestDepTest/kotlin/KotlinCoroutineTests.kt index 577dfd14727..beaeddd5c31 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/src/latestDepTest/kotlin/KotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines/src/latestDepTest/kotlin/KotlinCoroutineTests.kt @@ -1,6 +1,5 @@ import datadog.trace.api.Trace import datadog.trace.instrumentation.kotlin.coroutines.CoreKotlinCoroutineTests -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.flow @@ -9,7 +8,6 @@ import kotlinx.coroutines.flow.single import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout -@SuppressFBWarnings("NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE") class KotlinCoroutineTests(dispatcher: CoroutineDispatcher) : CoreKotlinCoroutineTests(dispatcher) { @Trace diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/src/test/kotlin/KotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines/src/test/kotlin/KotlinCoroutineTests.kt index 3fb4e460ca8..c809fdb2d7e 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/src/test/kotlin/KotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines/src/test/kotlin/KotlinCoroutineTests.kt @@ -1,6 +1,5 @@ import datadog.trace.api.Trace import datadog.trace.instrumentation.kotlin.coroutines.CoreKotlinCoroutineTests -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.actor @@ -9,7 +8,6 @@ import kotlinx.coroutines.channels.produce import kotlinx.coroutines.channels.toChannel @OptIn(ExperimentalCoroutinesApi::class) -@SuppressFBWarnings("NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE") class KotlinCoroutineTests(dispatcher: CoroutineDispatcher) : CoreKotlinCoroutineTests(dispatcher) { @Trace diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt index 45252e74867..1d36be03c5b 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt @@ -5,7 +5,6 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan import datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan import datadog.trace.bootstrap.instrumentation.api.AgentTracer.get import datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineName @@ -28,7 +27,6 @@ import java.util.concurrent.CancellationException import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger -@SuppressFBWarnings("NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE") abstract class CoreKotlinCoroutineTests(private val dispatcher: CoroutineDispatcher) { @Trace diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/build.gradle b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/build.gradle index f282eec55d0..514a18fb769 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/build.gradle +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/build.gradle @@ -63,7 +63,7 @@ dependencies { iastTestImplementation group: 'com.github.pjfanning', name: 'pekko-http-jackson_2.12', version: '2.1.0' iastTestImplementation project(':dd-java-agent:agent-iast:iast-test-fixtures') - iastTestCompileOnly group: 'de.thetaphi', name: 'forbiddenapis', version: '3.4' + iastTestCompileOnly libs.forbiddenapis iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.12') iastTestRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/PekkoHttpServerHeaders.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/PekkoHttpServerHeaders.java index ef77b52bd53..44d9c27580f 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/PekkoHttpServerHeaders.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/PekkoHttpServerHeaders.java @@ -12,6 +12,8 @@ public class PekkoHttpServerHeaders @SuppressWarnings("rawtypes") private static final PekkoHttpServerHeaders GETTER = new PekkoHttpServerHeaders(); + private PekkoHttpServerHeaders() {} + @SuppressWarnings("unchecked") public static AgentPropagation.ContextVisitor requestGetter() { return (AgentPropagation.ContextVisitor) GETTER; diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/HttpRequestInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/HttpRequestInstrumentation.java index fb10785e46b..6a6a1eb88cb 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/HttpRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/HttpRequestInstrumentation.java @@ -22,7 +22,6 @@ import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; import datadog.trace.api.iast.propagation.PropagationModule; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; import org.apache.pekko.http.scaladsl.model.HttpHeader; import org.apache.pekko.http.scaladsl.model.HttpRequest; @@ -61,7 +60,6 @@ public void methodAdvice(MethodTransformer transformer) { HttpRequestInstrumentation.class.getName() + "$EntityAdvice"); } - @SuppressFBWarnings("BC_IMPOSSIBLE_INSTANCEOF") @RequiresRequestContext(RequestContextSlot.IAST) static class RequestHeadersAdvice { @Advice.OnMethodExit(suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/RequestContextInstrumentation.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/RequestContextInstrumentation.java index 0f302d0f6b9..3bf9af6d546 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/RequestContextInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/RequestContextInstrumentation.java @@ -17,7 +17,6 @@ import datadog.trace.api.iast.InstrumentationBridge; import datadog.trace.api.iast.Propagation; import datadog.trace.api.iast.propagation.PropagationModule; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; import org.apache.pekko.http.scaladsl.model.HttpRequest; import org.apache.pekko.http.scaladsl.server.RequestContext; @@ -46,7 +45,6 @@ public void methodAdvice(MethodTransformer transformer) { RequestContextInstrumentation.class.getName() + "$GetRequestAdvice"); } - @SuppressFBWarnings("BC_IMPOSSIBLE_INSTANCEOF") @RequiresRequestContext(RequestContextSlot.IAST) static class GetRequestAdvice { @Advice.OnMethodExit(suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintRequestFunction.java b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintRequestFunction.java index 2c11c014ccd..15e9486efa3 100644 --- a/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintRequestFunction.java +++ b/dd-java-agent/instrumentation/pekko/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/iast/helpers/TaintRequestFunction.java @@ -5,7 +5,6 @@ import datadog.trace.api.iast.SourceTypes; import datadog.trace.api.iast.propagation.PropagationModule; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.pekko.http.scaladsl.model.HttpRequest; import scala.Tuple1; import scala.compat.java8.JFunction1; @@ -14,7 +13,6 @@ public class TaintRequestFunction implements JFunction1, Tup public static final TaintRequestFunction INSTANCE = new TaintRequestFunction(); @Override - @SuppressFBWarnings("BC_IMPOSSIBLE_INSTANCEOF") public Tuple1 apply(Tuple1 v1) { HttpRequest httpRequest = v1._1(); diff --git a/dd-java-agent/instrumentation/ratpack-1.5/build.gradle b/dd-java-agent/instrumentation/ratpack-1.5/build.gradle index 38ed3cbd41f..e6572cbe135 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/build.gradle +++ b/dd-java-agent/instrumentation/ratpack-1.5/build.gradle @@ -15,7 +15,6 @@ addTestSuiteForDir('latestDepTest', 'test') dependencies { compileOnly group: 'io.ratpack', name: 'ratpack-core', version: '1.5.0' - compileOnly group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.2.0' testImplementation project(':dd-java-agent:instrumentation:netty:netty-4.1') testImplementation group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.5.0' diff --git a/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java b/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java index dfd6763c5df..e74e1e2f0ef 100644 --- a/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java +++ b/dd-java-agent/instrumentation/scalatest/src/main/java/datadog/trace/instrumentation/scalatest/ScalatestSkipInstrumentation.java @@ -10,7 +10,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.civisibility.config.TestIdentifier; import datadog.trace.bootstrap.InstrumentationContext; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collections; import java.util.Map; import java.util.Set; @@ -100,9 +99,6 @@ public static void apply( } public static class SingleTestFilterAdvice { - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "filterResult is the return value of the instrumented method") @Advice.OnMethodExit public static void apply( @Advice.This Filter filter, @@ -129,9 +125,6 @@ public static void apply( } public static class MultipleTestsFilterAdvice { - @SuppressFBWarnings( - value = "UC_USELESS_OBJECT", - justification = "filterResult is the return value of the instrumented method") @Advice.OnMethodExit public static void apply( @Advice.This Filter filter, diff --git a/dd-java-agent/instrumentation/spark/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java b/dd-java-agent/instrumentation/spark/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java index 2404803cb92..e62b1d36465 100644 --- a/dd-java-agent/instrumentation/spark/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java +++ b/dd-java-agent/instrumentation/spark/src/main/java/datadog/trace/instrumentation/spark/AbstractDatadogSparkListener.java @@ -39,7 +39,21 @@ import org.apache.spark.ExceptionFailure; import org.apache.spark.SparkConf; import org.apache.spark.TaskFailedReason; -import org.apache.spark.scheduler.*; +import org.apache.spark.scheduler.AccumulableInfo; +import org.apache.spark.scheduler.JobFailed; +import org.apache.spark.scheduler.SparkListener; +import org.apache.spark.scheduler.SparkListenerApplicationEnd; +import org.apache.spark.scheduler.SparkListenerApplicationStart; +import org.apache.spark.scheduler.SparkListenerEvent; +import org.apache.spark.scheduler.SparkListenerExecutorAdded; +import org.apache.spark.scheduler.SparkListenerExecutorRemoved; +import org.apache.spark.scheduler.SparkListenerInterface; +import org.apache.spark.scheduler.SparkListenerJobEnd; +import org.apache.spark.scheduler.SparkListenerJobStart; +import org.apache.spark.scheduler.SparkListenerStageCompleted; +import org.apache.spark.scheduler.SparkListenerStageSubmitted; +import org.apache.spark.scheduler.SparkListenerTaskEnd; +import org.apache.spark.scheduler.StageInfo; import org.apache.spark.sql.execution.SQLExecution; import org.apache.spark.sql.execution.SparkPlanInfo; import org.apache.spark.sql.execution.metric.SQLMetricInfo; @@ -78,7 +92,7 @@ public abstract class AbstractDatadogSparkListener extends SparkListener { private static final String AGENT_OL_ENDPOINT = "openlineage/api/v1/lineage"; private static final int OL_CIRCUIT_BREAKER_TIMEOUT_IN_SECONDS = 60; - public volatile SparkListenerInterface openLineageSparkListener = null; + volatile SparkListenerInterface openLineageSparkListener = null; public volatile SparkConf openLineageSparkConf = null; private final SparkConf sparkConf; diff --git a/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java index 6edc08fed73..3988c18b8f1 100644 --- a/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java +++ b/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/TestEventsHandlerHolder.java @@ -5,10 +5,12 @@ import datadog.trace.api.civisibility.events.TestEventsHandler; import datadog.trace.api.civisibility.events.TestSuiteDescriptor; import datadog.trace.bootstrap.ContextStore; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.testng.ITestResult; public abstract class TestEventsHandlerHolder { + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public static volatile TestEventsHandler TEST_EVENTS_HANDLER; private static ContextStore TEST_STORE; diff --git a/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java b/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java index 64ccef3700e..6e7214e12e1 100644 --- a/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java +++ b/dd-java-agent/instrumentation/testng/src/main/java/datadog/trace/instrumentation/testng/execution/RetryAnalyzer.java @@ -13,7 +13,7 @@ public class RetryAnalyzer implements IRetryAnalyzer { private volatile TestExecutionPolicy executionPolicy; - private boolean suppressFailures; + private volatile boolean suppressFailures; public void createExecutionPolicy(ITestResult result) { if (executionPolicy == null) { diff --git a/dd-java-agent/instrumentation/testng/testng-7/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java b/dd-java-agent/instrumentation/testng/testng-7/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java index 7a30dd10405..64a065a0042 100644 --- a/dd-java-agent/instrumentation/testng/testng-7/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java +++ b/dd-java-agent/instrumentation/testng/testng-7/src/main/java/datadog/trace/instrumentation/testng7/TestNGExecutionInstrumentation.java @@ -11,7 +11,6 @@ import datadog.trace.instrumentation.testng.TracingListener; import datadog.trace.instrumentation.testng.execution.RetryAnalyzer; import datadog.trace.util.Strings; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collections; import java.util.Set; import net.bytebuddy.asm.Advice; @@ -96,7 +95,6 @@ public static void alignBeforeRetry( } @SuppressWarnings("bytebuddy-exception-suppression") - @SuppressFBWarnings("NP_BOOLEAN_RETURN_NULL") @Advice.OnMethodExit public static void shouldRetryTestMethod( @Advice.Argument(1) final ITestResult result, diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle index 2a012a08b81..3887a16899f 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle @@ -28,7 +28,7 @@ tasks.named("compileMain_java11Java", JavaCompile) { dependencies { main_java11CompileOnly group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' - main_java11CompileOnly group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.2.0' + main_java11CompileOnly libs.spotbugs.annotations testImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.+' diff --git a/dd-java-agent/instrumentation/wildfly-9.0/build.gradle b/dd-java-agent/instrumentation/wildfly-9.0/build.gradle index 3d31584c469..c930ee2e929 100644 --- a/dd-java-agent/instrumentation/wildfly-9.0/build.gradle +++ b/dd-java-agent/instrumentation/wildfly-9.0/build.gradle @@ -123,7 +123,8 @@ tasks.named("compileTestGroovy", GroovyCompile) { ["compileLatestDepTestGroovy", "compileLatestDepForkedTestGroovy"].each { tasks.named(it, GroovyCompile) { - configureCompiler(it, 17)} + configureCompiler(it, 17) + } } tasks.named("compileTestJava", JavaCompile) { diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy index ea140c777f1..a346410db64 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy @@ -42,7 +42,10 @@ import static org.eclipse.jetty.http.HttpMethod.GET import static org.eclipse.jetty.http.HttpMethod.POST import static org.eclipse.jetty.http.HttpMethod.PUT -@SuppressFBWarnings("IS2_INCONSISTENT_SYNC") +@SuppressFBWarnings([ + "IS2_INCONSISTENT_SYNC", + "PA_PUBLIC_PRIMITIVE_ATTRIBUTE" +]) class TestHttpServer implements AutoCloseable { static TestHttpServer httpServer(@DelegatesTo(value = TestHttpServer, strategy = Closure.DELEGATE_FIRST) Closure spec) { diff --git a/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle index a37983936fe..516a2b79890 100644 --- a/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle @@ -25,7 +25,8 @@ tasks.named("shadowJar", ShadowJar) { transform(PropertiesFileTransformer) { paths = ['META-INF/spring.factories'] mergeStrategy = "append" - }} + } +} dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.6.0+' diff --git a/dd-trace-core/build.gradle b/dd-trace-core/build.gradle index 7b111ed4e38..b2d17cc8ef1 100644 --- a/dd-trace-core/build.gradle +++ b/dd-trace-core/build.gradle @@ -80,8 +80,6 @@ dependencies { implementation group: 'com.google.re2j', name: 're2j', version: '1.7' - compileOnly group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.2.0' - // We have autoservices defined in test subtree, looks like we need this to be able to properly rebuild this testAnnotationProcessor libs.autoservice.processor testCompileOnly libs.autoservice.annotation diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java index c81015b52f0..9c16477bfad 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/AggregateMetric.java @@ -2,9 +2,13 @@ import datadog.trace.core.histogram.Histogram; import datadog.trace.core.histogram.Histograms; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.atomic.AtomicLongArray; /** Not thread-safe. Accumulates counts and durations. */ +@SuppressFBWarnings( + value = {"AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE", "AT_STALE_THREAD_WRITE_OF_PRIMITIVE"}, + justification = "Explicitly not thread-safe. Accumulates counts and durations.") public final class AggregateMetric { static final long ERROR_TAG = 0x8000000000000000L; @@ -67,6 +71,7 @@ public Histogram getErrorLatencies() { return errorLatencies; } + @SuppressFBWarnings("AT_NONATOMIC_64BIT_PRIMITIVE") public void clear() { this.errorCount = 0; this.hitCount = 0; diff --git a/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java b/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java index 049ab311a97..74675cb77a3 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/metrics/Aggregator.java @@ -34,7 +34,7 @@ final class Aggregator implements Runnable { private final long sleepMillis; - private boolean dirty; + private volatile boolean dirty; Aggregator( MetricWriter writer, diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java index 66f9f468624..dec3a8eb9e5 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ListWriter.java @@ -6,6 +6,7 @@ import datadog.trace.core.DDSpan; import datadog.trace.core.MetadataConsumer; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; @@ -32,6 +33,7 @@ public List firstTrace() { return get(0); } + @SuppressFBWarnings("NN_NAKED_NOTIFY") @Override public void write(List trace) { if (!filter.accept(trace)) { diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/GenerationalUtf8Cache.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/GenerationalUtf8Cache.java index be50ff7103e..56b8e0d20d2 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/GenerationalUtf8Cache.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/GenerationalUtf8Cache.java @@ -138,6 +138,7 @@ public int tenuredCapacity() { } /** Updates access time used @link {@link #getUtf8(String, String)} to the provided value */ + @SuppressFBWarnings("AT_NONATOMIC_64BIT_PRIMITIVE") public void updateAccessTime(long accessTimeMs) { this.accessTimeMs = accessTimeMs; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java index 05a1ec50eb8..a98de4897ef 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java @@ -89,7 +89,7 @@ static DDSpan create( */ private volatile long durationNano; - private boolean forceKeep; + private volatile boolean forceKeep; private volatile EndpointTracker endpointTracker; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java b/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java index 6d00ac646a5..54024e85721 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/monitor/TracerHealthMetrics.java @@ -14,6 +14,7 @@ import datadog.trace.common.writer.RemoteApi; import datadog.trace.core.DDSpan; import datadog.trace.util.AgentTaskScheduler; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -367,6 +368,8 @@ private static class Flush implements AgentTaskScheduler.Task tagPairs; - private boolean canChangeDecisionMaker; + private volatile boolean canChangeDecisionMaker; // extracted decision maker tag for easier updates private volatile TagValue decisionMakerTagValue; diff --git a/dd-trace-core/src/main/java/datadog/trace/payloadtags/json/JsonPath.java b/dd-trace-core/src/main/java/datadog/trace/payloadtags/json/JsonPath.java index a65a1726db7..92b612282c1 100644 --- a/dd-trace-core/src/main/java/datadog/trace/payloadtags/json/JsonPath.java +++ b/dd-trace-core/src/main/java/datadog/trace/payloadtags/json/JsonPath.java @@ -123,7 +123,7 @@ private static final class Singleton extends Segment { private final String repr; - public Singleton(String repr) { + private Singleton(String repr) { super(); this.repr = repr; } diff --git a/gradle/forbiddenapis.gradle b/gradle/forbiddenapis.gradle index 7f94193dba4..4318766c9ac 100644 --- a/gradle/forbiddenapis.gradle +++ b/gradle/forbiddenapis.gradle @@ -18,7 +18,7 @@ buildscript { } dependencies { - classpath "de.thetaphi:forbiddenapis:3.8" + classpath libs.forbiddenapis } } @@ -33,12 +33,10 @@ forbiddenApis { } // disable forbiddenApis for all test tasks -afterEvaluate { - tasks.matching({it.name.startsWith('forbiddenApis') && it.name.endsWith('Test')}).configureEach { - it.enabled = false - } +tasks.matching { it.name.startsWith('forbiddenApis') && it.name.endsWith('Test') }.configureEach { + it.enabled = false } dependencies { - compileOnly group: 'de.thetaphi', name: 'forbiddenapis', version: '3.8' + compileOnly libs.forbiddenapis } diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 00000000000..136e81ad0a0 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,3 @@ +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false +toolchainVersion=21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ed7909b3a57..f84a9bd1483 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -37,6 +37,8 @@ cafe_crypto = "0.1.0" lz4 = "1.7.1" jmh = "1.37" jackson = "2.20.0" +forbiddenapis = "3.10" +spotbugs_annotations = "4.9.8" [libraries] slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } @@ -57,14 +59,14 @@ asm-tree = { module = "org.ow2.asm:asm-tree", version.ref = "asm" } asm-util = { module = "org.ow2.asm:asm-util", version.ref = "asm" } asmcommons = { module = "org.ow2.asm:asm-commons", version.ref = "asm" } dogstatsd = { module = "com.datadoghq:java-dogstatsd-client", version.ref = "dogstatsd" } -jnr-unixsocket = { module = "com.github.jnr:jnr-unixsocket", version.ref = "jnr-unixsocket"} +jnr-unixsocket = { module = "com.github.jnr:jnr-unixsocket", version.ref = "jnr-unixsocket" } cafe-crypto-ed25519 = { module = "cafe.cryptography:ed25519-elisabeth", version.ref = "cafe_crypto" } cafe-crypto-curve25519 = { module = "cafe.cryptography:curve25519-elisabeth", version.ref = "cafe_crypto" } lz4 = { module = "org.lz4:lz4-java", version.ref = "lz4" } # aircompressor v3 requires Java 22 -aircompressor = { module = 'io.airlift:aircompressor', version = '2.0.2'} +aircompressor = { module = 'io.airlift:aircompressor', version = '2.0.2' } # Testing spock-core = { module = "org.spockframework:spock-core", version.ref = "spock" } @@ -102,7 +104,10 @@ coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version jmc-common = { module = "org.openjdk.jmc:common", version.ref = "jmc" } jmc-flightrecorder = { module = "org.openjdk.jmc:flightrecorder", version.ref = "jmc" } -jackson-databind = {module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson"} +jackson-databind = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson" } + +forbiddenapis = { module = "de.thetaphi:forbiddenapis", version.ref = "forbiddenapis" } +spotbugs-annotations = { module = "com.github.spotbugs:spotbugs-annotations", version.ref = "spotbugs_annotations" } [bundles] asm = ["asm", "asmcommons"] diff --git a/gradle/spotbugFilters/exclude.xml b/gradle/spotbugFilters/exclude.xml index 50ec78a6c56..2276ed212e0 100644 --- a/gradle/spotbugFilters/exclude.xml +++ b/gradle/spotbugFilters/exclude.xml @@ -3,7 +3,6 @@ - diff --git a/gradle/spotbugs.gradle b/gradle/spotbugs.gradle index e36e6ec8f09..341bd5d05b7 100644 --- a/gradle/spotbugs.gradle +++ b/gradle/spotbugs.gradle @@ -5,53 +5,67 @@ spotbugs { excludeFilter = file("$rootDir/gradle/spotbugFilters/exclude.xml") } -// configure spotbugs for Main tasks and disable it for all other -afterEvaluate { - tasks.withType(spotbugsMain.class).configureEach { - def name = it.name - if (name.endsWith("Main") || name.endsWith("Main_java11")) { - it.ignoreFailures = false - // detector documentation is in the following link: - // https://spotbugs-in-kengo-toda.readthedocs.io/en/lqc-list-detectors/detectors.html - it.omitVisitors = [ - 'DefaultEncodingDetector', - 'DoInsideDoPrivileged', - 'DontUseEnum', - 'DroppedException', - 'FindDeadLocalStores', - 'FindHEmismatch', - 'FindNullDeref', - 'FindReturnRef', - 'FindRunInvocations', - 'FindUselessControlFlow', - 'InitializationChain', - 'LazyInit', - 'LoadOfKnownNullValue', - 'LostLoggerDueToWeakReference', - 'MethodReturnCheck', - 'MutableStaticFields', - 'Naming', - 'RuntimeExceptionCapture', - 'SerializableIdiom', - 'UnreadFields', - ] - it.reports { - html { - enabled = true - destination = file("$buildDir/reports/spotbugs/${name}.html") - stylesheet = 'fancy-hist.xsl' - } - } - } else { - it.enabled = false +// Configure spotbugs for Main tasks and disable it for all other +// Can't use the class here due to being different class +tasks.matching { it.name.startsWith('spotbugs') }.configureEach { + // Needs Java 11+ to run spotbugs + it.launcher = javaToolchains.launcherFor { + it.languageVersion = JavaLanguageVersion.current() + } + + def name = it.name + if (project.path.startsWith(":dd-smoke-tests") + || !(name.endsWith("Main") + || name.endsWith("Main_java11")) + ) { + it.enabled = false + return + } + + it.showProgress = !providers.environmentVariable("CI").isPresent() + it.ignoreFailures = false + // detector documentation is in the following link: + // https://spotbugs-in-kengo-toda.readthedocs.io/en/lqc-list-detectors/detectors.html + it.omitVisitors = [ + 'ConstructorThrow', + 'DefaultEncodingDetector', + 'DoInsideDoPrivileged', + 'DontUseEnum', + 'DroppedException', + 'FindDeadLocalStores', + 'FindHEmismatch', + 'FindNullDeref', + 'FindReturnRef', + 'FindRunInvocations', + 'FindUselessControlFlow', + 'InitializationChain', + 'LazyInit', + 'LoadOfKnownNullValue', + 'LostLoggerDueToWeakReference', + 'MethodReturnCheck', + 'MutableStaticFields', + 'Naming', + 'RuntimeExceptionCapture', + 'SerializableIdiom', + 'UnreadFields', + ] + it.reports { + html { + required = true + destination(file("$buildDir/reports/spotbugs/${name}.html")) + stylesheet = 'fancy-hist.xsl' } } } dependencies { - compileOnly 'net.jcip:jcip-annotations:1.0' - compileOnly 'com.github.spotbugs:spotbugs-annotations:4.2.0' - - testImplementation 'net.jcip:jcip-annotations:1.0' - testImplementation 'com.github.spotbugs:spotbugs-annotations:4.2.0' + compileOnly(libs.spotbugs.annotations) + testImplementation(libs.spotbugs.annotations) { + // Exclude conflicting JUnit5. + exclude group: 'org.junit' + exclude group: 'org.junit.jupiter' + exclude group: 'org.junit.platform' + // Exclude conflicting logback. + exclude group: 'ch.qos.logback' + } } diff --git a/internal-api/build.gradle.kts b/internal-api/build.gradle.kts index 6ff3e6d63bd..afd5a03b1d5 100644 --- a/internal-api/build.gradle.kts +++ b/internal-api/build.gradle.kts @@ -1,3 +1,5 @@ +import com.github.spotbugs.snom.SpotBugsTask +import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis import groovy.lang.Closure plugins { @@ -22,6 +24,15 @@ fun AbstractCompile.configureCompiler(javaVersionInteger: Int, compatibilityVers (project.extra["configureCompiler"] as Closure<*>).call(this, javaVersionInteger, compatibilityVersion, unsetReleaseFlagReason) } +tasks.named("forbiddenApisMain") { + // sun.* are accessible in JDK8, but maybe not accessible when this task is running + failOnMissingClasses = false +} + +tasks.named("spotbugsMain") { + extraArgs.add("-noClassOk") +} + val minimumBranchCoverage by extra(0.7) val minimumInstructionCoverage by extra(0.8) diff --git a/internal-api/internal-api-9/build.gradle.kts b/internal-api/internal-api-9/build.gradle.kts index f8af68a73d9..7e5e5da3ca7 100644 --- a/internal-api/internal-api-9/build.gradle.kts +++ b/internal-api/internal-api-9/build.gradle.kts @@ -3,7 +3,7 @@ import java.nio.file.Paths plugins { `java-library` - id("de.thetaphi.forbiddenapis") version "3.8" + id("de.thetaphi.forbiddenapis") version "3.10" id("me.champeau.jmh") idea } @@ -18,7 +18,7 @@ java { } } -tasks.withType().configureEach() { +tasks.withType().configureEach { javadocTool = javaToolchains.javadocToolFor(java.toolchain) } 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 8c89bc4f32b..ec50bd22ea2 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -684,7 +684,6 @@ import datadog.trace.util.RandomUtils; import datadog.trace.util.Strings; import datadog.trace.util.throwable.FatalAgentMisconfigurationError; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -5426,7 +5425,6 @@ private static String getProp(String name, String def) { } // This has to be placed after all other static fields to give them a chance to initialize - @SuppressFBWarnings("SI_INSTANCE_BEFORE_FINALS_ASSIGNED") private static final Config INSTANCE = new Config( Platform.isNativeImageBuilder() 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 f7e3fabff2a..b06dea675a1 100644 --- a/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java +++ b/internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java @@ -104,6 +104,9 @@ * @see DynamicConfig for configuration that can be dynamically updated via remote-config * @see Config for other configurations */ +@SuppressFBWarnings( + value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR", + justification = "Instance also created in Config") public class InstrumenterConfig { private final ConfigProvider configProvider; @@ -590,7 +593,6 @@ public boolean isRumEnabled() { } // This has to be placed after all other static fields to give them a chance to initialize - @SuppressFBWarnings("SI_INSTANCE_BEFORE_FINALS_ASSIGNED") private static final InstrumenterConfig INSTANCE = new InstrumenterConfig( Platform.isNativeImageBuilder() diff --git a/internal-api/src/main/java/datadog/trace/api/gateway/Flow.java b/internal-api/src/main/java/datadog/trace/api/gateway/Flow.java index 9e98eb89e02..2ee300568f0 100644 --- a/internal-api/src/main/java/datadog/trace/api/gateway/Flow.java +++ b/internal-api/src/main/java/datadog/trace/api/gateway/Flow.java @@ -1,6 +1,7 @@ package datadog.trace.api.gateway; import datadog.appsec.api.blocking.BlockingContentType; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collections; import java.util.Map; @@ -69,6 +70,9 @@ public Map getExtraHeaders() { } } + @SuppressFBWarnings( + value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR", + justification = "Not a singleton") class ResultFlow implements Flow { @SuppressWarnings("rawtypes") private static final ResultFlow EMPTY = new ResultFlow<>(null); diff --git a/internal-api/src/main/java/datadog/trace/api/remoteconfig/ServiceNameCollector.java b/internal-api/src/main/java/datadog/trace/api/remoteconfig/ServiceNameCollector.java index c4f78b22c58..f2fcd105dc3 100644 --- a/internal-api/src/main/java/datadog/trace/api/remoteconfig/ServiceNameCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/remoteconfig/ServiceNameCollector.java @@ -30,7 +30,7 @@ public static ServiceNameCollector get() { volatile boolean limitReachedLogged = false; - ServiceNameCollector() { + private ServiceNameCollector() { // singleton } diff --git a/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java b/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java index ef77cff0e47..5683f29372c 100644 --- a/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java +++ b/internal-api/src/main/java/datadog/trace/api/rum/RumInjector.java @@ -4,9 +4,13 @@ import datadog.trace.api.InstrumenterConfig; import datadog.trace.api.cache.DDCache; import datadog.trace.api.cache.DDCaches; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.function.Function; import javax.annotation.Nullable; +@SuppressFBWarnings( + value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR", + justification = "Usage in tests") public final class RumInjector { private static final RumInjector INSTANCE = new RumInjector(Config.get(), InstrumenterConfig.get()); diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/EndpointCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/EndpointCollector.java index b8434bfddae..ed888c1ff43 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/EndpointCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/EndpointCollector.java @@ -2,9 +2,13 @@ import static java.util.Collections.emptyIterator; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Iterator; import java.util.concurrent.atomic.AtomicReference; +@SuppressFBWarnings( + value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR", + justification = "Usage in tests") public class EndpointCollector { private static final EndpointCollector INSTANCE = new EndpointCollector(); diff --git a/internal-api/src/main/java/datadog/trace/api/telemetry/LogCollector.java b/internal-api/src/main/java/datadog/trace/api/telemetry/LogCollector.java index 2348843d6da..4ecd730e4f2 100644 --- a/internal-api/src/main/java/datadog/trace/api/telemetry/LogCollector.java +++ b/internal-api/src/main/java/datadog/trace/api/telemetry/LogCollector.java @@ -1,5 +1,6 @@ package datadog.trace.api.telemetry; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -29,7 +30,9 @@ private LogCollector() { this(DEFAULT_MAX_CAPACITY); } - // For testing purpose + @SuppressFBWarnings( + value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR", + justification = "Usage in tests") LogCollector(int maxCapacity) { this.maxCapacity = maxCapacity; this.rawLogMessages = new ConcurrentHashMap<>(maxCapacity); diff --git a/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java b/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java index 5a99a4290f5..af338b01444 100644 --- a/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java +++ b/internal-api/src/main/java/datadog/trace/util/AgentTaskScheduler.java @@ -19,6 +19,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressFBWarnings( + value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR", + justification = "Not a singleton") public class AgentTaskScheduler implements Executor { private static final Logger log = LoggerFactory.getLogger(AgentTaskScheduler.class); diff --git a/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java b/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java index 4eac781efb9..6621478b502 100644 --- a/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java +++ b/internal-api/src/main/java/datadog/trace/util/stacktrace/HotSpotStackWalker.java @@ -1,18 +1,19 @@ package datadog.trace.util.stacktrace; import datadog.environment.JavaVirtualMachine; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.function.Function; import java.util.stream.Stream; import java.util.stream.StreamSupport; public class HotSpotStackWalker extends AbstractStackWalker { + @SuppressForbidden sun.misc.JavaLangAccess access; - sun.misc.JavaLangAccess access; - + @SuppressForbidden HotSpotStackWalker() { try { access = sun.misc.SharedSecrets.getJavaLangAccess(); - } catch (Throwable e) { + } catch (Throwable ignored) { } } diff --git a/internal-api/src/test/groovy/datadog/trace/api/env/FixedCapturedEnvironment.java b/internal-api/src/test/groovy/datadog/trace/api/env/FixedCapturedEnvironment.java index ab4f430a181..cccc9f0fda6 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/env/FixedCapturedEnvironment.java +++ b/internal-api/src/test/groovy/datadog/trace/api/env/FixedCapturedEnvironment.java @@ -4,6 +4,8 @@ /** Helper class that has access to {@link CapturedEnvironment} */ public class FixedCapturedEnvironment { + private FixedCapturedEnvironment() {} + /** Load properties instance into the {@code CapturedEnvironment} instance. */ public static void useFixedEnv(final Map properties) { CapturedEnvironment.useFixedEnv(properties); diff --git a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java index a1bade6df5e..93a47be51f0 100644 --- a/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java +++ b/remote-config/remote-config-core/src/main/java/datadog/remoteconfig/PollerScheduler.java @@ -2,11 +2,13 @@ import datadog.trace.api.Config; import datadog.trace.util.AgentTaskScheduler; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** Handles scheduling scheme for polling configuration */ +@SuppressFBWarnings("AT_NONATOMIC_64BIT_PRIMITIVE") class PollerScheduler { private static final Logger LOGGER = LoggerFactory.getLogger(PollerScheduler.class); diff --git a/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverQueueSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverQueueSpecification.groovy index 89f6237dcbd..18825f3b2fb 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverQueueSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverQueueSpecification.groovy @@ -98,6 +98,5 @@ class DependencyResolverQueueSpecification extends DepSpecification { then: assert deps.isEmpty() - } } diff --git a/utils/config-utils/src/main/java/datadog/trace/api/ConfigCollector.java b/utils/config-utils/src/main/java/datadog/trace/api/ConfigCollector.java index 4cbaf5acf6b..a7ec9a83265 100644 --- a/utils/config-utils/src/main/java/datadog/trace/api/ConfigCollector.java +++ b/utils/config-utils/src/main/java/datadog/trace/api/ConfigCollector.java @@ -19,6 +19,8 @@ public class ConfigCollector { private static final ConfigCollector INSTANCE = new ConfigCollector(); + private ConfigCollector() {} + private static final AtomicReferenceFieldUpdater COLLECTED_UPDATER = AtomicReferenceFieldUpdater.newUpdater(ConfigCollector.class, Map.class, "collected"); diff --git a/utils/config-utils/src/main/java/datadog/trace/api/env/CapturedEnvironment.java b/utils/config-utils/src/main/java/datadog/trace/api/env/CapturedEnvironment.java index d4b618af913..44e55b6fd18 100644 --- a/utils/config-utils/src/main/java/datadog/trace/api/env/CapturedEnvironment.java +++ b/utils/config-utils/src/main/java/datadog/trace/api/env/CapturedEnvironment.java @@ -41,7 +41,7 @@ public ProcessInfo() { private final Map properties; private ProcessInfo processInfo; - CapturedEnvironment() { + private CapturedEnvironment() { properties = new HashMap<>(); processInfo = new ProcessInfo(); properties.put(GeneralConfig.SERVICE_NAME, autodetectServiceName()); diff --git a/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java b/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java index 48ea802b1f7..59c183a4700 100644 --- a/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java +++ b/utils/config-utils/src/main/java/datadog/trace/config/inversion/ConfigHelper.java @@ -11,6 +11,7 @@ import org.slf4j.LoggerFactory; public class ConfigHelper { + private ConfigHelper() {} /** Config Inversion strictness policy for enforcement of undocumented environment variables */ public enum StrictnessPolicy { diff --git a/utils/config-utils/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy b/utils/config-utils/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy index bbac5c99bcb..78c52635898 100644 --- a/utils/config-utils/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy +++ b/utils/config-utils/src/test/groovy/datadog/trace/api/env/CapturedEnvironmentTest.groovy @@ -1,10 +1,10 @@ package datadog.trace.api.env +import static java.io.File.separator + import datadog.trace.api.config.GeneralConfig import datadog.trace.test.util.DDSpecification -import static java.io.File.separator - class CapturedEnvironmentTest extends DDSpecification { def "non autodetected service.name with null command"() { when: @@ -143,7 +143,7 @@ class CapturedEnvironmentTest extends DDSpecification { System.setProperty('sun.java.command', sunJavaCommand) } } - def capturedEnv = new CapturedEnvironment() + def capturedEnv = CapturedEnvironment.get() def props = capturedEnv.properties println props.get(GeneralConfig.SERVICE_NAME) } diff --git a/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java b/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java index df54d9d2a48..479e343255a 100644 --- a/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java +++ b/utils/container-utils/src/main/java/datadog/common/container/ContainerInfo.java @@ -53,9 +53,16 @@ public class ContainerInfo { private static final String ENTITY_ID; + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public String containerId; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public String containerTagsHash; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public String podId; + + @SuppressFBWarnings("PA_PUBLIC_PRIMITIVE_ATTRIBUTE") public List cGroups = new ArrayList<>(); public String getContainerId() { diff --git a/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java b/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java index c299be8b34a..8603deac8cf 100644 --- a/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java +++ b/utils/container-utils/src/main/java/datadog/common/container/ServerlessInfo.java @@ -22,7 +22,10 @@ private ServerlessInfo(final String extensionPath) { } } - @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME") + @SuppressFBWarnings({ + "DMI_HARDCODED_ABSOLUTE_FILENAME", + "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR" + }) public ServerlessInfo() { // TODO add more serverless configuration properties // support envs other than AWS lambda diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/DDSpecification.groovy b/utils/test-utils/src/main/groovy/datadog/trace/test/util/DDSpecification.groovy index 7b2ee0f2c27..e7967d38006 100644 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/DDSpecification.groovy +++ b/utils/test-utils/src/main/groovy/datadog/trace/test/util/DDSpecification.groovy @@ -2,12 +2,11 @@ package datadog.trace.test.util import datadog.environment.EnvironmentVariables import de.thetaphi.forbiddenapis.SuppressForbidden -import spock.lang.Shared -import spock.lang.Specification - import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Modifier +import spock.lang.Shared +import spock.lang.Specification @SuppressForbidden abstract class DDSpecification extends Specification { diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/GCUtils.java b/utils/test-utils/src/main/java/datadog/trace/test/util/GCUtils.java index ad7333202a7..93683ee22b2 100644 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/GCUtils.java +++ b/utils/test-utils/src/main/java/datadog/trace/test/util/GCUtils.java @@ -2,11 +2,9 @@ import static java.util.concurrent.TimeUnit.MINUTES; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.ref.WeakReference; import java.util.concurrent.TimeUnit; -@SuppressFBWarnings("DM_GC") public abstract class GCUtils { public static void awaitGC() throws InterruptedException {