Skip to content
This repository was archived by the owner on Dec 23, 2023. It is now read-only.

Commit 34b28e8

Browse files
committed
Batch export 3 Timeseries at one RPC call (#836)
* Batch export 3 Timeseries at one RPC call * Update to use Lists.partition (cherry picked from commit bf7c35d)
1 parent 8a6d98a commit 34b28e8

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorkerThread.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.monitoring.v3.CreateMetricDescriptorRequest;
2424
import com.google.monitoring.v3.CreateTimeSeriesRequest;
2525
import com.google.monitoring.v3.ProjectName;
26+
import com.google.monitoring.v3.TimeSeries;
2627
import io.opencensus.common.Duration;
2728
import io.opencensus.stats.View;
2829
import io.opencensus.stats.ViewData;
@@ -48,6 +49,8 @@ final class StackdriverExporterWorkerThread extends Thread {
4849
private static final Logger logger =
4950
Logger.getLogger(StackdriverExporterWorkerThread.class.getName());
5051

52+
@VisibleForTesting static final int MAX_BATCH_EXPORT_SIZE = 3;
53+
5154
private final long scheduleDelayMillis;
5255
private final String projectId;
5356
private final ProjectName projectName;
@@ -113,13 +116,24 @@ void export() {
113116
registerView(view);
114117
viewDataList.add(viewManager.getView(view.getName()));
115118
}
116-
CreateTimeSeriesRequest.Builder builder =
117-
CreateTimeSeriesRequest.newBuilder().setNameWithProjectName(projectName);
119+
List<TimeSeries> timeSeriesList = Lists.newArrayList();
118120
for (ViewData viewData : viewDataList) {
119-
builder.addAllTimeSeries(StackdriverExportUtils.createTimeSeriesList(viewData, projectId));
121+
timeSeriesList.addAll(StackdriverExportUtils.createTimeSeriesList(viewData, projectId));
120122
}
121-
if (!builder.getTimeSeriesList().isEmpty()) {
122-
metricServiceClient.createTimeSeries(builder.build());
123+
124+
for (List<TimeSeries> batchedTimeSeries :
125+
Lists.partition(timeSeriesList, MAX_BATCH_EXPORT_SIZE)) {
126+
// Batch export 3 TimeSeries at one call, to avoid exceeding RPC header size limit.
127+
CreateTimeSeriesRequest.Builder builder =
128+
CreateTimeSeriesRequest.newBuilder().setNameWithProjectName(projectName);
129+
for (TimeSeries timeSeries : batchedTimeSeries) {
130+
builder.addTimeSeries(timeSeries);
131+
}
132+
try {
133+
metricServiceClient.createTimeSeries(builder.build());
134+
} catch (Throwable e) {
135+
logger.log(Level.WARNING, "Exception thrown when exporting TimeSeries.", e);
136+
}
123137
}
124138
}
125139

exporters/stats/stackdriver/src/test/java/io/opencensus/exporter/stats/stackdriver/StackdriverExporterWorkerThreadTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.opencensus.exporter.stats.stackdriver;
1818

19+
import static com.google.common.truth.Truth.assertThat;
1920
import static org.mockito.Matchers.any;
2021
import static org.mockito.Matchers.eq;
2122
import static org.mockito.Mockito.doReturn;
@@ -103,6 +104,11 @@ public void setUp() {
103104
doReturn(null).when(mockCreateTimeSeriesCallable).call(any(CreateTimeSeriesRequest.class));
104105
}
105106

107+
@Test
108+
public void testConstants() {
109+
assertThat(StackdriverExporterWorkerThread.MAX_BATCH_EXPORT_SIZE).isEqualTo(3);
110+
}
111+
106112
@Test
107113
public void export() throws IOException {
108114
View view =

0 commit comments

Comments
 (0)