diff --git a/benchmarks/README.md b/benchmarks/README.md
index 4f829e22a03..ed7fa875822 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -50,4 +50,7 @@ mvn clean compile exec:java -Dexec.args="--clients=10 --operations=5000 --multip
make sure that tests uses regular sessions.
```shell
mvn clean compile exec:java -Dexec.args="--clients=10 --operations=5000"
-```
\ No newline at end of file
+```
+```shell
+mvn clean compile exec:java -Dcheckstyle.skip -Dexec.args="--clients=1 --operations=10000 --transaction=READ_ONLY_MULTI_USE --multiplexed=false --grpcgcpextension=false"
+```
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
index 14131d2342d..67608552976 100644
--- a/benchmarks/pom.xml
+++ b/benchmarks/pom.xml
@@ -49,12 +49,12 @@
com.google.cloud.opentelemetry
exporter-trace
- 0.29.0
+ 0.31.0
com.google.cloud.opentelemetry
exporter-metrics
- 0.29.0
+ 0.31.0
@@ -92,7 +92,7 @@
com.google.cloud
google-cloud-spanner
- 6.67.0
+ 6.71.1-SNAPSHOT
commons-cli
diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java
index 7a731887a86..d91e6b122c6 100644
--- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java
+++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java
@@ -31,5 +31,6 @@ List execute(
int numClients,
int numOperations,
int waitMillis,
- boolean useMultiplexedSession);
+ boolean useMultiplexedSession,
+ boolean enableGrpcGcpExtension);
}
diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java
index 6fc0842f376..686ac6820ae 100644
--- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java
+++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java
@@ -66,7 +66,8 @@ public List execute(
int numClients,
int numOperations,
int waitMillis,
- boolean useMultiplexedSession) {
+ boolean useMultiplexedSession,
+ boolean enableGrpcGcpExtension) {
// setup open telemetry metrics and traces
// setup open telemetry metrics and traces
SpanExporter traceExporter = TraceExporter.createWithDefaultConfiguration();
@@ -97,13 +98,18 @@ public List execute(
.build();
SpannerOptions.enableOpenTelemetryMetrics();
SpannerOptions.enableOpenTelemetryTraces();
- SpannerOptions options =
+ SpannerOptions.Builder optionsBuilder =
SpannerOptions.newBuilder()
.setOpenTelemetry(openTelemetry)
.setProjectId(databaseId.getInstanceId().getProject())
.setSessionPoolOption(sessionPoolOptions)
- .setHost(SERVER_URL)
- .build();
+ .setHost(SERVER_URL);
+ if (enableGrpcGcpExtension) {
+ System.out.println("Using gRPC-GCP extension for channel management");
+ optionsBuilder.enableGrpcGcpExtension();
+ }
+
+ SpannerOptions options = optionsBuilder.build();
// Register query stats metric.
// This should be done once before start recording the data.
Meter meter = openTelemetry.getMeter("cloud.google.com/java");
diff --git a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java
index 73683932def..3407543abdc 100644
--- a/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java
+++ b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/LatencyBenchmark.java
@@ -79,6 +79,8 @@ private static CommandLine parseCommandLine(String[] args) throws ParseException
options.addOption("m", "multiplexed", true, "Use multiplexed sessions. Defaults to false.");
options.addOption("w", "wait", true, "Wait time in millis. Defaults to zero.");
options.addOption("name", true, "Name of this test run");
+ options.addOption(
+ "g", "grpcgcpextension", true, "enable gRPC-GCP extension. Defaults to false.");
CommandLineParser parser = new DefaultParser();
return parser.parse(options, args);
}
@@ -102,6 +104,8 @@ public void run(CommandLine commandLine) {
: TransactionType.READ_ONLY_SINGLE_USE;
boolean useMultiplexedSession =
commandLine.hasOption('m') ? Boolean.parseBoolean(commandLine.getOptionValue('m')) : false;
+ boolean enableGrpcGcpExtension =
+ commandLine.hasOption('g') ? Boolean.parseBoolean(commandLine.getOptionValue('g')) : false;
System.out.println();
System.out.println("Running benchmark with the following options");
@@ -111,6 +115,7 @@ public void run(CommandLine commandLine) {
System.out.printf("Transaction type: %s\n", transactionType);
System.out.printf("Use Multiplexed Sessions: %s\n", useMultiplexedSession);
System.out.printf("Wait between queries: %dms\n", waitMillis);
+ System.out.printf("Using gRPC-GCP extension: %s\n", enableGrpcGcpExtension);
List javaClientResults = null;
System.out.println();
@@ -118,7 +123,12 @@ public void run(CommandLine commandLine) {
JavaClientRunner javaClientRunner = new JavaClientRunner(databaseId);
javaClientResults =
javaClientRunner.execute(
- transactionType, clients, operations, waitMillis, useMultiplexedSession);
+ transactionType,
+ clients,
+ operations,
+ waitMillis,
+ useMultiplexedSession,
+ enableGrpcGcpExtension);
printResults("Java Client Library", javaClientResults);
}
diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml
index 6df4fe5830c..dab4b02fcde 100644
--- a/google-cloud-spanner-executor/pom.xml
+++ b/google-cloud-spanner-executor/pom.xml
@@ -30,6 +30,11 @@
io.grpc
grpc-api
+
+ com.google.cloud
+ grpc-gcp
+ 1.6.1
+
io.grpc
grpc-netty-shaded
diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml
index 8a79e70362e..4c2abb0feee 100644
--- a/google-cloud-spanner/pom.xml
+++ b/google-cloud-spanner/pom.xml
@@ -162,6 +162,7 @@
com.google.cloud
grpc-gcp
+ 1.6.1
io.grpc
@@ -266,7 +267,7 @@
com.google.cloud
google-cloud-monitoring
- 3.38.0
+ 3.31.0
com.google.api.grpc
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java
index b6016f04f78..3226214e69a 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java
@@ -56,6 +56,7 @@
import com.google.api.pathtemplate.PathTemplate;
import com.google.cloud.RetryHelper;
import com.google.cloud.RetryHelper.RetryHelperException;
+import com.google.cloud.grpc.GcpManagedChannel;
import com.google.cloud.grpc.GcpManagedChannelBuilder;
import com.google.cloud.grpc.GcpManagedChannelOptions;
import com.google.cloud.grpc.GcpManagedChannelOptions.GcpMetricsOptions;
@@ -1950,7 +1951,16 @@ GrpcCallContext newCallContext(
boolean routeToLeader) {
GrpcCallContext context = GrpcCallContext.createDefault();
if (options != null) {
+ // Set channel affinity in GAX
context = context.withChannelAffinity(Option.CHANNEL_HINT.getLong(options).intValue());
+ // Set channel affinity in gRPC-GCP
+ context =
+ context.withCallOptions(
+ context
+ .getCallOptions()
+ .withOption(
+ GcpManagedChannel.AFFINITY_KEY,
+ Option.CHANNEL_HINT.getLong(options).toString()));
}
if (compressorName != null) {
// This sets the compressor for Client -> Server.
diff --git a/samples/snippets/grpc_java_logging_config.txt b/samples/snippets/grpc_java_logging_config.txt
new file mode 100644
index 00000000000..8199d87d7e9
--- /dev/null
+++ b/samples/snippets/grpc_java_logging_config.txt
@@ -0,0 +1,3 @@
+handlers = java.util.logging.ConsoleHandler
+java.util.logging.ConsoleHandler.level = ALL
+com.google.cloud.grpc.GcpManagedChannel.level=FINEST
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index ced7df0a375..a5bdf9fab5a 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -42,9 +42,15 @@
+
+ com.google.cloud
+ grpc-gcp
+ 1.6.1
+
com.google.cloud
google-cloud-spanner
+ 6.69.1-SNAPSHOT
diff --git a/samples/snippets/src/main/java/com/example/spanner/Mux.java b/samples/snippets/src/main/java/com/example/spanner/Mux.java
new file mode 100644
index 00000000000..2039add3afd
--- /dev/null
+++ b/samples/snippets/src/main/java/com/example/spanner/Mux.java
@@ -0,0 +1,45 @@
+package com.example.spanner;
+
+import com.google.cloud.spanner.DatabaseClient;
+import com.google.cloud.spanner.DatabaseId;
+import com.google.cloud.spanner.ResultSet;
+import com.google.cloud.spanner.Spanner;
+import com.google.cloud.spanner.SpannerOptions;
+import com.google.cloud.spanner.Statement;
+import java.math.BigDecimal;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+class Mux {
+ public static void main(String[] args){
+ Logger.getLogger("com.google.cloud.grpc.GcpManagedChannel").setLevel(Level.FINEST);
+ queryWithNumericParameter();
+ }
+
+ static void queryWithNumericParameter() {
+ // TODO(developer): Replace these variables before running the sample.
+ String projectId = "span-cloud-testing";
+ String instanceId = "harsha-test-gcloud";
+ String databaseId = "database1";
+
+ try (Spanner spanner =
+ SpannerOptions.newBuilder().setProjectId(projectId).enableGrpcGcpExtension().build().getService()) {
+ DatabaseClient client =
+ spanner.getDatabaseClient(DatabaseId.of(projectId, instanceId, databaseId));
+ queryWithNumericParameter(client);
+ }
+ }
+
+ static void queryWithNumericParameter(DatabaseClient client) {
+ Statement statement =
+ Statement.newBuilder(
+ "SELECT SingerId, FirstName, LastName FROM Singers")
+ .build();
+ try (ResultSet resultSet = client.singleUse().executeQuery(statement)) {
+ while (resultSet.next()) {
+ System.out.printf(
+ "%d %s %s %n", resultSet.getLong("SingerId"), resultSet.getString("FirstName"), resultSet.getString("LastName"));
+ }
+ }
+ }
+}