aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md3
-rw-r--r--api/src/main/java/io/opencensus/trace/SpanContext.java42
-rw-r--r--api/src/main/java/io/opencensus/trace/Tracestate.java6
-rw-r--r--api/src/test/java/io/opencensus/trace/SpanContextTest.java20
-rw-r--r--benchmarks/src/jmh/java/io/opencensus/benchmarks/trace/propagation/BinaryPropagationImplBenchmark.java4
-rw-r--r--contrib/appengine_standard_util/src/main/java/io/opencensus/contrib/appengine/standard/util/AppEngineCloudTraceContextUtils.java5
-rw-r--r--contrib/http_util/src/main/java/io/opencensus/contrib/http/util/CloudTraceFormat.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java9
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/trace/propagation/B3Format.java4
-rw-r--r--impl_core/src/main/java/io/opencensus/implcore/trace/propagation/BinaryFormatImpl.java4
10 files changed, 78 insertions, 23 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 001ed4ba..1983a115 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,8 +7,9 @@
on recording exemplars.
- Reduce the default limit on `Link`s per `Span` to 32 (was 128 before).
- Add Spring support for `@Traced` annotation and java.sql.PreparedStatements
- tracing
+ tracing.
- Allow custom prefix for Stackdriver metrics in `StackdriverStatsConfiguration`.
+- Add support to handle the Tracestate in the SpanContext.
## 0.15.0 - 2018-06-20
- Expose the factory methods of MonitoredResource.
diff --git a/api/src/main/java/io/opencensus/trace/SpanContext.java b/api/src/main/java/io/opencensus/trace/SpanContext.java
index 66a6bfbc..49ed751b 100644
--- a/api/src/main/java/io/opencensus/trace/SpanContext.java
+++ b/api/src/main/java/io/opencensus/trace/SpanContext.java
@@ -30,9 +30,11 @@ import javax.annotation.concurrent.Immutable;
*/
@Immutable
public final class SpanContext {
+ private static final Tracestate TRACESTATE_DEFAULT = Tracestate.builder().build();
private final TraceId traceId;
private final SpanId spanId;
private final TraceOptions traceOptions;
+ private final Tracestate tracestate;
/**
* The invalid {@code SpanContext}.
@@ -40,7 +42,7 @@ public final class SpanContext {
* @since 0.5
*/
public static final SpanContext INVALID =
- new SpanContext(TraceId.INVALID, SpanId.INVALID, TraceOptions.DEFAULT);
+ new SpanContext(TraceId.INVALID, SpanId.INVALID, TraceOptions.DEFAULT, TRACESTATE_DEFAULT);
/**
* Creates a new {@code SpanContext} with the given identifiers and options.
@@ -49,10 +51,26 @@ public final class SpanContext {
* @param spanId the span identifier of the span context.
* @param traceOptions the trace options for the span context.
* @return a new {@code SpanContext} with the given identifiers and options.
- * @since 0.5
+ * @deprecated use {@link #create(TraceId, SpanId, TraceOptions, Tracestate)}.
*/
+ @Deprecated
public static SpanContext create(TraceId traceId, SpanId spanId, TraceOptions traceOptions) {
- return new SpanContext(traceId, spanId, traceOptions);
+ return create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
+ }
+
+ /**
+ * Creates a new {@code SpanContext} with the given identifiers and options.
+ *
+ * @param traceId the trace identifier of the span context.
+ * @param spanId the span identifier of the span context.
+ * @param traceOptions the trace options for the span context.
+ * @param tracestate the trace state for the span context.
+ * @return a new {@code SpanContext} with the given identifiers and options.
+ * @since 0.16
+ */
+ public static SpanContext create(
+ TraceId traceId, SpanId spanId, TraceOptions traceOptions, Tracestate tracestate) {
+ return new SpanContext(traceId, spanId, traceOptions, tracestate);
}
/**
@@ -76,9 +94,9 @@ public final class SpanContext {
}
/**
- * Returns the trace options associated with this {@code SpanContext}.
+ * Returns the {@code TraceOptions} associated with this {@code SpanContext}.
*
- * @return the trace options associated with this {@code SpanContext}.
+ * @return the {@code TraceOptions} associated with this {@code SpanContext}.
* @since 0.5
*/
public TraceOptions getTraceOptions() {
@@ -86,6 +104,16 @@ public final class SpanContext {
}
/**
+ * Returns the {@code Tracestate} associated with this {@code SpanContext}.
+ *
+ * @return the {@code Tracestate} associated with this {@code SpanContext}.
+ * @since 0.5
+ */
+ public Tracestate getTracestate() {
+ return tracestate;
+ }
+
+ /**
* Returns true if this {@code SpanContext} is valid.
*
* @return true if this {@code SpanContext} is valid.
@@ -127,9 +155,11 @@ public final class SpanContext {
+ "}";
}
- private SpanContext(TraceId traceId, SpanId spanId, TraceOptions traceOptions) {
+ private SpanContext(
+ TraceId traceId, SpanId spanId, TraceOptions traceOptions, Tracestate tracestate) {
this.traceId = traceId;
this.spanId = spanId;
this.traceOptions = traceOptions;
+ this.tracestate = tracestate;
}
}
diff --git a/api/src/main/java/io/opencensus/trace/Tracestate.java b/api/src/main/java/io/opencensus/trace/Tracestate.java
index 5535a0ac..f88d3bd3 100644
--- a/api/src/main/java/io/opencensus/trace/Tracestate.java
+++ b/api/src/main/java/io/opencensus/trace/Tracestate.java
@@ -81,7 +81,7 @@ public abstract class Tracestate {
* @since 0.16
*/
public static Builder builder() {
- return new Builder();
+ return new Builder(Builder.EMPTY);
}
/**
@@ -108,10 +108,6 @@ public abstract class Tracestate {
// subclass (the auto-value generate class).
private static final Tracestate EMPTY = create(Collections.<Entry>emptyList());
- private Builder() {
- this(EMPTY);
- }
-
private Builder(Tracestate parent) {
Utils.checkNotNull(parent, "parent");
this.parent = parent;
diff --git a/api/src/test/java/io/opencensus/trace/SpanContextTest.java b/api/src/test/java/io/opencensus/trace/SpanContextTest.java
index f5a9954f..54e188c8 100644
--- a/api/src/test/java/io/opencensus/trace/SpanContextTest.java
+++ b/api/src/test/java/io/opencensus/trace/SpanContextTest.java
@@ -32,16 +32,20 @@ public class SpanContextTest {
new byte[] {0, 0, 0, 0, 0, 0, 0, '0', 0, 0, 0, 0, 0, 0, 0, 0};
private static final byte[] firstSpanIdBytes = new byte[] {0, 0, 0, 0, 0, 0, 0, 'a'};
private static final byte[] secondSpanIdBytes = new byte[] {'0', 0, 0, 0, 0, 0, 0, 0};
+ private static final Tracestate firstTracestate = Tracestate.builder().set("foo", "bar").build();
+ private static final Tracestate secondTracestate = Tracestate.builder().set("foo", "baz").build();
private static final SpanContext first =
SpanContext.create(
TraceId.fromBytes(firstTraceIdBytes),
SpanId.fromBytes(firstSpanIdBytes),
- TraceOptions.DEFAULT);
+ TraceOptions.DEFAULT,
+ firstTracestate);
private static final SpanContext second =
SpanContext.create(
TraceId.fromBytes(secondTraceIdBytes),
SpanId.fromBytes(secondSpanIdBytes),
- TraceOptions.builder().setIsSampled(true).build());
+ TraceOptions.builder().setIsSampled(true).build(),
+ secondTracestate);
@Test
public void invalidSpanContext() {
@@ -87,6 +91,12 @@ public class SpanContextTest {
}
@Test
+ public void getTracestate() {
+ assertThat(first.getTracestate()).isEqualTo(firstTracestate);
+ assertThat(second.getTracestate()).isEqualTo(secondTracestate);
+ }
+
+ @Test
public void spanContext_EqualsAndHashCode() {
EqualsTester tester = new EqualsTester();
tester.addEqualityGroup(
@@ -98,13 +108,15 @@ public class SpanContextTest {
SpanContext.create(
TraceId.fromBytes(firstTraceIdBytes),
SpanId.fromBytes(firstSpanIdBytes),
- TraceOptions.builder().setIsSampled(false).build()));
+ TraceOptions.builder().setIsSampled(false).build(),
+ firstTracestate));
tester.addEqualityGroup(
second,
SpanContext.create(
TraceId.fromBytes(secondTraceIdBytes),
SpanId.fromBytes(secondSpanIdBytes),
- TraceOptions.builder().setIsSampled(true).build()));
+ TraceOptions.builder().setIsSampled(true).build(),
+ secondTracestate));
tester.testEquals();
}
diff --git a/benchmarks/src/jmh/java/io/opencensus/benchmarks/trace/propagation/BinaryPropagationImplBenchmark.java b/benchmarks/src/jmh/java/io/opencensus/benchmarks/trace/propagation/BinaryPropagationImplBenchmark.java
index c9c6abb6..c4fc0ff1 100644
--- a/benchmarks/src/jmh/java/io/opencensus/benchmarks/trace/propagation/BinaryPropagationImplBenchmark.java
+++ b/benchmarks/src/jmh/java/io/opencensus/benchmarks/trace/propagation/BinaryPropagationImplBenchmark.java
@@ -20,6 +20,7 @@ import io.opencensus.trace.SpanContext;
import io.opencensus.trace.SpanId;
import io.opencensus.trace.TraceId;
import io.opencensus.trace.TraceOptions;
+import io.opencensus.trace.Tracestate;
import io.opencensus.trace.Tracing;
import io.opencensus.trace.propagation.BinaryFormat;
import io.opencensus.trace.propagation.SpanContextParseException;
@@ -41,7 +42,8 @@ public class BinaryPropagationImplBenchmark {
private static final SpanId spanId = SpanId.fromBytes(spanIdBytes);
private static final byte[] traceOptionsBytes = new byte[] {1};
private static final TraceOptions traceOptions = TraceOptions.fromBytes(traceOptionsBytes);
- private static final SpanContext spanContext = SpanContext.create(traceId, spanId, traceOptions);
+ private static final SpanContext spanContext =
+ SpanContext.create(traceId, spanId, traceOptions, Tracestate.builder().build());
private static final BinaryFormat binaryFormat =
Tracing.getPropagationComponent().getBinaryFormat();
private static final byte[] spanContextBinary = binaryFormat.toByteArray(spanContext);
diff --git a/contrib/appengine_standard_util/src/main/java/io/opencensus/contrib/appengine/standard/util/AppEngineCloudTraceContextUtils.java b/contrib/appengine_standard_util/src/main/java/io/opencensus/contrib/appengine/standard/util/AppEngineCloudTraceContextUtils.java
index aff2ee3e..9fac951c 100644
--- a/contrib/appengine_standard_util/src/main/java/io/opencensus/contrib/appengine/standard/util/AppEngineCloudTraceContextUtils.java
+++ b/contrib/appengine_standard_util/src/main/java/io/opencensus/contrib/appengine/standard/util/AppEngineCloudTraceContextUtils.java
@@ -24,6 +24,7 @@ import io.opencensus.trace.SpanContext;
import io.opencensus.trace.SpanId;
import io.opencensus.trace.TraceId;
import io.opencensus.trace.TraceOptions;
+import io.opencensus.trace.Tracestate;
import java.nio.ByteBuffer;
/**
@@ -37,6 +38,7 @@ public final class AppEngineCloudTraceContextUtils {
TraceIdProto.newBuilder().setHi(0).setLo(0).build().toByteArray();
private static final long INVALID_SPAN_ID = 0L;
private static final long INVALID_TRACE_MASK = 0L;
+ private static final Tracestate TRACESTATE_DEFAULT = Tracestate.builder().build();
@VisibleForTesting
static final CloudTraceContext INVALID_CLOUD_TRACE_CONTEXT =
@@ -64,7 +66,8 @@ public final class AppEngineCloudTraceContextUtils {
return SpanContext.create(
TraceId.fromBytes(traceIdBuf.array()),
SpanId.fromBytes(spanIdBuf.array()),
- TraceOptions.builder().setIsSampled(cloudTraceContext.isTraceEnabled()).build());
+ TraceOptions.builder().setIsSampled(cloudTraceContext.isTraceEnabled()).build(),
+ TRACESTATE_DEFAULT);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw new RuntimeException(e);
}
diff --git a/contrib/http_util/src/main/java/io/opencensus/contrib/http/util/CloudTraceFormat.java b/contrib/http_util/src/main/java/io/opencensus/contrib/http/util/CloudTraceFormat.java
index 70811ee7..77faa9f9 100644
--- a/contrib/http_util/src/main/java/io/opencensus/contrib/http/util/CloudTraceFormat.java
+++ b/contrib/http_util/src/main/java/io/opencensus/contrib/http/util/CloudTraceFormat.java
@@ -25,6 +25,7 @@ import io.opencensus.trace.SpanContext;
import io.opencensus.trace.SpanId;
import io.opencensus.trace.TraceId;
import io.opencensus.trace.TraceOptions;
+import io.opencensus.trace.Tracestate;
import io.opencensus.trace.propagation.SpanContextParseException;
import io.opencensus.trace.propagation.TextFormat;
import java.nio.ByteBuffer;
@@ -77,6 +78,7 @@ final class CloudTraceFormat extends TextFormat {
// 32-digit TRACE_ID + 1 digit SPAN_ID_DELIMITER + at least 1 digit SPAN_ID
static final int MIN_HEADER_SIZE = SPAN_ID_START_POS + 1;
static final int CLOUD_TRACE_IS_SAMPLED = 0x1;
+ private static final Tracestate TRACESTATE_DEFAULT = Tracestate.builder().build();
@Override
public List<String> fields() {
@@ -125,7 +127,7 @@ final class CloudTraceFormat extends TextFormat {
traceOptions = OPTIONS_SAMPLED;
}
}
- return SpanContext.create(traceId, spanId, traceOptions);
+ return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
} catch (IllegalArgumentException e) {
throw new SpanContextParseException("Invalid input", e);
}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java
index 3c5f20c6..d4f7c347 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java
@@ -31,6 +31,7 @@ import io.opencensus.trace.SpanContext;
import io.opencensus.trace.SpanId;
import io.opencensus.trace.TraceId;
import io.opencensus.trace.TraceOptions;
+import io.opencensus.trace.Tracestate;
import io.opencensus.trace.config.TraceConfig;
import io.opencensus.trace.config.TraceParams;
import java.util.Collections;
@@ -41,8 +42,9 @@ import javax.annotation.Nullable;
/** Implementation of the {@link SpanBuilder}. */
final class SpanBuilderImpl extends SpanBuilder {
- private final Options options;
+ private static final Tracestate TRACESTATE_DEFAULT = Tracestate.builder().build();
+ private final Options options;
private final String name;
@Nullable private final Span parent;
@Nullable private final SpanContext remoteParentSpanContext;
@@ -66,6 +68,8 @@ final class SpanBuilderImpl extends SpanBuilder {
SpanId spanId = SpanId.generateRandomId(random);
SpanId parentSpanId = null;
TraceOptions.Builder traceOptionsBuilder;
+ // TODO(bdrutu): Handle tracestate correctly not just propagate.
+ Tracestate tracestate = TRACESTATE_DEFAULT;
if (parent == null || !parent.isValid()) {
// New root span.
traceId = TraceId.generateRandomId(random);
@@ -77,6 +81,7 @@ final class SpanBuilderImpl extends SpanBuilder {
traceId = parent.getTraceId();
parentSpanId = parent.getSpanId();
traceOptionsBuilder = TraceOptions.builder(parent.getTraceOptions());
+ tracestate = parent.getTracestate();
}
traceOptionsBuilder.setIsSampled(
makeSamplingDecision(
@@ -95,7 +100,7 @@ final class SpanBuilderImpl extends SpanBuilder {
}
SpanImpl span =
SpanImpl.startSpan(
- SpanContext.create(traceId, spanId, traceOptions),
+ SpanContext.create(traceId, spanId, traceOptions, tracestate),
spanOptions,
name,
kind,
diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/B3Format.java b/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/B3Format.java
index 67c66ea9..d928d93c 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/B3Format.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/B3Format.java
@@ -23,6 +23,7 @@ import io.opencensus.trace.SpanContext;
import io.opencensus.trace.SpanId;
import io.opencensus.trace.TraceId;
import io.opencensus.trace.TraceOptions;
+import io.opencensus.trace.Tracestate;
import io.opencensus.trace.propagation.SpanContextParseException;
import io.opencensus.trace.propagation.TextFormat;
import java.util.Arrays;
@@ -38,6 +39,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
* href=https://github.com/openzipkin/b3-propagation>b3-propagation</a>.
*/
final class B3Format extends TextFormat {
+ private static final Tracestate TRACESTATE_DEFAULT = Tracestate.builder().build();
@VisibleForTesting static final String X_B3_TRACE_ID = "X-B3-TraceId";
@VisibleForTesting static final String X_B3_SPAN_ID = "X-B3-SpanId";
@VisibleForTesting static final String X_B3_PARENT_SPAN_ID = "X-B3-ParentSpanId";
@@ -103,7 +105,7 @@ final class B3Format extends TextFormat {
|| FLAGS_VALUE.equals(getter.get(carrier, X_B3_FLAGS))) {
traceOptions = TraceOptions.builder().setIsSampled(true).build();
}
- return SpanContext.create(traceId, spanId, traceOptions);
+ return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
} catch (IllegalArgumentException e) {
throw new SpanContextParseException("Invalid input.", e);
}
diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/BinaryFormatImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/BinaryFormatImpl.java
index a2438008..1af24854 100644
--- a/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/BinaryFormatImpl.java
+++ b/impl_core/src/main/java/io/opencensus/implcore/trace/propagation/BinaryFormatImpl.java
@@ -23,6 +23,7 @@ import io.opencensus.trace.SpanContext;
import io.opencensus.trace.SpanId;
import io.opencensus.trace.TraceId;
import io.opencensus.trace.TraceOptions;
+import io.opencensus.trace.Tracestate;
import io.opencensus.trace.propagation.BinaryFormat;
import io.opencensus.trace.propagation.SpanContextParseException;
@@ -61,6 +62,7 @@ import io.opencensus.trace.propagation.SpanContextParseException;
* </ul>
*/
final class BinaryFormatImpl extends BinaryFormat {
+ private static final Tracestate TRACESTATE_DEFAULT = Tracestate.builder().build();
private static final byte VERSION_ID = 0;
private static final int VERSION_ID_OFFSET = 0;
// The version_id/field_id size in bytes.
@@ -141,6 +143,6 @@ final class BinaryFormatImpl extends BinaryFormat {
}
traceOptions = TraceOptions.fromBytes(bytes, pos + ID_SIZE);
}
- return SpanContext.create(traceId, spanId, traceOptions);
+ return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
}
}