Skip to content

Commit 1f87e91

Browse files
committed
grpc metrics env check
1 parent 4329770 commit 1f87e91

File tree

3 files changed

+63
-37
lines changed

3 files changed

+63
-37
lines changed

google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,10 @@ default boolean isEnableBuiltInMetrics() {
849849
return true;
850850
}
851851

852+
default boolean isEnableGRPCBuiltInMetrics() {
853+
return false;
854+
}
855+
852856
default boolean isEnableEndToEndTracing() {
853857
return false;
854858
}
@@ -879,6 +883,8 @@ private static class SpannerEnvironmentImpl implements SpannerEnvironment {
879883
private static final String SPANNER_ENABLE_END_TO_END_TRACING =
880884
"SPANNER_ENABLE_END_TO_END_TRACING";
881885
private static final String SPANNER_DISABLE_BUILTIN_METRICS = "SPANNER_DISABLE_BUILTIN_METRICS";
886+
private static final String SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS =
887+
"SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS";
882888
private static final String SPANNER_MONITORING_HOST = "SPANNER_MONITORING_HOST";
883889

884890
private SpannerEnvironmentImpl() {}
@@ -911,6 +917,12 @@ public boolean isEnableBuiltInMetrics() {
911917
return !Boolean.parseBoolean(System.getenv(SPANNER_DISABLE_BUILTIN_METRICS));
912918
}
913919

920+
@Override
921+
public boolean isEnableGRPCBuiltInMetrics() {
922+
return !Boolean.parseBoolean(
923+
System.getenv(SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS));
924+
}
925+
914926
@Override
915927
public boolean isEnableEndToEndTracing() {
916928
return Boolean.parseBoolean(System.getenv(SPANNER_ENABLE_END_TO_END_TRACING));
@@ -1973,8 +1985,10 @@ public ApiTracerFactory getApiTracerFactory() {
19731985
}
19741986

19751987
public void enablegRPCMetrics(InstantiatingGrpcChannelProvider.Builder channelProviderBuilder) {
1976-
this.builtInMetricsProvider.enableGrpcMetrics(
1977-
channelProviderBuilder, this.getProjectId(), getCredentials(), this.monitoringHost);
1988+
if (SpannerOptions.environment.isEnableGRPCBuiltInMetrics()) {
1989+
this.builtInMetricsProvider.enableGrpcMetrics(
1990+
channelProviderBuilder, this.getProjectId(), getCredentials(), this.monitoringHost);
1991+
}
19781992
}
19791993

19801994
public ApiTracerFactory getApiTracerFactory(boolean isAdminClient, boolean isEmulatorEnabled) {

google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,10 +374,8 @@ public GapicSpannerRpc(final SpannerOptions options) {
374374
defaultChannelProviderBuilder.setAttemptDirectPathXds();
375375
}
376376

377-
// Use condition to enable gRPC metrics
378-
if (true) {
379-
options.enablegRPCMetrics(defaultChannelProviderBuilder);
380-
}
377+
options.enablegRPCMetrics(defaultChannelProviderBuilder);
378+
381379
if (options.isUseVirtualThreads()) {
382380
ExecutorService executor =
383381
tryCreateVirtualThreadPerTaskExecutor("spanner-virtual-grpc-executor");

google-cloud-spanner/src/test/java/com/google/cloud/spanner/it/ITBuiltInMetricsTest.java

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
package com.google.cloud.spanner.it;
1818

1919
import static com.google.common.truth.Truth.assertWithMessage;
20+
import static org.junit.Assume.assumeFalse;
2021

2122
import com.google.cloud.monitoring.v3.MetricServiceClient;
2223
import com.google.cloud.spanner.Database;
2324
import com.google.cloud.spanner.DatabaseClient;
2425
import com.google.cloud.spanner.IntegrationTestEnv;
2526
import com.google.cloud.spanner.ParallelIntegrationTest;
2627
import com.google.cloud.spanner.Statement;
28+
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
2729
import com.google.common.base.Stopwatch;
2830
import com.google.monitoring.v3.ListTimeSeriesRequest;
2931
import com.google.monitoring.v3.ListTimeSeriesResponse;
@@ -34,6 +36,7 @@
3436
import java.time.Duration;
3537
import java.time.Instant;
3638
import java.util.concurrent.TimeUnit;
39+
import org.junit.After;
3740
import org.junit.BeforeClass;
3841
import org.junit.ClassRule;
3942
import org.junit.Test;
@@ -43,7 +46,6 @@
4346

4447
@Category(ParallelIntegrationTest.class)
4548
@RunWith(JUnit4.class)
46-
// @Ignore("Built-in Metrics are not GA'ed yet. Enable this test once the metrics are released")
4749
public class ITBuiltInMetricsTest {
4850

4951
private static Database db;
@@ -53,6 +55,10 @@ public class ITBuiltInMetricsTest {
5355

5456
private static MetricServiceClient metricClient;
5557

58+
private static String[] METRICS = {
59+
"operation_latencies", "attempt_latencies", "operation_count", "attempt_count",
60+
};
61+
5662
@BeforeClass
5763
public static void setUp() throws IOException {
5864
metricClient = MetricServiceClient.create();
@@ -61,8 +67,16 @@ public static void setUp() throws IOException {
6167
client = env.getTestHelper().getDatabaseClient(db);
6268
}
6369

70+
@After
71+
public void tearDown() {
72+
if (metricClient != null) {
73+
metricClient.close();
74+
}
75+
}
76+
6477
@Test
6578
public void testBuiltinMetricsWithDefaultOTEL() throws Exception {
79+
assumeFalse("This test requires credentials", EmulatorSpannerHelper.isUsingEmulator());
6680
// This stopwatch is used for to limit fetching of metric data in verifyMetrics
6781
Stopwatch metricsPollingStopwatch = Stopwatch.createStarted();
6882
Instant start = Instant.now().minus(Duration.ofMinutes(2));
@@ -79,36 +93,36 @@ public void testBuiltinMetricsWithDefaultOTEL() throws Exception {
7993
.readWriteTransaction()
8094
.run(transaction -> transaction.executeQuery(Statement.of("Select 1")));
8195

82-
String metricFilter =
83-
String.format(
84-
"metric.type=\"spanner.googleapis.com/client/%s\""
85-
+ " AND resource.type=\"spanner_instance\""
86-
+ " AND metric.labels.method=\"Spanner.Commit\""
87-
+ " AND resource.labels.instance_id=\"%s\""
88-
+ " AND metric.labels.database=\"%s\"",
89-
"operation_latencies",
90-
db.getId().getInstanceId().getInstance(),
91-
db.getId().getDatabase());
92-
93-
ListTimeSeriesRequest.Builder requestBuilder =
94-
ListTimeSeriesRequest.newBuilder()
95-
.setName(name.toString())
96-
.setFilter(metricFilter)
97-
.setInterval(interval)
98-
.setView(ListTimeSeriesRequest.TimeSeriesView.FULL);
99-
100-
ListTimeSeriesRequest request = requestBuilder.build();
101-
102-
ListTimeSeriesResponse response = metricClient.listTimeSeriesCallable().call(request);
103-
while (response.getTimeSeriesCount() == 0
104-
&& metricsPollingStopwatch.elapsed(TimeUnit.MINUTES) < 3) {
105-
// Call listTimeSeries every minute
106-
Thread.sleep(Duration.ofMinutes(1).toMillis());
107-
response = metricClient.listTimeSeriesCallable().call(request);
96+
for (String metric : METRICS) {
97+
String metricFilter =
98+
String.format(
99+
"metric.type=\"spanner.googleapis.com/client/%s\""
100+
+ " AND resource.type=\"spanner_instance\""
101+
+ " AND metric.labels.method=\"Spanner.Commit\""
102+
+ " AND resource.labels.instance_id=\"%s\""
103+
+ " AND metric.labels.database=\"%s\"",
104+
metric, db.getId().getInstanceId().getInstance(), db.getId().getDatabase());
105+
106+
ListTimeSeriesRequest.Builder requestBuilder =
107+
ListTimeSeriesRequest.newBuilder()
108+
.setName(name.toString())
109+
.setFilter(metricFilter)
110+
.setInterval(interval)
111+
.setView(ListTimeSeriesRequest.TimeSeriesView.FULL);
112+
113+
ListTimeSeriesRequest request = requestBuilder.build();
114+
115+
ListTimeSeriesResponse response = metricClient.listTimeSeriesCallable().call(request);
116+
while (response.getTimeSeriesCount() == 0
117+
&& metricsPollingStopwatch.elapsed(TimeUnit.MINUTES) < 3) {
118+
// Call listTimeSeries every minute
119+
Thread.sleep(Duration.ofMinutes(1).toMillis());
120+
response = metricClient.listTimeSeriesCallable().call(request);
121+
}
122+
123+
assertWithMessage("Metric" + metric + "didn't return any data.")
124+
.that(response.getTimeSeriesCount())
125+
.isGreaterThan(0);
108126
}
109-
110-
assertWithMessage("View operation_latencies didn't return any data.")
111-
.that(response.getTimeSeriesCount())
112-
.isGreaterThan(0);
113127
}
114128
}

0 commit comments

Comments
 (0)