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

Commit 9f53f99

Browse files
committed
Only upload stats for valid views. Improve logging. (#841)
(cherry picked from commit f502b66)
1 parent 825fdd5 commit 9f53f99

File tree

3 files changed

+56
-25
lines changed

3 files changed

+56
-25
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ static MetricDescriptor.ValueType createValueType(
139139
// Convert ViewData to a list of TimeSeries, so that ViewData can be uploaded to Stackdriver.
140140
static List<TimeSeries> createTimeSeriesList(ViewData viewData, String projectId) {
141141
List<TimeSeries> timeSeriesList = Lists.newArrayList();
142+
if (viewData == null) {
143+
return timeSeriesList;
144+
}
142145
View view = viewData.getView();
143146
if (!(view.getWindow() instanceof Cumulative)) {
144147
// TODO(songya): Only Cumulative view will be exported to Stackdriver in this version.

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

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,22 @@ final class StackdriverExporterWorkerThread extends Thread {
7272
setName("ExportWorkerThread");
7373
}
7474

75-
// Registers the given view to Stackdriver Monitoring if the view is not registered yet, otherwise
76-
// does nothing. Throws IllegalArgumentException if the given view is a different view that has a
77-
// same name with a registered view.
75+
// Returns true if the given view is successfully registered to Stackdriver Monitoring, or the
76+
// exact same view has already been registered. Returns false otherwise.
7877
@VisibleForTesting
79-
void registerView(View view) {
78+
boolean registerView(View view) {
8079
View existing = registeredViews.get(view.getName());
8180
if (existing != null) {
8281
if (existing.equals(view)) {
8382
// Ignore views that are already registered.
84-
return;
83+
return true;
8584
} else {
8685
// If we upload a view that has the same name with a registered view but with different
8786
// attributes, Stackdriver client will throw an exception.
8887
logger.log(
8988
Level.WARNING,
9089
"A different view with the same name is already registered: " + existing);
91-
return;
90+
return false;
9291
}
9392
}
9493
registeredViews.put(view.getName(), view);
@@ -98,12 +97,22 @@ void registerView(View view) {
9897
// views should be pre-registered.
9998
MetricDescriptor metricDescriptor =
10099
StackdriverExportUtils.createMetricDescriptor(view, projectId);
101-
if (metricDescriptor != null) {
102-
metricServiceClient.createMetricDescriptor(
103-
CreateMetricDescriptorRequest.newBuilder()
104-
.setNameWithProjectName(projectName)
105-
.setMetricDescriptor(metricDescriptor)
106-
.build());
100+
if (metricDescriptor == null) {
101+
// Don't register interval views in this version.
102+
return false;
103+
}
104+
105+
CreateMetricDescriptorRequest request =
106+
CreateMetricDescriptorRequest.newBuilder()
107+
.setNameWithProjectName(projectName)
108+
.setMetricDescriptor(metricDescriptor)
109+
.build();
110+
try {
111+
metricServiceClient.createMetricDescriptor(request);
112+
return true;
113+
} catch (Throwable e) {
114+
logger.log(Level.WARNING, "Exception thrown when registering MetricDescriptor.", e);
115+
return false;
107116
}
108117
}
109118

@@ -113,8 +122,10 @@ void registerView(View view) {
113122
void export() {
114123
List<ViewData> viewDataList = Lists.newArrayList();
115124
for (View view : viewManager.getAllExportedViews()) {
116-
registerView(view);
117-
viewDataList.add(viewManager.getView(view.getName()));
125+
if (registerView(view)) {
126+
// Only upload stats for valid views.
127+
viewDataList.add(viewManager.getView(view.getName()));
128+
}
118129
}
119130
List<TimeSeries> timeSeriesList = Lists.newArrayList();
120131
for (ViewData viewData : viewDataList) {
@@ -124,13 +135,13 @@ void export() {
124135
for (List<TimeSeries> batchedTimeSeries :
125136
Lists.partition(timeSeriesList, MAX_BATCH_EXPORT_SIZE)) {
126137
// 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-
}
138+
CreateTimeSeriesRequest request =
139+
CreateTimeSeriesRequest.newBuilder()
140+
.setNameWithProjectName(projectName)
141+
.addAllTimeSeries(batchedTimeSeries)
142+
.build();
132143
try {
133-
metricServiceClient.createTimeSeries(builder.build());
144+
metricServiceClient.createTimeSeries(request);
134145
} catch (Throwable e) {
135146
logger.log(Level.WARNING, "Exception thrown when exporting TimeSeries.", e);
136147
}

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

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.mockito.Matchers.any;
2121
import static org.mockito.Matchers.eq;
2222
import static org.mockito.Mockito.doReturn;
23+
import static org.mockito.Mockito.doThrow;
2324
import static org.mockito.Mockito.times;
2425
import static org.mockito.Mockito.verify;
2526

@@ -168,14 +169,30 @@ public void doNotExportForEmptyViewData() {
168169
verify(mockStub, times(0)).createTimeSeriesCallable();
169170
}
170171

172+
@Test
173+
public void doNotExportIfFailedToRegisterView() {
174+
View view =
175+
View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), CUMULATIVE);
176+
doReturn(ImmutableSet.of(view)).when(mockViewManager).getAllExportedViews();
177+
doThrow(new IllegalArgumentException()).when(mockStub).createMetricDescriptorCallable();
178+
StackdriverExporterWorkerThread workerThread =
179+
new StackdriverExporterWorkerThread(
180+
PROJECT_ID, new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager);
181+
182+
assertThat(workerThread.registerView(view)).isFalse();
183+
workerThread.export();
184+
verify(mockStub, times(1)).createMetricDescriptorCallable();
185+
verify(mockStub, times(0)).createTimeSeriesCallable();
186+
}
187+
171188
@Test
172189
public void skipDifferentViewWithSameName() throws IOException {
173190
StackdriverExporterWorkerThread workerThread =
174191
new StackdriverExporterWorkerThread(
175192
PROJECT_ID, new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager);
176193
View view1 =
177194
View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), CUMULATIVE);
178-
workerThread.registerView(view1);
195+
assertThat(workerThread.registerView(view1)).isTrue();
179196
verify(mockStub, times(1)).createMetricDescriptorCallable();
180197

181198
View view2 =
@@ -186,7 +203,7 @@ public void skipDifferentViewWithSameName() throws IOException {
186203
SUM,
187204
Arrays.asList(KEY),
188205
CUMULATIVE);
189-
workerThread.registerView(view2);
206+
assertThat(workerThread.registerView(view2)).isFalse();
190207
verify(mockStub, times(1)).createMetricDescriptorCallable();
191208
}
192209

@@ -197,10 +214,10 @@ public void doNotCreateMetricDescriptorForRegisteredView() {
197214
PROJECT_ID, new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager);
198215
View view =
199216
View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), CUMULATIVE);
200-
workerThread.registerView(view);
217+
assertThat(workerThread.registerView(view)).isTrue();
201218
verify(mockStub, times(1)).createMetricDescriptorCallable();
202219

203-
workerThread.registerView(view);
220+
assertThat(workerThread.registerView(view)).isTrue();
204221
verify(mockStub, times(1)).createMetricDescriptorCallable();
205222
}
206223

@@ -211,7 +228,7 @@ public void doNotCreateMetricDescriptorForIntervalView() {
211228
PROJECT_ID, new FakeMetricServiceClient(mockStub), ONE_SECOND, mockViewManager);
212229
View view =
213230
View.create(VIEW_NAME, VIEW_DESCRIPTION, MEASURE, SUM, Arrays.asList(KEY), INTERVAL);
214-
workerThread.registerView(view);
231+
assertThat(workerThread.registerView(view)).isFalse();
215232
verify(mockStub, times(0)).createMetricDescriptorCallable();
216233
}
217234

0 commit comments

Comments
 (0)