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")); + } + } + } +}