From c7f72d60ae8810c0d6392f5263ea25a543f8f66c Mon Sep 17 00:00:00 2001
From: ankiaga <ankiaga@google.com>
Date: Tue, 15 Oct 2024 16:56:15 +0530
Subject: [PATCH 1/7] feat: Enabling endToEndTracing support in Connection API

---
 .../spanner/connection/ConnectionOptions.java | 14 ++++++
 .../connection/ConnectionProperties.java      |  9 ++++
 .../cloud/spanner/connection/SpannerPool.java |  7 +++
 .../connection/ConnectionOptionsTest.java     | 21 ++++++++
 .../spanner/connection/SpannerPoolTest.java   | 48 +++++++++++++++++++
 5 files changed, 99 insertions(+)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
index dcc4c663bb..5c2ae2d1d0 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
@@ -26,6 +26,7 @@
 import static com.google.cloud.spanner.connection.ConnectionProperties.DATA_BOOST_ENABLED;
 import static com.google.cloud.spanner.connection.ConnectionProperties.DIALECT;
 import static com.google.cloud.spanner.connection.ConnectionProperties.ENABLE_API_TRACING;
+import static com.google.cloud.spanner.connection.ConnectionProperties.ENABLE_END_TO_END_TRACING;
 import static com.google.cloud.spanner.connection.ConnectionProperties.ENABLE_EXTENDED_TRACING;
 import static com.google.cloud.spanner.connection.ConnectionProperties.ENCODED_CREDENTIALS;
 import static com.google.cloud.spanner.connection.ConnectionProperties.ENDPOINT;
@@ -239,6 +240,7 @@ public String[] getValidValues() {
   static final boolean DEFAULT_RETURN_COMMIT_STATS = false;
   static final boolean DEFAULT_LENIENT = false;
   static final boolean DEFAULT_ROUTE_TO_LEADER = true;
+  static final boolean DEFAULT_ENABLE_END_TO_END_TRACING = false;
   static final boolean DEFAULT_DELAY_TRANSACTION_START_UNTIL_FIRST_WRITE = false;
   static final boolean DEFAULT_KEEP_TRANSACTION_ALIVE = false;
   static final boolean DEFAULT_TRACK_SESSION_LEAKS = true;
@@ -267,6 +269,7 @@ public String[] getValidValues() {
   /** Name of the 'routeToLeader' connection property. */
   public static final String ROUTE_TO_LEADER_PROPERTY_NAME = "routeToLeader";
   /** Name of the 'retry aborts internally' connection property. */
+  public static final String ENABLE_END_TO_END_TRACING_PROPERTY_NAME = "enableEndToEndTracing";
   public static final String RETRY_ABORTS_INTERNALLY_PROPERTY_NAME = "retryAbortsInternally";
   /** Name of the property to enable/disable virtual threads for the statement executor. */
   public static final String USE_VIRTUAL_THREADS_PROPERTY_NAME = "useVirtualThreads";
@@ -382,6 +385,10 @@ static boolean isEnableTransactionalConnectionStateForPostgreSQL() {
                       ROUTE_TO_LEADER_PROPERTY_NAME,
                       "Should read/write transactions and partitioned DML be routed to leader region (true/false)",
                       DEFAULT_ROUTE_TO_LEADER),
+                  ConnectionProperty.createBooleanProperty(
+                      ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
+                      "Should we enable end to end tracing (true/false)",
+                      DEFAULT_ENABLE_END_TO_END_TRACING),
                   ConnectionProperty.createBooleanProperty(
                       RETRY_ABORTS_INTERNALLY_PROPERTY_NAME,
                       "Should the connection automatically retry Aborted errors (true/false)",
@@ -1205,6 +1212,13 @@ public boolean isRouteToLeader() {
     return getInitialConnectionPropertyValue(ROUTE_TO_LEADER);
   }
 
+  /**
+   * Whether end-to-end tracing is enabled.
+   */
+  public boolean enableEndToEndTracing() {
+    return getInitialConnectionPropertyValue(ENABLE_END_TO_END_TRACING);
+  }
+
   /**
    * The initial retryAbortsInternally value for connections created by this {@link
    * ConnectionOptions}
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
index c62571c6c0..aa1eff64a8 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
@@ -39,6 +39,7 @@
 import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_DDL_IN_TRANSACTION_MODE;
 import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_DELAY_TRANSACTION_START_UNTIL_FIRST_WRITE;
 import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_ENABLE_API_TRACING;
+import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_ENABLE_END_TO_END_TRACING;
 import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_ENABLE_EXTENDED_TRACING;
 import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_ENDPOINT;
 import static com.google.cloud.spanner.connection.ConnectionOptions.DEFAULT_KEEP_TRANSACTION_ALIVE;
@@ -65,6 +66,7 @@
 import static com.google.cloud.spanner.connection.ConnectionOptions.DELAY_TRANSACTION_START_UNTIL_FIRST_WRITE_NAME;
 import static com.google.cloud.spanner.connection.ConnectionOptions.DIALECT_PROPERTY_NAME;
 import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_API_TRACING_PROPERTY_NAME;
+import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_END_TO_END_TRACING_PROPERTY_NAME;
 import static com.google.cloud.spanner.connection.ConnectionOptions.ENABLE_EXTENDED_TRACING_PROPERTY_NAME;
 import static com.google.cloud.spanner.connection.ConnectionOptions.ENCODED_CREDENTIALS_PROPERTY_NAME;
 import static com.google.cloud.spanner.connection.ConnectionOptions.ENDPOINT_PROPERTY_NAME;
@@ -257,6 +259,13 @@ class ConnectionProperties {
           DEFAULT_ROUTE_TO_LEADER,
           BooleanConverter.INSTANCE,
           Context.STARTUP);
+  static final ConnectionProperty<Boolean> ENABLE_END_TO_END_TRACING =
+      create(
+          ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
+          "Should we enable end to end tracing (true/false)",
+          DEFAULT_ENABLE_END_TO_END_TRACING,
+          BooleanConverter.INSTANCE,
+          Context.STARTUP);
   static final ConnectionProperty<Boolean> USE_VIRTUAL_THREADS =
       create(
           USE_VIRTUAL_THREADS_PROPERTY_NAME,
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
index 246d340b07..1abf8628fa 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
@@ -156,6 +156,7 @@ static class SpannerPoolKey {
     private final String userAgent;
     private final String databaseRole;
     private final boolean routeToLeader;
+    private final boolean enableEndToEndTracing;
     private final boolean useVirtualGrpcTransportThreads;
     private final OpenTelemetry openTelemetry;
     private final Boolean enableExtendedTracing;
@@ -186,6 +187,7 @@ private SpannerPoolKey(ConnectionOptions options) throws IOException {
       this.usePlainText = options.isUsePlainText();
       this.userAgent = options.getUserAgent();
       this.routeToLeader = options.isRouteToLeader();
+      this.enableEndToEndTracing = options.enableEndToEndTracing();
       this.useVirtualGrpcTransportThreads = options.isUseVirtualGrpcTransportThreads();
       this.openTelemetry = options.getOpenTelemetry();
       this.enableExtendedTracing = options.isEnableExtendedTracing();
@@ -207,6 +209,7 @@ public boolean equals(Object o) {
           && Objects.equals(this.usePlainText, other.usePlainText)
           && Objects.equals(this.userAgent, other.userAgent)
           && Objects.equals(this.routeToLeader, other.routeToLeader)
+          && Objects.equals(this.enableEndToEndTracing, other.enableEndToEndTracing)
           && Objects.equals(
               this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads)
           && Objects.equals(this.openTelemetry, other.openTelemetry)
@@ -226,6 +229,7 @@ public int hashCode() {
           this.databaseRole,
           this.userAgent,
           this.routeToLeader,
+          this.enableEndToEndTracing,
           this.useVirtualGrpcTransportThreads,
           this.openTelemetry,
           this.enableExtendedTracing,
@@ -380,6 +384,9 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
     if (!options.isRouteToLeader()) {
       builder.disableLeaderAwareRouting();
     }
+    if (options.enableEndToEndTracing()) {
+      builder.setEnableEndToEndTracing(true);
+    }
     if (key.usePlainText) {
       // Credentials may not be sent over a plain text channel.
       builder.setCredentials(NoCredentials.getInstance());
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java
index 94a44579ac..b33188ff3c 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java
@@ -322,6 +322,27 @@ public void testBuildWithRouteToLeader() {
     assertTrue(options.isRouteToLeader());
   }
 
+  @Test
+  public void testBuildWithEndToEndTracingEnabled() {
+    final String BASE_URI =
+        "cloudspanner:/projects/test-project-123/instances/test-instance-123/databases/test-database-123";
+    ConnectionOptions.Builder builder = ConnectionOptions.newBuilder();
+    builder.setUri(BASE_URI + "?enableEndToEndTracing=true");
+    builder.setCredentialsUrl(FILE_TEST_PATH);
+    ConnectionOptions options = builder.build();
+    assertEquals(options.getHost(), DEFAULT_HOST);
+    assertEquals(options.getProjectId(), TEST_PROJECT);
+    assertEquals(options.getInstanceId(), TEST_INSTANCE);
+    assertEquals(options.getDatabaseName(), TEST_DATABASE);
+    assertTrue(options.enableEndToEndTracing());
+
+    // Test for default behavior for enableEndToEndTracing property.
+    builder = ConnectionOptions.newBuilder().setUri(BASE_URI);
+    builder.setCredentialsUrl(FILE_TEST_PATH);
+    options = builder.build();
+    assertFalse(options.enableEndToEndTracing());
+  }
+
   @Test
   public void testBuildWithAutoConfigEmulatorAndHost() {
     ConnectionOptions.Builder builder = ConnectionOptions.newBuilder();
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java
index 19d4913963..b3d405947d 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java
@@ -563,6 +563,54 @@ public void testEnableApiTracing() {
                 .build()));
   }
 
+  @Test
+  public void testEnableEndToEndTracing() {
+    SpannerPoolKey keyWithoutApiTracingConfig =
+        SpannerPoolKey.of(
+            ConnectionOptions.newBuilder()
+                .setUri("cloudspanner:/projects/p/instances/i/databases/d")
+                .setCredentials(NoCredentials.getInstance())
+                .build());
+    SpannerPoolKey keyWithApiTracingEnabled =
+        SpannerPoolKey.of(
+            ConnectionOptions.newBuilder()
+                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=true")
+                .setCredentials(NoCredentials.getInstance())
+                .build());
+    SpannerPoolKey keyWithApiTracingDisabled =
+        SpannerPoolKey.of(
+            ConnectionOptions.newBuilder()
+                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=false")
+                .setCredentials(NoCredentials.getInstance())
+                .build());
+
+    assertNotEquals(keyWithoutApiTracingConfig, keyWithApiTracingEnabled);
+    assertEquals(keyWithoutApiTracingConfig, keyWithApiTracingDisabled);
+    assertNotEquals(keyWithApiTracingEnabled, keyWithApiTracingDisabled);
+
+    assertEquals(
+        keyWithApiTracingEnabled,
+        SpannerPoolKey.of(
+            ConnectionOptions.newBuilder()
+                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=true")
+                .setCredentials(NoCredentials.getInstance())
+                .build()));
+    assertEquals(
+        keyWithApiTracingDisabled,
+        SpannerPoolKey.of(
+            ConnectionOptions.newBuilder()
+                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=false")
+                .setCredentials(NoCredentials.getInstance())
+                .build()));
+    assertEquals(
+        keyWithoutApiTracingConfig,
+        SpannerPoolKey.of(
+            ConnectionOptions.newBuilder()
+                .setUri("cloudspanner:/projects/p/instances/i/databases/d")
+                .setCredentials(NoCredentials.getInstance())
+                .build()));
+  }
+
   @Test
   public void testOpenTelemetry() {
     SpannerPool pool = createSubjectAndMocks();

From 846a00269e460c79702318254e1eef8cfdefc948 Mon Sep 17 00:00:00 2001
From: ankiaga <ankiaga@google.com>
Date: Tue, 15 Oct 2024 17:02:40 +0530
Subject: [PATCH 2/7] fix formatting

---
 .../cloud/spanner/connection/ConnectionOptions.java  |  5 ++---
 .../cloud/spanner/connection/SpannerPoolTest.java    | 12 ++++++++----
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
index 5c2ae2d1d0..8ee76635d4 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
@@ -270,6 +270,7 @@ public String[] getValidValues() {
   public static final String ROUTE_TO_LEADER_PROPERTY_NAME = "routeToLeader";
   /** Name of the 'retry aborts internally' connection property. */
   public static final String ENABLE_END_TO_END_TRACING_PROPERTY_NAME = "enableEndToEndTracing";
+
   public static final String RETRY_ABORTS_INTERNALLY_PROPERTY_NAME = "retryAbortsInternally";
   /** Name of the property to enable/disable virtual threads for the statement executor. */
   public static final String USE_VIRTUAL_THREADS_PROPERTY_NAME = "useVirtualThreads";
@@ -1212,9 +1213,7 @@ public boolean isRouteToLeader() {
     return getInitialConnectionPropertyValue(ROUTE_TO_LEADER);
   }
 
-  /**
-   * Whether end-to-end tracing is enabled.
-   */
+  /** Whether end-to-end tracing is enabled. */
   public boolean enableEndToEndTracing() {
     return getInitialConnectionPropertyValue(ENABLE_END_TO_END_TRACING);
   }
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java
index b3d405947d..fea0b8aa6c 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java
@@ -574,13 +574,15 @@ public void testEnableEndToEndTracing() {
     SpannerPoolKey keyWithApiTracingEnabled =
         SpannerPoolKey.of(
             ConnectionOptions.newBuilder()
-                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=true")
+                .setUri(
+                    "cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=true")
                 .setCredentials(NoCredentials.getInstance())
                 .build());
     SpannerPoolKey keyWithApiTracingDisabled =
         SpannerPoolKey.of(
             ConnectionOptions.newBuilder()
-                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=false")
+                .setUri(
+                    "cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=false")
                 .setCredentials(NoCredentials.getInstance())
                 .build());
 
@@ -592,14 +594,16 @@ public void testEnableEndToEndTracing() {
         keyWithApiTracingEnabled,
         SpannerPoolKey.of(
             ConnectionOptions.newBuilder()
-                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=true")
+                .setUri(
+                    "cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=true")
                 .setCredentials(NoCredentials.getInstance())
                 .build()));
     assertEquals(
         keyWithApiTracingDisabled,
         SpannerPoolKey.of(
             ConnectionOptions.newBuilder()
-                .setUri("cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=false")
+                .setUri(
+                    "cloudspanner:/projects/p/instances/i/databases/d?enableEndToEndTracing=false")
                 .setCredentials(NoCredentials.getInstance())
                 .build()));
     assertEquals(

From 39d392b5db17e9301b569ac1c86177b079a09ce2 Mon Sep 17 00:00:00 2001
From: ankiaga <ankiaga@google.com>
Date: Mon, 21 Oct 2024 15:38:57 +0530
Subject: [PATCH 3/7] Comments incorporated

---
 .../spanner/connection/ConnectionOptions.java | 24 +++++++++++--------
 .../connection/ConnectionProperties.java      | 17 +++++++------
 .../cloud/spanner/connection/SpannerPool.java |  6 ++---
 .../connection/ConnectionOptionsTest.java     |  4 ++--
 4 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
index 8ee76635d4..6c215e05fc 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
@@ -240,7 +240,6 @@ public String[] getValidValues() {
   static final boolean DEFAULT_RETURN_COMMIT_STATS = false;
   static final boolean DEFAULT_LENIENT = false;
   static final boolean DEFAULT_ROUTE_TO_LEADER = true;
-  static final boolean DEFAULT_ENABLE_END_TO_END_TRACING = false;
   static final boolean DEFAULT_DELAY_TRANSACTION_START_UNTIL_FIRST_WRITE = false;
   static final boolean DEFAULT_KEEP_TRANSACTION_ALIVE = false;
   static final boolean DEFAULT_TRACK_SESSION_LEAKS = true;
@@ -251,6 +250,7 @@ public String[] getValidValues() {
   static final int DEFAULT_MAX_PARTITIONED_PARALLELISM = 1;
   static final Boolean DEFAULT_ENABLE_EXTENDED_TRACING = null;
   static final Boolean DEFAULT_ENABLE_API_TRACING = null;
+  static final boolean DEFAULT_ENABLE_END_TO_END_TRACING = false;
   static final boolean DEFAULT_AUTO_BATCH_DML = false;
   static final long DEFAULT_AUTO_BATCH_DML_UPDATE_COUNT = 1L;
   static final boolean DEFAULT_AUTO_BATCH_DML_UPDATE_COUNT_VERIFICATION = true;
@@ -269,8 +269,6 @@ public String[] getValidValues() {
   /** Name of the 'routeToLeader' connection property. */
   public static final String ROUTE_TO_LEADER_PROPERTY_NAME = "routeToLeader";
   /** Name of the 'retry aborts internally' connection property. */
-  public static final String ENABLE_END_TO_END_TRACING_PROPERTY_NAME = "enableEndToEndTracing";
-
   public static final String RETRY_ABORTS_INTERNALLY_PROPERTY_NAME = "retryAbortsInternally";
   /** Name of the property to enable/disable virtual threads for the statement executor. */
   public static final String USE_VIRTUAL_THREADS_PROPERTY_NAME = "useVirtualThreads";
@@ -339,6 +337,7 @@ public String[] getValidValues() {
 
   public static final String ENABLE_EXTENDED_TRACING_PROPERTY_NAME = "enableExtendedTracing";
   public static final String ENABLE_API_TRACING_PROPERTY_NAME = "enableApiTracing";
+  public static final String ENABLE_END_TO_END_TRACING_PROPERTY_NAME = "enableEndToEndTracing";
 
   public static final String AUTO_BATCH_DML_PROPERTY_NAME = "auto_batch_dml";
   public static final String AUTO_BATCH_DML_UPDATE_COUNT_PROPERTY_NAME =
@@ -386,10 +385,6 @@ static boolean isEnableTransactionalConnectionStateForPostgreSQL() {
                       ROUTE_TO_LEADER_PROPERTY_NAME,
                       "Should read/write transactions and partitioned DML be routed to leader region (true/false)",
                       DEFAULT_ROUTE_TO_LEADER),
-                  ConnectionProperty.createBooleanProperty(
-                      ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
-                      "Should we enable end to end tracing (true/false)",
-                      DEFAULT_ENABLE_END_TO_END_TRACING),
                   ConnectionProperty.createBooleanProperty(
                       RETRY_ABORTS_INTERNALLY_PROPERTY_NAME,
                       "Should the connection automatically retry Aborted errors (true/false)",
@@ -545,7 +540,14 @@ static boolean isEnableTransactionalConnectionStateForPostgreSQL() {
                           + "to get a detailed view of each RPC that is being executed by your application, "
                           + "or if you want to debug potential latency problems caused by RPCs that are "
                           + "being retried.",
-                      DEFAULT_ENABLE_API_TRACING))));
+                      DEFAULT_ENABLE_API_TRACING),
+                  ConnectionProperty.createBooleanProperty(
+                      ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
+                      "Enable end-to-end tracing (true/false) to generate traces for both the time "
+                          + "that is spent in the client, as well as time that is spent in the Spanner server. "
+                          + "Server side traces would always go to Google Cloud Trace so to see end to end traces, "
+                          + "client should choose an exporter that exports the traces to Google Cloud Trace.",
+                      DEFAULT_ENABLE_END_TO_END_TRACING))));
 
   private static final Set<ConnectionProperty> INTERNAL_PROPERTIES =
       Collections.unmodifiableSet(
@@ -1213,8 +1215,10 @@ public boolean isRouteToLeader() {
     return getInitialConnectionPropertyValue(ROUTE_TO_LEADER);
   }
 
-  /** Whether end-to-end tracing is enabled. */
-  public boolean enableEndToEndTracing() {
+  /**
+   * Whether end-to-end tracing is enabled.
+   */
+  public boolean isEndToEndTracingEnabled() {
     return getInitialConnectionPropertyValue(ENABLE_END_TO_END_TRACING);
   }
 
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
index aa1eff64a8..889d5328fe 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
@@ -259,13 +259,6 @@ class ConnectionProperties {
           DEFAULT_ROUTE_TO_LEADER,
           BooleanConverter.INSTANCE,
           Context.STARTUP);
-  static final ConnectionProperty<Boolean> ENABLE_END_TO_END_TRACING =
-      create(
-          ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
-          "Should we enable end to end tracing (true/false)",
-          DEFAULT_ENABLE_END_TO_END_TRACING,
-          BooleanConverter.INSTANCE,
-          Context.STARTUP);
   static final ConnectionProperty<Boolean> USE_VIRTUAL_THREADS =
       create(
           USE_VIRTUAL_THREADS_PROPERTY_NAME,
@@ -301,6 +294,16 @@ class ConnectionProperties {
           DEFAULT_ENABLE_API_TRACING,
           BooleanConverter.INSTANCE,
           Context.STARTUP);
+  static final ConnectionProperty<Boolean> ENABLE_END_TO_END_TRACING =
+      create(
+          ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
+          "Enable end-to-end tracing (true/false) to generate traces for both the time "
+              + "that is spent in the client, as well as time that is spent in the Spanner server. "
+              + "Server side traces would always go to Google Cloud Trace so to see end to end traces, "
+              + "client should choose an exporter that exports the traces to Google Cloud Trace.",
+          DEFAULT_ENABLE_END_TO_END_TRACING,
+          BooleanConverter.INSTANCE,
+          Context.STARTUP);
   static final ConnectionProperty<Integer> MIN_SESSIONS =
       create(
           MIN_SESSIONS_PROPERTY_NAME,
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
index 1abf8628fa..22840045ef 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
@@ -156,11 +156,11 @@ static class SpannerPoolKey {
     private final String userAgent;
     private final String databaseRole;
     private final boolean routeToLeader;
-    private final boolean enableEndToEndTracing;
     private final boolean useVirtualGrpcTransportThreads;
     private final OpenTelemetry openTelemetry;
     private final Boolean enableExtendedTracing;
     private final Boolean enableApiTracing;
+    private final boolean enableEndToEndTracing;
 
     @VisibleForTesting
     static SpannerPoolKey of(ConnectionOptions options) {
@@ -187,11 +187,11 @@ private SpannerPoolKey(ConnectionOptions options) throws IOException {
       this.usePlainText = options.isUsePlainText();
       this.userAgent = options.getUserAgent();
       this.routeToLeader = options.isRouteToLeader();
-      this.enableEndToEndTracing = options.enableEndToEndTracing();
       this.useVirtualGrpcTransportThreads = options.isUseVirtualGrpcTransportThreads();
       this.openTelemetry = options.getOpenTelemetry();
       this.enableExtendedTracing = options.isEnableExtendedTracing();
       this.enableApiTracing = options.isEnableApiTracing();
+      this.enableEndToEndTracing = options.isEndToEndTracingEnabled();
     }
 
     @Override
@@ -384,7 +384,7 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
     if (!options.isRouteToLeader()) {
       builder.disableLeaderAwareRouting();
     }
-    if (options.enableEndToEndTracing()) {
+    if (options.isEndToEndTracingEnabled()) {
       builder.setEnableEndToEndTracing(true);
     }
     if (key.usePlainText) {
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java
index b33188ff3c..f826ec08df 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java
@@ -334,13 +334,13 @@ public void testBuildWithEndToEndTracingEnabled() {
     assertEquals(options.getProjectId(), TEST_PROJECT);
     assertEquals(options.getInstanceId(), TEST_INSTANCE);
     assertEquals(options.getDatabaseName(), TEST_DATABASE);
-    assertTrue(options.enableEndToEndTracing());
+    assertTrue(options.isEndToEndTracingEnabled());
 
     // Test for default behavior for enableEndToEndTracing property.
     builder = ConnectionOptions.newBuilder().setUri(BASE_URI);
     builder.setCredentialsUrl(FILE_TEST_PATH);
     options = builder.build();
-    assertFalse(options.enableEndToEndTracing());
+    assertFalse(options.isEndToEndTracingEnabled());
   }
 
   @Test

From 751c9473d5d03d4ac70b405dd49045231500a9cb Mon Sep 17 00:00:00 2001
From: ankiaga <ankiaga@google.com>
Date: Mon, 21 Oct 2024 15:45:38 +0530
Subject: [PATCH 4/7] formatting fixed

---
 .../google/cloud/spanner/connection/SpannerPool.java   | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
index 22840045ef..ed26f76659 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
@@ -209,12 +209,12 @@ public boolean equals(Object o) {
           && Objects.equals(this.usePlainText, other.usePlainText)
           && Objects.equals(this.userAgent, other.userAgent)
           && Objects.equals(this.routeToLeader, other.routeToLeader)
-          && Objects.equals(this.enableEndToEndTracing, other.enableEndToEndTracing)
           && Objects.equals(
-              this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads)
+          this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads)
           && Objects.equals(this.openTelemetry, other.openTelemetry)
           && Objects.equals(this.enableExtendedTracing, other.enableExtendedTracing)
-          && Objects.equals(this.enableApiTracing, other.enableApiTracing);
+          && Objects.equals(this.enableApiTracing, other.enableApiTracing)
+          && Objects.equals(this.enableEndToEndTracing, other.enableEndToEndTracing);
     }
 
     @Override
@@ -229,11 +229,11 @@ public int hashCode() {
           this.databaseRole,
           this.userAgent,
           this.routeToLeader,
-          this.enableEndToEndTracing,
           this.useVirtualGrpcTransportThreads,
           this.openTelemetry,
           this.enableExtendedTracing,
-          this.enableApiTracing);
+          this.enableApiTracing,
+          this.enableEndToEndTracing);
     }
   }
 

From e4f86e88bcb5ea8a446df2929f3fbe113d10b37a Mon Sep 17 00:00:00 2001
From: ankiaga <ankiaga@google.com>
Date: Mon, 21 Oct 2024 16:57:11 +0530
Subject: [PATCH 5/7] formatting fixed

---
 .../google/cloud/spanner/connection/ConnectionOptions.java    | 4 +---
 .../java/com/google/cloud/spanner/connection/SpannerPool.java | 2 +-
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
index 6c215e05fc..e4cb67b24e 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
@@ -1215,9 +1215,7 @@ public boolean isRouteToLeader() {
     return getInitialConnectionPropertyValue(ROUTE_TO_LEADER);
   }
 
-  /**
-   * Whether end-to-end tracing is enabled.
-   */
+  /** Whether end-to-end tracing is enabled. */
   public boolean isEndToEndTracingEnabled() {
     return getInitialConnectionPropertyValue(ENABLE_END_TO_END_TRACING);
   }
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
index ed26f76659..81246e4193 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java
@@ -210,7 +210,7 @@ public boolean equals(Object o) {
           && Objects.equals(this.userAgent, other.userAgent)
           && Objects.equals(this.routeToLeader, other.routeToLeader)
           && Objects.equals(
-          this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads)
+              this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads)
           && Objects.equals(this.openTelemetry, other.openTelemetry)
           && Objects.equals(this.enableExtendedTracing, other.enableExtendedTracing)
           && Objects.equals(this.enableApiTracing, other.enableApiTracing)

From 5de71f8013328db9639d3c78b75d446c005969e1 Mon Sep 17 00:00:00 2001
From: Ankit Agarwal <146331865+ankiaga@users.noreply.github.com>
Date: Tue, 22 Oct 2024 08:52:50 +0530
Subject: [PATCH 6/7] Update
 google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Knut Olav Løite <koloite@gmail.com>
---
 .../google/cloud/spanner/connection/ConnectionOptions.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
index e4cb67b24e..66b09c35af 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java
@@ -545,8 +545,8 @@ static boolean isEnableTransactionalConnectionStateForPostgreSQL() {
                       ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
                       "Enable end-to-end tracing (true/false) to generate traces for both the time "
                           + "that is spent in the client, as well as time that is spent in the Spanner server. "
-                          + "Server side traces would always go to Google Cloud Trace so to see end to end traces, "
-                          + "client should choose an exporter that exports the traces to Google Cloud Trace.",
+                          + "Server side traces can only go to Google Cloud Trace, so to see end to end traces, "
+                          + "the application should configure an exporter that exports the traces to Google Cloud Trace.",
                       DEFAULT_ENABLE_END_TO_END_TRACING))));
 
   private static final Set<ConnectionProperty> INTERNAL_PROPERTIES =

From bf3361c15e7e6e6e0d250327200b46f448e13b24 Mon Sep 17 00:00:00 2001
From: Ankit Agarwal <146331865+ankiaga@users.noreply.github.com>
Date: Tue, 22 Oct 2024 08:52:56 +0530
Subject: [PATCH 7/7] Update
 google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Knut Olav Løite <koloite@gmail.com>
---
 .../google/cloud/spanner/connection/ConnectionProperties.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
index 889d5328fe..0ca9b7256e 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java
@@ -299,8 +299,8 @@ class ConnectionProperties {
           ENABLE_END_TO_END_TRACING_PROPERTY_NAME,
           "Enable end-to-end tracing (true/false) to generate traces for both the time "
               + "that is spent in the client, as well as time that is spent in the Spanner server. "
-              + "Server side traces would always go to Google Cloud Trace so to see end to end traces, "
-              + "client should choose an exporter that exports the traces to Google Cloud Trace.",
+              + "Server side traces can only go to Google Cloud Trace, so to see end to end traces, "
+              + "the application should configure an exporter that exports the traces to Google Cloud Trace.",
           DEFAULT_ENABLE_END_TO_END_TRACING,
           BooleanConverter.INSTANCE,
           Context.STARTUP);