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 {