Skip to content
This repository was archived by the owner on May 8, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void export(Collection<Metric> metrics) {
Collectors.groupingBy(
timeSeries ->
BigtableStackdriverExportUtils.getProjectId(
metric.getMetricDescriptor(), timeSeries),
metric.getMetricDescriptor(), timeSeries, gceOrGkeMonitoredResource),
Collectors.mapping(
timeSeries ->
BigtableStackdriverExportUtils.convertTimeSeries(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.google.api.Metric;
import com.google.api.MetricDescriptor.MetricKind;
import com.google.api.MonitoredResource;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.monitoring.v3.TimeInterval;
Expand Down Expand Up @@ -55,6 +56,10 @@

class BigtableStackdriverExportUtils {
private static final String BIGTABLE_RESOURCE_TYPE = "bigtable_client_raw";

@VisibleForTesting static final String GCE_RESOURCE_TYPE = "gce_instance";
@VisibleForTesting static final String GKE_RESOURCE_TYPE = "k8s_container";
@VisibleForTesting static final String GCE_OR_GKE_PROJECT_ID_KEY = "project_id";
private static final Logger logger =
Logger.getLogger(BigtableStackdriverExportUtils.class.getName());

Expand Down Expand Up @@ -209,7 +214,19 @@ private static com.google.monitoring.v3.TimeSeries.Builder setupBuilderForGceOrG
return builder;
}

static String getProjectId(MetricDescriptor metricDescriptor, TimeSeries timeSeries) {
static String getProjectId(
MetricDescriptor metricDescriptor,
TimeSeries timeSeries,
MonitoredResource gceOrGkeMonitoredResource) {
if (isBigtableTableMetric(metricDescriptor)) {
return getProjectIdForBigtableTableResource(metricDescriptor, timeSeries);
} else {
return getProjectIdForGceOrGkeResource(gceOrGkeMonitoredResource);
}
}

static String getProjectIdForBigtableTableResource(
MetricDescriptor metricDescriptor, TimeSeries timeSeries) {
List<LabelKey> labelKeys = metricDescriptor.getLabelKeys();
List<LabelValue> labelValues = timeSeries.getLabelValues();
for (int i = 0; i < labelKeys.size(); i++) {
Expand All @@ -220,6 +237,15 @@ static String getProjectId(MetricDescriptor metricDescriptor, TimeSeries timeSer
throw new IllegalStateException("Can't find project id for the current timeseries");
}

static String getProjectIdForGceOrGkeResource(MonitoredResource gceOrGkeMonitoredResource) {
if (!gceOrGkeMonitoredResource.getType().equals(GCE_RESOURCE_TYPE)
&& !gceOrGkeMonitoredResource.getType().equals(GKE_RESOURCE_TYPE)) {
throw new IllegalStateException(
"Expected GCE or GKE resource type, but found " + gceOrGkeMonitoredResource);
}
return gceOrGkeMonitoredResource.getLabelsOrThrow(GCE_OR_GKE_PROJECT_ID_KEY);
}

static String getDefaultTaskValue() {
// Something like '<pid>@<hostname>'
final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public class BigtableCreateTimeSeriesExporterTest {
private static final String bigtableZone = "us-east-1";
private static final String bigtableCluster = "cluster-1";
private static final String clientName = "client-name";
private static final String gceProjectId = "fake-gce-project";
private static final String gkeProjectId = "fake-gke-project";

@Rule public final MockitoRule mockitoRule = MockitoJUnit.rule();

Expand Down Expand Up @@ -121,6 +123,7 @@ public void testTimeSeriesForMetricWithBigtableResource() {

CreateTimeSeriesRequest request = argumentCaptor.getValue();

assertThat(request.getName()).isEqualTo("projects/" + bigtableProjectId);
assertThat(request.getTimeSeriesList()).hasSize(1);

com.google.monitoring.v3.TimeSeries timeSeries = request.getTimeSeriesList().get(0);
Expand Down Expand Up @@ -148,8 +151,9 @@ public void testTimeSeriesForMetricWithGceResource() {
new BigtableCreateTimeSeriesExporter(
fakeMetricServiceClient,
MonitoredResource.newBuilder()
.setType("gce-instance")
.putLabels("some-gce-key", "some-gce-value")
.setType(BigtableStackdriverExportUtils.GCE_RESOURCE_TYPE)
.putLabels(BigtableStackdriverExportUtils.GCE_OR_GKE_PROJECT_ID_KEY, gceProjectId)
.putLabels("another-gce-key", "another-gce-value")
.build());
ArgumentCaptor<CreateTimeSeriesRequest> argumentCaptor =
ArgumentCaptor.forClass(CreateTimeSeriesRequest.class);
Expand Down Expand Up @@ -197,12 +201,17 @@ public void testTimeSeriesForMetricWithGceResource() {

CreateTimeSeriesRequest request = argumentCaptor.getValue();

assertThat(request.getName()).isEqualTo("projects/" + gceProjectId);
assertThat(request.getTimeSeriesList()).hasSize(1);

com.google.monitoring.v3.TimeSeries timeSeries = request.getTimeSeriesList().get(0);

assertThat(timeSeries.getResource().getLabelsMap())
.containsExactly("some-gce-key", "some-gce-value");
.containsExactly(
BigtableStackdriverExportUtils.GCE_OR_GKE_PROJECT_ID_KEY,
gceProjectId,
"another-gce-key",
"another-gce-value");

assertThat(timeSeries.getMetric().getLabelsMap()).hasSize(5);
assertThat(timeSeries.getMetric().getLabelsMap())
Expand All @@ -225,8 +234,9 @@ public void testTimeSeriesForMetricWithGkeResource() {
new BigtableCreateTimeSeriesExporter(
fakeMetricServiceClient,
MonitoredResource.newBuilder()
.setType("gke-container")
.putLabels("some-gke-key", "some-gke-value")
.setType(BigtableStackdriverExportUtils.GKE_RESOURCE_TYPE)
.putLabels(BigtableStackdriverExportUtils.GCE_OR_GKE_PROJECT_ID_KEY, gkeProjectId)
.putLabels("another-gke-key", "another-gke-value")
.build());
ArgumentCaptor<CreateTimeSeriesRequest> argumentCaptor =
ArgumentCaptor.forClass(CreateTimeSeriesRequest.class);
Expand Down Expand Up @@ -275,12 +285,17 @@ public void testTimeSeriesForMetricWithGkeResource() {

CreateTimeSeriesRequest request = argumentCaptor.getValue();

assertThat(request.getName()).isEqualTo("projects/" + gkeProjectId);
assertThat(request.getTimeSeriesList()).hasSize(1);

com.google.monitoring.v3.TimeSeries timeSeries = request.getTimeSeriesList().get(0);

assertThat(timeSeries.getResource().getLabelsMap())
.containsExactly("some-gke-key", "some-gke-value");
.containsExactly(
BigtableStackdriverExportUtils.GCE_OR_GKE_PROJECT_ID_KEY,
gkeProjectId,
"another-gke-key",
"another-gke-value");

assertThat(timeSeries.getMetric().getLabelsMap()).hasSize(5);
assertThat(timeSeries.getMetric().getLabelsMap())
Expand Down