From f3acb26e0a51db10ce4ba924e52236a297e55d6d Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 31 Mar 2021 20:25:39 -0700 Subject: [PATCH 1/7] samples: add samples for tagging feature --- .../spanner/TransactionWithTagSample.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java new file mode 100644 index 0000000000..bfc07497d6 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -0,0 +1,64 @@ +/* + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.spanner; + +import com.google.cloud.spanner.DatabaseClient; +import com.google.cloud.spanner.Options; +import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.Statement; +import com.google.cloud.spanner.TransactionContext; +import com.google.cloud.spanner.TransactionRunner.TransactionCallable; + +/** Sample showing how to add and query tags to Cloud Spanner operations. */ +public class TransactionWithTagSample { + + // [START spanner_set_transaction_and_request_tags] + static void taggedTransaction(DatabaseClient databaseClient) { + databaseClient + .readWriteTransaction(Options.tag("app=spanner,env=test")) + .run( + new TransactionCallable() { + @Override + public Void run(TransactionContext transaction) throws Exception { + String sql = + "INSERT Singers (SingerId, FirstName, LastName)\n" + + "VALUES (20, 'George', 'Washington')"; + long rowCount = transaction.executeUpdate(Statement.of(sql), + Options.tag("app=spanner,env=test,action=update")); + System.out.printf("%d record inserted.%n", rowCount); + return null; + } + }); + } + // [END spanner_set_transaction_and_request_tags] + + // [START spanner_query_tags] + static void queryStats(DatabaseClient databaseClient) { + // Execute query on Query statistics + // see: https://cloud.google.com/spanner/docs/introspection/query-statistics, for more details. + String sql = + "SELECT t.REQUEST_TAG, t.AVG_LATENCY_SECONDS, t.AVG_CPU_SECONDS " + + "FROM SPANNER_SYS.QUERY_STATS_TOP_HOUR"; + try (ResultSet resultSet = databaseClient.singleUse().executeQuery(Statement.of(sql)) { + while (resultSet.next()) { + System.out.printf( + "%s %d %d\n", resultSet.getString(0), resultSet.getLong(1), resultSet.getLong(2)); + } + } + } + // [END spanner_query_tags] +} From dec700b2d1fec0f4e59646d5ff229b91f1c0c4b0 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 7 Apr 2021 11:15:53 -0700 Subject: [PATCH 2/7] chore: update query stats table --- .../main/java/com/example/spanner/TransactionWithTagSample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java index bfc07497d6..4985a02f05 100644 --- a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -52,7 +52,7 @@ static void queryStats(DatabaseClient databaseClient) { // see: https://cloud.google.com/spanner/docs/introspection/query-statistics, for more details. String sql = "SELECT t.REQUEST_TAG, t.AVG_LATENCY_SECONDS, t.AVG_CPU_SECONDS " - + "FROM SPANNER_SYS.QUERY_STATS_TOP_HOUR"; + + "FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE"; try (ResultSet resultSet = databaseClient.singleUse().executeQuery(Statement.of(sql)) { while (resultSet.next()) { System.out.printf( From a558647d452e9c782e1fb84e915da51af3aeaa48 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 7 Apr 2021 11:23:01 -0700 Subject: [PATCH 3/7] chore: fix stylecheck --- .../main/java/com/example/spanner/TransactionWithTagSample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java index 4985a02f05..20b6aece09 100644 --- a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -53,7 +53,7 @@ static void queryStats(DatabaseClient databaseClient) { String sql = "SELECT t.REQUEST_TAG, t.AVG_LATENCY_SECONDS, t.AVG_CPU_SECONDS " + "FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE"; - try (ResultSet resultSet = databaseClient.singleUse().executeQuery(Statement.of(sql)) { + try (ResultSet resultSet = databaseClient.singleUse().executeQuery(Statement.of(sql))) { while (resultSet.next()) { System.out.printf( "%s %d %d\n", resultSet.getString(0), resultSet.getLong(1), resultSet.getLong(2)); From 6ec36ca1c0c4a48fc6acb1ec3cd8bb889fccb129 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Wed, 7 Apr 2021 17:16:58 -0700 Subject: [PATCH 4/7] chore: add meaningful request with both transaction_tag and request_tag --- .../spanner/TransactionWithTagSample.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java index 20b6aece09..9465c55993 100644 --- a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -23,23 +23,39 @@ import com.google.cloud.spanner.TransactionContext; import com.google.cloud.spanner.TransactionRunner.TransactionCallable; -/** Sample showing how to add and query tags to Cloud Spanner operations. */ +/** + * Sample showing how to add and query tags to Cloud Spanner operations. + */ public class TransactionWithTagSample { // [START spanner_set_transaction_and_request_tags] static void taggedTransaction(DatabaseClient databaseClient) { + // The request below would have transaction_tag set as "app=spanner,env=test". databaseClient .readWriteTransaction(Options.tag("app=spanner,env=test")) .run( new TransactionCallable() { @Override public Void run(TransactionContext transaction) throws Exception { - String sql = - "INSERT Singers (SingerId, FirstName, LastName)\n" - + "VALUES (20, 'George', 'Washington')"; - long rowCount = transaction.executeUpdate(Statement.of(sql), - Options.tag("app=spanner,env=test,action=update")); - System.out.printf("%d record inserted.%n", rowCount); + // The request below would have request_tag set as + // "app=spanner,env=test,action=select". + ResultSet queryResultSet = transaction + .executeQuery( + Statement.of("SELECT SingerId, FirstName, LastName FROM " + table), + Options.tag("app=spanner,env=test,action=select")); + while (queryResultSet.next()) { + System.out.printf( + "%d %s %s\n", + queryResultSet.getLong(0), queryResultSet.getString(1), + queryResultSet.getString(2)); + } + + transaction + .buffer(Mutation.newInsertOrUpdateBuilder("Singers") + .set("SingerId").to(100) + .set("FirstName").to("George") + .set("LastName").to("Washington") + .build()); return null; } }); From 664df4dae061e5b692c7d21d2ee9ec90cfc20b09 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Sun, 27 Jun 2021 15:59:53 -0700 Subject: [PATCH 5/7] update example wrt the client spec --- .../spanner/TransactionWithTagSample.java | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java index 9465c55993..8e1443086d 100644 --- a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -30,32 +30,18 @@ public class TransactionWithTagSample { // [START spanner_set_transaction_and_request_tags] static void taggedTransaction(DatabaseClient databaseClient) { - // The request below would have transaction_tag set as "app=spanner,env=test". + // The request below would have transaction_tag set as "app=cart,env=dev". databaseClient - .readWriteTransaction(Options.tag("app=spanner,env=test")) + .readWriteTransaction(Options.tag("app=cart,env=dev")) .run( new TransactionCallable() { @Override public Void run(TransactionContext transaction) throws Exception { - // The request below would have request_tag set as - // "app=spanner,env=test,action=select". - ResultSet queryResultSet = transaction - .executeQuery( - Statement.of("SELECT SingerId, FirstName, LastName FROM " + table), - Options.tag("app=spanner,env=test,action=select")); - while (queryResultSet.next()) { - System.out.printf( - "%d %s %s\n", - queryResultSet.getLong(0), queryResultSet.getString(1), - queryResultSet.getString(2)); - } - - transaction - .buffer(Mutation.newInsertOrUpdateBuilder("Singers") - .set("SingerId").to(100) - .set("FirstName").to("George") - .set("LastName").to("Washington") - .build()); + transaction.executeQuery(Statement.of("SELECT 1"), + Options.tag("app=cart,env=dev,action=list")); + transaction.executeUpdate( + Statement.of("UPDATE foo SET bar='baz' WHERE TRUE"), + Options.tag("app=cart,env=dev,action=update")); return null; } }); @@ -68,7 +54,7 @@ static void queryStats(DatabaseClient databaseClient) { // see: https://cloud.google.com/spanner/docs/introspection/query-statistics, for more details. String sql = "SELECT t.REQUEST_TAG, t.AVG_LATENCY_SECONDS, t.AVG_CPU_SECONDS " - + "FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE"; + + "FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE as t"; try (ResultSet resultSet = databaseClient.singleUse().executeQuery(Statement.of(sql))) { while (resultSet.next()) { System.out.printf( From 11a349f128c71e35690e6dfeb0e33628aaf54317 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Mon, 2 Aug 2021 22:49:19 -0700 Subject: [PATCH 6/7] chore: update sample based on specs --- .../spanner/TransactionWithTagSample.java | 62 +++++++++++++------ 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java index 8e1443086d..666964614d 100644 --- a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -28,37 +28,63 @@ */ public class TransactionWithTagSample { - // [START spanner_set_transaction_and_request_tags] - static void taggedTransaction(DatabaseClient databaseClient) { - // The request below would have transaction_tag set as "app=cart,env=dev". + // [START spanner_set_transaction_tag] + static void setTransactionTag(DatabaseClient databaseClient) { + // Sets the transaction tag to "app=concert,env=dev". + // This transaction tag will be applied to all the individual operations inside this + // transaction. databaseClient - .readWriteTransaction(Options.tag("app=cart,env=dev")) + .readWriteTransaction(Options.tag("app=concert,env=dev")) .run( new TransactionCallable() { @Override public Void run(TransactionContext transaction) throws Exception { - transaction.executeQuery(Statement.of("SELECT 1"), - Options.tag("app=cart,env=dev,action=list")); - transaction.executeUpdate( - Statement.of("UPDATE foo SET bar='baz' WHERE TRUE"), - Options.tag("app=cart,env=dev,action=update")); + Statement selectStatement = Statement.newBuilder( + "SELECT VenueId, VenueName, Capacity FROM Venues " + + "WHERE OutdoorVenue = @outdoorVenue") + .bind("outdoorVenue") + .to(false) + .build(); + + // Sets the request tag to "app=concert,env=dev,action=select". + // This request tag will only be set on this request. + ResultSet resultSet = transaction.executeQuery( + selectStatement, Options.tag("app=concert,env=dev,action=select")); + + while (resultSet.next()) { + long newCapacity = resultSet.getLong(2) / 4; + Statement updateStatement = Statement.newBuilder( + "UPDATE Venues SET Capacity = @capacity WHERE VenueId = @venueId") + .bind("capacity") + .to(newCapacity) + .bind("venueId") + .to(resultSet.getLong(0)) + .build(); + + // Sets the request tag to "app=concert,env=dev,action=update". + // This request tag will only be set on this request. + transaction.executeUpdate( + updateStatement, Options.tag("app=concert,env=dev,action=update")); + System.out.printf( + "Capacity of %s updated to %d\n", resultSet.getString(1), newCapacity); + } + return null; } }); } - // [END spanner_set_transaction_and_request_tags] + // [END spanner_set_transaction_tag] // [START spanner_query_tags] - static void queryStats(DatabaseClient databaseClient) { - // Execute query on Query statistics - // see: https://cloud.google.com/spanner/docs/introspection/query-statistics, for more details. - String sql = - "SELECT t.REQUEST_TAG, t.AVG_LATENCY_SECONDS, t.AVG_CPU_SECONDS " - + "FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE as t"; - try (ResultSet resultSet = databaseClient.singleUse().executeQuery(Statement.of(sql))) { + static void setRequestTag(DatabaseClient databaseClient) { + // Sets the request tag to "app=concert,env=dev,action=select". + // This request tag will only be set on this request. + try (ResultSet resultSet = dbClient.singleUse().executeQuery( + Statement.of("SELECT SingerId, AlbumId, AlbumTitle FROM Albums"), + Options.tag("app=concert,env=dev,action=select"))) { while (resultSet.next()) { System.out.printf( - "%s %d %d\n", resultSet.getString(0), resultSet.getLong(1), resultSet.getLong(2)); + "%d %d %s\n", resultSet.getString(0), resultSet.getLong(1), resultSet.getLong(2)); } } } From 9ad4e411ea7607967254fd4e9848b2805f8fb1c1 Mon Sep 17 00:00:00 2001 From: Mayur Kale Date: Mon, 2 Aug 2021 22:51:18 -0700 Subject: [PATCH 7/7] chore: update region tag --- .../java/com/example/spanner/TransactionWithTagSample.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java index 666964614d..ef5c0c3f05 100644 --- a/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java +++ b/samples/snippets/src/main/java/com/example/spanner/TransactionWithTagSample.java @@ -75,7 +75,7 @@ public Void run(TransactionContext transaction) throws Exception { } // [END spanner_set_transaction_tag] - // [START spanner_query_tags] + // [START spanner_set_request_tag] static void setRequestTag(DatabaseClient databaseClient) { // Sets the request tag to "app=concert,env=dev,action=select". // This request tag will only be set on this request. @@ -88,5 +88,5 @@ static void setRequestTag(DatabaseClient databaseClient) { } } } - // [END spanner_query_tags] + // [END spanner_set_request_tag] }