From f2b29fddeb7322a9478c42d6861e6a880fbfca0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 3 Nov 2026 15:06:54 +0100 Subject: [PATCH] test(spanner): reset tracing framework in tests to prevent state leakage Several tests configure OpenTelemetry tracing globally during execution. Without explicit teardown, this configuration persists across tests in the same test run and causes subsequent tests that expect the default tracing behavior to fail or behave inconsistently. This change ensures that all tests enabling a custom tracing framework cleanly restore the default tracing state when they finish. Teardown routines are guarded so that unrelated errors during cleanup cannot bypass the reset, and tests defensively clear any preexisting state before enabling custom tracing. --- .../com/google/cloud/spanner/SpannerOptions.java | 4 +++- .../google/cloud/spanner/BatchClientImplTest.java | 6 ++++++ .../com/google/cloud/spanner/IntegrationTestEnv.java | 12 ++++++++++-- .../cloud/spanner/MultiplexedSessionsBenchmark.java | 7 ++++++- .../cloud/spanner/OpenCensusApiTracerTest.java | 6 ++++++ .../cloud/spanner/OpenTelemetryApiTracerTest.java | 1 + .../google/cloud/spanner/OpenTelemetrySpanTest.java | 1 + .../com/google/cloud/spanner/SessionImplTest.java | 6 ++++++ .../test/java/com/google/cloud/spanner/SpanTest.java | 1 + .../com/google/cloud/spanner/SpannerImplTest.java | 6 ++++++ .../cloud/spanner/TransactionManagerImplTest.java | 6 ++++++ .../cloud/spanner/TransactionRunnerImplTest.java | 6 ++++++ .../spanner/connection/OpenTelemetryTracingTest.java | 1 + .../cloud/spanner/it/ITEndToEndTracingTest.java | 6 +++++- .../cloud/spanner/spi/v1/GapicSpannerRpcTest.java | 1 + 15 files changed, 65 insertions(+), 5 deletions(-) diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index be053c85dfb1..395276839f44 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -2691,7 +2691,9 @@ public static void enableOpenCensusTraces() { + " OpenTelemetry traces") @VisibleForTesting static void resetActiveTracingFramework() { - activeTracingFramework = null; + synchronized (lock) { + activeTracingFramework = null; + } } public static TracingFramework getActiveTracingFramework() { diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BatchClientImplTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BatchClientImplTest.java index 7a9ed7dcd91d..d8d123925073 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BatchClientImplTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/BatchClientImplTest.java @@ -39,6 +39,7 @@ import java.time.Duration; import java.util.Collections; import java.util.Map; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -71,6 +72,11 @@ public static void setupOpenTelemetry() { SpannerOptions.enableOpenTelemetryTraces(); } + @AfterClass + public static void resetOpenTelemetry() { + SpannerOptions.resetActiveTracingFramework(); + } + @SuppressWarnings("unchecked") @Before public void setUp() { diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java index 7e32c410a72c..dffa2c8f08b2 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/IntegrationTestEnv.java @@ -203,6 +203,7 @@ public SpannerOptions spannerOptionsWithEndToEndTracing(SpannerOptions options) .setTracerProvider(sdkTracerProvider) .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance())) .build(); + SpannerOptions.resetActiveTracingFramework(); SpannerOptions.enableOpenTelemetryTraces(); return options.toBuilder() .setOpenTelemetry(openTelemetry) @@ -217,8 +218,15 @@ RemoteSpannerHelper createTestHelper(SpannerOptions options, InstanceId instance @Override protected void after() { - cleanUpInstance(); - this.config.tearDown(); + try { + cleanUpInstance(); + } finally { + try { + this.config.tearDown(); + } finally { + SpannerOptions.resetActiveTracingFramework(); + } + } } private void initializeInstance(InstanceId instanceId) throws Exception { diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionsBenchmark.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionsBenchmark.java index f71fdfe37a3e..eae4c4259afa 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionsBenchmark.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MultiplexedSessionsBenchmark.java @@ -86,6 +86,7 @@ public static class BenchmarkState { @Setup(Level.Iteration) public void setup() throws Exception { + SpannerOptions.resetActiveTracingFramework(); SpannerOptions.enableOpenTelemetryMetrics(); SpannerOptions.enableOpenTelemetryTraces(); SpannerOptions options = @@ -109,7 +110,11 @@ public void setup() throws Exception { @TearDown(Level.Iteration) public void teardown() throws Exception { - spanner.close(); + try { + spanner.close(); + } finally { + SpannerOptions.resetActiveTracingFramework(); + } } } diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenCensusApiTracerTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenCensusApiTracerTest.java index ad27c775729b..4311f15ef9e7 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenCensusApiTracerTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenCensusApiTracerTest.java @@ -49,6 +49,7 @@ import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import org.junit.After; +import org.junit.AfterClass; import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Ignore; @@ -97,6 +98,11 @@ public static void setupOpenTelemetry() throws Exception { field.set(null, failOnOverkillTraceComponent); } + @AfterClass + public static void resetTracing() { + SpannerOptions.resetActiveTracingFramework(); + } + @BeforeClass public static void setupResults() { RandomResultSetGenerator generator = new RandomResultSetGenerator(1); diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryApiTracerTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryApiTracerTest.java index 67012ed96225..fa079a0e46fc 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryApiTracerTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetryApiTracerTest.java @@ -103,6 +103,7 @@ public static void setupResults() { @AfterClass public static void closeOpenTelemetry() { + SpannerOptions.resetActiveTracingFramework(); if (openTelemetry != null) { openTelemetry.close(); } diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetrySpanTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetrySpanTest.java index 8ff8827664da..e003841f0c64 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetrySpanTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/OpenTelemetrySpanTest.java @@ -205,6 +205,7 @@ public static void startStaticServer() throws Exception { @AfterClass public static void stopServer() throws InterruptedException { + SpannerOptions.resetActiveTracingFramework(); if (server != null) { server.shutdown(); server.awaitTermination(); diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionImplTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionImplTest.java index 85d21c1e75a3..4e7197356350 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionImplTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SessionImplTest.java @@ -74,6 +74,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import javax.annotation.Nullable; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -100,6 +101,11 @@ public static void setupOpenTelemetry() { SpannerOptions.enableOpenTelemetryTraces(); } + @AfterClass + public static void resetOpenTelemetry() { + SpannerOptions.resetActiveTracingFramework(); + } + @SuppressWarnings("unchecked") @Before public void setUp() { diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpanTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpanTest.java index 449e78cf6125..c30283da86ce 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpanTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpanTest.java @@ -161,6 +161,7 @@ public static void startStaticServer() throws Exception { @AfterClass public static void stopServer() throws InterruptedException { + SpannerOptions.resetActiveTracingFramework(); if (server != null) { server.shutdown(); server.awaitTermination(); diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java index 7438ac6b1aba..1bcfde7d4e27 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java @@ -51,6 +51,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -81,6 +82,11 @@ public static void setupOpenTelemetry() { SpannerOptions.enableOpenTelemetryTraces(); } + @AfterClass + public static void resetOpenTelemetry() { + SpannerOptions.resetActiveTracingFramework(); + } + @Before public void setUp() { databaseAdminStubSettings = diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java index 2a8c6db211b4..2aefc2ca6ff7 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionManagerImplTest.java @@ -56,6 +56,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicInteger; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -89,6 +90,11 @@ public static void setupOpenTelemetry() { SpannerOptions.enableOpenTelemetryTraces(); } + @AfterClass + public static void resetOpenTelemetry() { + SpannerOptions.resetActiveTracingFramework(); + } + @Before public void setUp() { initMocks(this); diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java index 5fbcac89025d..3ee62127a2a3 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/TransactionRunnerImplTest.java @@ -74,6 +74,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicInteger; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -115,6 +116,11 @@ public static void setupOpenTelemetry() { SpannerOptions.enableOpenTelemetryTraces(); } + @AfterClass + public static void resetOpenTelemetry() { + SpannerOptions.resetActiveTracingFramework(); + } + @Before public void setUp() { MockitoAnnotations.initMocks(this); diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/OpenTelemetryTracingTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/OpenTelemetryTracingTest.java index a8e579feb1a3..6c2f9b82d16d 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/OpenTelemetryTracingTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/OpenTelemetryTracingTest.java @@ -83,6 +83,7 @@ public static void setupOpenTelemetry() { @AfterClass public static void closeOpenTelemetry() { + SpannerOptionsTestHelper.resetActiveTracingFramework(); SpannerPool.closeSpannerPool(); if (openTelemetry != null) { openTelemetry.close(); diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITEndToEndTracingTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITEndToEndTracingTest.java index 52d1bc94629c..050f342c472c 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITEndToEndTracingTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITEndToEndTracingTest.java @@ -84,7 +84,11 @@ public static void setUpDatabase() { @AfterClass public static void teardown() { - ConnectionOptions.closeSpanner(); + try { + ConnectionOptions.closeSpanner(); + } finally { + SpannerOptionsHelper.resetActiveTracingFramework(); + } } private void assertTrace(String traceId) throws IOException, InterruptedException { diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java index c2e4bb601665..39f68f6074c6 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java @@ -322,6 +322,7 @@ public ServerCall.Listener interceptCall( @After public void reset() throws InterruptedException { + SpannerOptionsHelper.resetActiveTracingFramework(); if (mockSpanner != null) { mockSpanner.reset(); }