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

Commit 2e218f1

Browse files
authored
Exporter/Trace/Stackdriver: Provide Deadline option and don't do retry by default. (#1881)
1 parent 54e4bba commit 2e218f1

6 files changed

Lines changed: 74 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## Unreleased
22
- Disable RunningSpanStore by default unless the z-pages contrib is linked and initialized. This may
33
break behaviors for applications that rely on this to be always enabled.
4+
- Provide a `Deadline` option to Stackdriver Trace exporter. Default value is 10 seconds if it's not set.
45

56
## 0.21.0 - 2019-04-30
67
- Add HTTP text format serializer to Tag propagation component.

exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverTraceConfiguration.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import com.google.auto.value.AutoValue;
2121
import com.google.cloud.ServiceOptions;
2222
import com.google.cloud.trace.v2.stub.TraceServiceStub;
23+
import com.google.common.annotations.VisibleForTesting;
2324
import com.google.common.base.Preconditions;
2425
import com.google.common.base.Strings;
26+
import io.opencensus.common.Duration;
2527
import io.opencensus.trace.AttributeValue;
2628
import java.util.Collections;
2729
import java.util.LinkedHashMap;
@@ -41,6 +43,8 @@ public abstract class StackdriverTraceConfiguration {
4143
private static final String DEFAULT_PROJECT_ID =
4244
Strings.nullToEmpty(ServiceOptions.getDefaultProjectId());
4345

46+
@VisibleForTesting static final Duration DEFAULT_DEADLINE = Duration.create(10, 0);
47+
4448
StackdriverTraceConfiguration() {}
4549

4650
/**
@@ -77,6 +81,16 @@ public abstract class StackdriverTraceConfiguration {
7781
*/
7882
public abstract Map<String, AttributeValue> getFixedAttributes();
7983

84+
/**
85+
* Returns the deadline for exporting to Stackdriver Trace backend.
86+
*
87+
* <p>Default value is 10 seconds.
88+
*
89+
* @return the export deadline.
90+
* @since 0.22
91+
*/
92+
public abstract Duration getDeadline();
93+
8094
/**
8195
* Returns a new {@link Builder}.
8296
*
@@ -86,7 +100,8 @@ public abstract class StackdriverTraceConfiguration {
86100
public static Builder builder() {
87101
return new AutoValue_StackdriverTraceConfiguration.Builder()
88102
.setProjectId(DEFAULT_PROJECT_ID)
89-
.setFixedAttributes(Collections.<String, AttributeValue>emptyMap());
103+
.setFixedAttributes(Collections.<String, AttributeValue>emptyMap())
104+
.setDeadline(DEFAULT_DEADLINE);
90105
}
91106

92107
/**
@@ -97,6 +112,8 @@ public static Builder builder() {
97112
@AutoValue.Builder
98113
public abstract static class Builder {
99114

115+
@VisibleForTesting static final Duration ZERO = Duration.fromMillis(0);
116+
100117
Builder() {}
101118

102119
/**
@@ -135,10 +152,24 @@ public abstract static class Builder {
135152
*/
136153
public abstract Builder setFixedAttributes(Map<String, AttributeValue> fixedAttributes);
137154

155+
/**
156+
* Sets the deadline for exporting to Stackdriver Trace backend.
157+
*
158+
* <p>If both {@code TraceServiceStub} and {@code Deadline} are set, {@code TraceServiceStub}
159+
* takes precedence and {@code Deadline} will not be respected.
160+
*
161+
* @param deadline the export deadline.
162+
* @return this
163+
* @since 0.22
164+
*/
165+
public abstract Builder setDeadline(Duration deadline);
166+
138167
abstract String getProjectId();
139168

140169
abstract Map<String, AttributeValue> getFixedAttributes();
141170

171+
abstract Duration getDeadline();
172+
142173
abstract StackdriverTraceConfiguration autoBuild();
143174

144175
/**
@@ -159,6 +190,7 @@ public StackdriverTraceConfiguration build() {
159190
Preconditions.checkNotNull(fixedAttribute.getKey(), "attribute key");
160191
Preconditions.checkNotNull(fixedAttribute.getValue(), "attribute value");
161192
}
193+
Preconditions.checkArgument(getDeadline().compareTo(ZERO) > 0, "Deadline must be positive.");
162194
return autoBuild();
163195
}
164196
}

exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverTraceExporter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ public static void createAndRegister(StackdriverTraceConfiguration configuration
8686
StackdriverV2ExporterHandler.createWithCredentials(
8787
projectId,
8888
credentials != null ? credentials : GoogleCredentials.getApplicationDefault(),
89-
configuration.getFixedAttributes());
89+
configuration.getFixedAttributes(),
90+
configuration.getDeadline());
9091
} else {
9192
handler =
9293
StackdriverV2ExporterHandler.createWithStub(

exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.google.protobuf.BoolValue;
3838
import com.google.protobuf.Int32Value;
3939
import com.google.rpc.Status;
40+
import io.opencensus.common.Duration;
4041
import io.opencensus.common.Function;
4142
import io.opencensus.common.Functions;
4243
import io.opencensus.common.OpenCensusLibraryInformation;
@@ -171,15 +172,19 @@ static StackdriverV2ExporterHandler createWithStub(
171172
static StackdriverV2ExporterHandler createWithCredentials(
172173
String projectId,
173174
Credentials credentials,
174-
Map<String, io.opencensus.trace.AttributeValue> fixedAttributes)
175+
Map<String, io.opencensus.trace.AttributeValue> fixedAttributes,
176+
Duration deadline)
175177
throws IOException {
176-
TraceServiceSettings traceServiceSettings =
178+
TraceServiceSettings.Builder builder =
177179
TraceServiceSettings.newBuilder()
178180
.setCredentialsProvider(
179-
FixedCredentialsProvider.create(checkNotNull(credentials, "credentials")))
180-
.build();
181+
FixedCredentialsProvider.create(checkNotNull(credentials, "credentials")));
182+
// We only use the batchWriteSpans API in this exporter.
183+
builder
184+
.batchWriteSpansSettings()
185+
.setSimpleTimeoutNoRetries(org.threeten.bp.Duration.ofMillis(deadline.toMillis()));
181186
return new StackdriverV2ExporterHandler(
182-
projectId, TraceServiceClient.create(traceServiceSettings), fixedAttributes);
187+
projectId, TraceServiceClient.create(builder.build()), fixedAttributes);
183188
}
184189

185190
@VisibleForTesting

exporters/trace/stackdriver/src/test/java/io/opencensus/exporter/trace/stackdriver/StackdriverTraceConfigurationTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.auth.oauth2.AccessToken;
2323
import com.google.auth.oauth2.GoogleCredentials;
2424
import com.google.cloud.ServiceOptions;
25+
import io.opencensus.common.Duration;
2526
import io.opencensus.trace.AttributeValue;
2627
import java.util.Collections;
2728
import java.util.Date;
@@ -39,6 +40,8 @@ public class StackdriverTraceConfigurationTest {
3940
private static final Credentials FAKE_CREDENTIALS =
4041
GoogleCredentials.newBuilder().setAccessToken(new AccessToken("fake", new Date(100))).build();
4142
private static final String PROJECT_ID = "project";
43+
private static final Duration ONE_MINUTE = Duration.create(60, 0);
44+
private static final Duration NEG_ONE_MINUTE = Duration.create(-60, 0);
4245

4346
@Rule public final ExpectedException thrown = ExpectedException.none();
4447

@@ -55,6 +58,8 @@ public void defaultConfiguration() {
5558
assertThat(configuration.getProjectId()).isNotNull();
5659
assertThat(configuration.getTraceServiceStub()).isNull();
5760
assertThat(configuration.getFixedAttributes()).isEmpty();
61+
assertThat(configuration.getDeadline())
62+
.isEqualTo(StackdriverTraceConfiguration.DEFAULT_DEADLINE);
5863
}
5964

6065
@Test
@@ -66,10 +71,12 @@ public void updateAll() {
6671
.setCredentials(FAKE_CREDENTIALS)
6772
.setProjectId(PROJECT_ID)
6873
.setFixedAttributes(attributes)
74+
.setDeadline(ONE_MINUTE)
6975
.build();
7076
assertThat(configuration.getCredentials()).isEqualTo(FAKE_CREDENTIALS);
7177
assertThat(configuration.getProjectId()).isEqualTo(PROJECT_ID);
7278
assertThat(configuration.getFixedAttributes()).isEqualTo(attributes);
79+
assertThat(configuration.getDeadline()).isEqualTo(ONE_MINUTE);
7380
}
7481

7582
@Test
@@ -124,4 +131,22 @@ public void disallowNullFixedAttributeValue() {
124131
thrown.expect(NullPointerException.class);
125132
builder.build();
126133
}
134+
135+
@Test
136+
public void disallowZeroDuration() {
137+
StackdriverTraceConfiguration.Builder builder =
138+
StackdriverTraceConfiguration.builder().setProjectId("test");
139+
builder.setDeadline(StackdriverTraceConfiguration.Builder.ZERO);
140+
thrown.expect(IllegalArgumentException.class);
141+
builder.build();
142+
}
143+
144+
@Test
145+
public void disallowNegativeDuration() {
146+
StackdriverTraceConfiguration.Builder builder =
147+
StackdriverTraceConfiguration.builder().setProjectId("test");
148+
builder.setDeadline(NEG_ONE_MINUTE);
149+
thrown.expect(IllegalArgumentException.class);
150+
builder.build();
151+
}
127152
}

exporters/trace/stackdriver/src/test/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandlerProtoTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.opencensus.exporter.trace.stackdriver;
1818

1919
import static com.google.common.truth.Truth.assertThat;
20+
import static io.opencensus.exporter.trace.stackdriver.StackdriverTraceConfiguration.DEFAULT_DEADLINE;
2021
import static io.opencensus.exporter.trace.stackdriver.StackdriverV2ExporterHandler.createResourceLabelKey;
2122
import static io.opencensus.exporter.trace.stackdriver.StackdriverV2ExporterHandler.toStringAttributeValueProto;
2223

@@ -156,7 +157,8 @@ public void setUp() throws IOException {
156157
StackdriverV2ExporterHandler.createWithCredentials(
157158
PROJECT_ID,
158159
FAKE_CREDENTIALS,
159-
Collections.<String, io.opencensus.trace.AttributeValue>emptyMap());
160+
Collections.<String, io.opencensus.trace.AttributeValue>emptyMap(),
161+
DEFAULT_DEADLINE);
160162
}
161163

162164
@Test

0 commit comments

Comments
 (0)