1717package com .google .cloud .spanner .it ;
1818
1919import static com .google .common .truth .Truth .assertWithMessage ;
20+ import static org .junit .Assume .assumeFalse ;
2021
2122import com .google .cloud .monitoring .v3 .MetricServiceClient ;
2223import com .google .cloud .spanner .Database ;
2324import com .google .cloud .spanner .DatabaseClient ;
2425import com .google .cloud .spanner .IntegrationTestEnv ;
2526import com .google .cloud .spanner .ParallelIntegrationTest ;
2627import com .google .cloud .spanner .Statement ;
28+ import com .google .cloud .spanner .testing .EmulatorSpannerHelper ;
2729import com .google .common .base .Stopwatch ;
2830import com .google .monitoring .v3 .ListTimeSeriesRequest ;
2931import com .google .monitoring .v3 .ListTimeSeriesResponse ;
3436import java .time .Duration ;
3537import java .time .Instant ;
3638import java .util .concurrent .TimeUnit ;
39+ import org .junit .After ;
3740import org .junit .BeforeClass ;
3841import org .junit .ClassRule ;
3942import org .junit .Test ;
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")
4749public 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