From 3bc44dc5517f0065d023116fc0eefd42991f87b4 Mon Sep 17 00:00:00 2001 From: Sri Harsha CH Date: Fri, 21 Jun 2024 15:47:48 +0000 Subject: [PATCH 1/4] feat(spanner): add manual affinity in grpc-gcp --- .../google/cloud/spanner/spi/v1/GapicSpannerRpc.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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. From b35ce1a9f5e1ad06ab4ec51166b11e18c46e6940 Mon Sep 17 00:00:00 2001 From: Sri Harsha CH Date: Fri, 12 Jul 2024 10:19:51 +0000 Subject: [PATCH 2/4] chore: update sample files for testing --- google-cloud-spanner-executor/pom.xml | 5 +++ google-cloud-spanner/pom.xml | 1 + samples/snippets/grpc_java_logging_config.txt | 3 ++ samples/snippets/pom.xml | 6 +++ .../main/java/com/example/spanner/Mux.java | 45 +++++++++++++++++++ 5 files changed, 60 insertions(+) create mode 100644 samples/snippets/grpc_java_logging_config.txt create mode 100644 samples/snippets/src/main/java/com/example/spanner/Mux.java diff --git a/google-cloud-spanner-executor/pom.xml b/google-cloud-spanner-executor/pom.xml index c96f69730f8..797f5d97150 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 220102eec97..68001c05a7c 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 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 3a58a2a23d7..4fe1c95d139 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")); + } + } + } +} From 945d4208a144e20338607eae4cf11072a05c8058 Mon Sep 17 00:00:00 2001 From: Sri Harsha CH Date: Fri, 12 Jul 2024 11:19:34 +0000 Subject: [PATCH 3/4] chore: update benchmark files --- .../cloud/spanner/benchmark/BenchmarkRunner.java | 3 ++- .../cloud/spanner/benchmark/JavaClientRunner.java | 14 ++++++++++---- .../cloud/spanner/benchmark/LatencyBenchmark.java | 6 +++++- 3 files changed, 17 insertions(+), 6 deletions(-) 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..7dbdef3c5d4 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..efdbd2f461c 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,7 @@ 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 +103,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 +114,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 +122,7 @@ 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); } From c0b3bbb5650139ac36281eb662a55f063916c0db Mon Sep 17 00:00:00 2001 From: Sri Harsha CH Date: Wed, 17 Jul 2024 06:44:20 +0000 Subject: [PATCH 4/4] chore: update benchmark files --- benchmarks/README.md | 5 ++++- benchmarks/pom.xml | 6 +++--- .../cloud/spanner/benchmark/JavaClientRunner.java | 2 +- .../cloud/spanner/benchmark/LatencyBenchmark.java | 10 ++++++++-- google-cloud-spanner/pom.xml | 2 +- 5 files changed, 17 insertions(+), 8 deletions(-) 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/JavaClientRunner.java b/benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java index 7dbdef3c5d4..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 @@ -104,7 +104,7 @@ public List execute( .setProjectId(databaseId.getInstanceId().getProject()) .setSessionPoolOption(sessionPoolOptions) .setHost(SERVER_URL); - if(enableGrpcGcpExtension) { + if (enableGrpcGcpExtension) { System.out.println("Using gRPC-GCP extension for channel management"); optionsBuilder.enableGrpcGcpExtension(); } 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 efdbd2f461c..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,7 +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."); + options.addOption( + "g", "grpcgcpextension", true, "enable gRPC-GCP extension. Defaults to false."); CommandLineParser parser = new DefaultParser(); return parser.parse(options, args); } @@ -122,7 +123,12 @@ public void run(CommandLine commandLine) { JavaClientRunner javaClientRunner = new JavaClientRunner(databaseId); javaClientResults = javaClientRunner.execute( - transactionType, clients, operations, waitMillis, useMultiplexedSession, enableGrpcGcpExtension); + transactionType, + clients, + operations, + waitMillis, + useMultiplexedSession, + enableGrpcGcpExtension); printResults("Java Client Library", javaClientResults); } diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml index b92188164c9..4c2abb0feee 100644 --- a/google-cloud-spanner/pom.xml +++ b/google-cloud-spanner/pom.xml @@ -267,7 +267,7 @@ com.google.cloud google-cloud-monitoring - 3.38.0 + 3.31.0 com.google.api.grpc