Skip to content

Commit

Permalink
test: add integration test for builtin metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
mutianf committed Aug 18, 2022
1 parent dcfd512 commit 509e772
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 3 deletions.
1 change: 1 addition & 0 deletions google-cloud-bigtable-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-shared-config</artifactId>
<version>1.5.1</version>
<relativePath/>
</parent>

<name>Google Cloud Bigtable BOM</name>
Expand Down
1 change: 1 addition & 0 deletions google-cloud-bigtable-deps-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-shared-config</artifactId>
<version>1.5.1</version>
<relativePath/>
</parent>

<groupId>com.google.cloud</groupId>
Expand Down
4 changes: 2 additions & 2 deletions google-cloud-bigtable/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@
<dependencies>
<!-- NOTE: Dependencies are organized into two groups, production and test.
Within a group, dependencies are sorted by (groupId, artifactId) -->

<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-bigtable-stats</artifactId>
<!-- Exclude all the shaded transitive dependencies -->
<!-- Exclude all the shaded transitive dependencies. After mvn clean install is run,
we don't need to depend on io.opencensus anymore since this package is relocated. -->
<exclusions>
<exclusion>
<groupId>io.opencensus</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package com.google.cloud.bigtable.data.v2.it;

import static com.google.common.truth.TruthJUnit.assume;

import com.google.api.client.util.Lists;
import com.google.cloud.bigtable.data.v2.BigtableDataSettings;
import com.google.cloud.bigtable.data.v2.models.Query;
import com.google.cloud.bigtable.data.v2.models.Row;
import com.google.cloud.bigtable.data.v2.models.RowMutation;
import com.google.cloud.bigtable.test_helpers.env.EmulatorEnv;
import com.google.cloud.bigtable.test_helpers.env.TestEnvRule;
import com.google.cloud.monitoring.v3.MetricServiceClient;
import com.google.common.truth.Truth;
import com.google.monitoring.v3.ListTimeSeriesRequest;
import com.google.monitoring.v3.ListTimeSeriesResponse;
import com.google.monitoring.v3.ProjectName;
import com.google.monitoring.v3.TimeInterval;
import com.google.protobuf.util.Timestamps;
import java.io.IOException;
import java.util.ArrayList;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;

public class BuiltinMetricsIT {
@ClassRule public static TestEnvRule testEnvRule = new TestEnvRule();
public static MetricServiceClient metricClient;

public static String[] VIEWS = {
"operation_latencies",
"retry_count",
"attempt_latencies",
"server_latencies",
"connectivity_error_count",
"application_latencies"
};

@BeforeClass
public static void setUpClass() throws IOException {
assume()
.withMessage("Builtin metrics integration test is not supported by emulator")
.that(testEnvRule.env())
.isNotInstanceOf(EmulatorEnv.class);

// Enable built in metrics
BigtableDataSettings.enableBuiltinMetrics();

// Create a cloud monitoring client
metricClient = MetricServiceClient.create();
}

@Test
public void testBuiltinMetrics() throws Exception {
// Send a MutateRow and ReadRows request
testEnvRule
.env()
.getDataClient()
.mutateRow(
RowMutation.create(testEnvRule.env().getTableId(), "a-new-key")
.setCell(testEnvRule.env().getFamilyId(), "q", "abc"));
ArrayList<Row> rows =
Lists.newArrayList(
testEnvRule
.env()
.getDataClient()
.readRows(Query.create(testEnvRule.env().getTableId()).limit(10)));

// Sleep 5 minutes so the metrics could be published and precomputation is done
Thread.sleep(60 * 5 * 1000);

ProjectName name = ProjectName.of(testEnvRule.env().getProjectId());

// Restrict time to last 10 minutes
long startMillis = System.currentTimeMillis() - ((60 * 10) * 1000);
TimeInterval interval =
TimeInterval.newBuilder()
.setStartTime(Timestamps.fromMillis(startMillis))
.setEndTime(Timestamps.fromMillis(System.currentTimeMillis()))
.build();

for (String view : VIEWS) {
// Filter on instance and method name
// Verify that metrics are published for MutateRow request
String metricFilter =
String.format(
"metric.type=\"bigtable.googleapis.com/client/%s\" "
+ "AND resource.labels.instance=\"%s\" AND metric.labels.method=\"Bigtable.MutateRow\"",
view, testEnvRule.env().getInstanceId());
ListTimeSeriesRequest.Builder requestBuilder =
ListTimeSeriesRequest.newBuilder()
.setName(name.toString())
.setFilter(metricFilter)
.setInterval(interval)
.setView(ListTimeSeriesRequest.TimeSeriesView.FULL);
ListTimeSeriesResponse response =
metricClient.listTimeSeriesCallable().call(requestBuilder.build());
Truth.assertThat(response.getTimeSeriesCount()).isGreaterThan(0);

// Verify that metrics are published for ReadRows request
metricFilter =
String.format(
"metric.type=\"bigtable.googleapis.com/client/operation_latencies\" "
+ "AND resource.labels.instance=\"%s\" AND metric.labels.method=\"Bigtable.ReadRows\"",
testEnvRule.env().getInstanceId());
requestBuilder.setFilter(metricFilter);
response = metricClient.listTimeSeriesCallable().call(requestBuilder.build());
Truth.assertThat(response.getTimeSeriesCount()).isGreaterThan(0);
}
}

@AfterClass
public static void tearDown() {
metricClient.close();
}
}
18 changes: 17 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-shared-config</artifactId>
<version>1.5.3</version>
<relativePath/>
</parent>

<developers>
Expand Down Expand Up @@ -339,6 +340,22 @@
</plugins>
</build>
</profile>

<profile>
<!-- Shading workaround for IDEs: This project relocates some of its internal dependencies. Since IDEs can't
resolve the relocated symbols on their own, a workaround is added: first mvn install the shaded module,
then disable the with-shaded profile to force IDEs to resolve the relocated dependencies from the local
repository -->
<id>with-shaded</id>
<activation>
<property>
<name>!skip-shaded</name>
</property>
</activation>
<modules>
<module>google-cloud-bigtable-stats</module>
</modules>
</profile>
</profiles>

<modules>
Expand All @@ -347,7 +364,6 @@
<module>grpc-google-cloud-bigtable-v2</module>
<module>proto-google-cloud-bigtable-admin-v2</module>
<module>proto-google-cloud-bigtable-v2</module>
<module>google-cloud-bigtable-stats</module>
<module>google-cloud-bigtable-emulator-core</module>
<module>google-cloud-bigtable-emulator</module>
<module>google-cloud-bigtable-bom</module>
Expand Down

0 comments on commit 509e772

Please sign in to comment.