From 768ad3078a54e276156f674f0b66a2c3dc754f84 Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Mon, 26 Jan 2026 11:06:53 -0800 Subject: [PATCH 1/7] Issue 7869 - Support the new W3C random flag Adding a new bit definition to TraceFlags. Adding a method to IdGenerator to declare randomness of the generated trace-ids. Passing the correct TraceFlags to the configured sampler for root spans. Modifying and adding unit tests. --- .../api/trace/ImmutableTraceFlags.java | 10 +++- .../opentelemetry/api/trace/SpanContext.java | 5 +- .../opentelemetry/api/trace/TraceFlags.java | 34 +++++++++++++ .../api/trace/TraceFlagsTest.java | 26 +++++++++- .../current_vs_latest/opentelemetry-api.txt | 6 ++- .../opentelemetry-sdk-trace.txt | 4 +- .../opentelemetry/sdk/trace/IdGenerator.java | 12 +++++ .../sdk/trace/RandomIdGenerator.java | 5 ++ .../sdk/trace/SdkSpanBuilder.java | 49 ++++++++++++++++++- .../sdk/trace/SdkSpanBuilderTest.java | 34 ++++++++++++- 10 files changed, 175 insertions(+), 10 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java b/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java index 7cd15f6077a..75842317e34 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java @@ -13,7 +13,10 @@ final class ImmutableTraceFlags implements TraceFlags { private static final ImmutableTraceFlags[] INSTANCES = buildInstances(); // Bit to represent whether trace is sampled or not. - private static final byte SAMPLED_BIT = 0x01; + static final byte SAMPLED_BIT = 0x01; + // Bit to indicate that the lower 56 bits of the trace id have been randomly generated with + // uniform distribution + static final byte RANDOM_TRACE_ID_BIT = 0x02; static final ImmutableTraceFlags DEFAULT = fromByte((byte) 0x00); static final ImmutableTraceFlags SAMPLED = fromByte(SAMPLED_BIT); @@ -55,6 +58,11 @@ public boolean isSampled() { return (this.byteRep & SAMPLED_BIT) != 0; } + @Override + public boolean isTraceIdRandom() { + return (this.byteRep & RANDOM_TRACE_ID_BIT) != 0; + } + @Override public String asHex() { return this.hexRep; diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/SpanContext.java b/api/all/src/main/java/io/opentelemetry/api/trace/SpanContext.java index f7832c62b07..c01f1b8e961 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/SpanContext.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/SpanContext.java @@ -12,9 +12,8 @@ /** * A class that represents a span context. A span context contains the state that must propagate to * child {@link Span}s and across process boundaries. It contains the identifiers (a {@link TraceId - * trace_id} and {@link SpanId span_id}) associated with the {@link Span} and a set of options - * (currently only whether the context is sampled or not), as well as the {@link TraceState - * traceState} and the {@link boolean remote} flag. + * trace_id} and {@link SpanId span_id}) associated with the {@link Span}, {@link TraceFlags}, as + * well as the {@link TraceState traceState} and the {@link boolean remote} flag. * *

Implementations of this interface *must* be immutable and have well-defined value-based * equals/hashCode implementations. If an implementation does not strictly conform to these diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java index 936a1a6e06c..07b39792ca8 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java @@ -76,6 +76,18 @@ static TraceFlags fromByte(byte traceFlagsByte) { */ boolean isSampled(); + /** + * Returns {@code true} if the TraceId accompanying this {@link TraceFlags} is known to be + * generated by a truly random Id generator, otherwise {@code false}. Providing default + * implementation just to maintain compatibility. + * + * @return {@code true} if the samplingrandomTraceId bit is on for this {@link TraceFlags}, + * otherwise {@code false}. + */ + default boolean isTraceIdRandom() { + return false; + } + /** * Returns the lowercase hex (base16) representation of this {@link TraceFlags}. * @@ -89,4 +101,26 @@ static TraceFlags fromByte(byte traceFlagsByte) { * @return the byte representation of the {@link TraceFlags}. */ byte asByte(); + + /** + * Returns a new instance of {@link TraceFlags} whose value is the result of a bitwise OR between + * this object and the SAMPLED bit. This operation does not modify this object/ + * + * @return a new {@link TraceFlags} object representing {@code this | SAMPLED_BIT} + */ + default TraceFlags withSampledBit() { + byte newByte = (byte) (asByte() | ImmutableTraceFlags.SAMPLED_BIT); + return ImmutableTraceFlags.fromByte(newByte); + } + + /** + * Returns a new instance of {@link TraceFlags} whose value is the result of a bitwise OR between + * this object and the RANDOM_TRACE_ID bit. This operation does not modify this object. + * + * @return a new {@link TraceFlags} object representing {@code this | RANDOM_TRACE_ID_BIT} + */ + default TraceFlags withRandomTraceIdBit() { + byte newByte = (byte) (asByte() | ImmutableTraceFlags.RANDOM_TRACE_ID_BIT); + return ImmutableTraceFlags.fromByte(newByte); + } } diff --git a/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java b/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java index d6ef529f004..b3a97fa955a 100644 --- a/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java @@ -15,17 +15,41 @@ class TraceFlagsTest { @Test void defaultInstances() { assertThat(TraceFlags.getDefault().asHex()).isEqualTo("00"); - assertThat(TraceFlags.getSampled().asHex()).isEqualTo("01"); + assertThat(TraceFlags.getDefault().withSampledBit().asHex()).isEqualTo("01"); + assertThat(TraceFlags.getDefault().withRandomTraceIdBit().asHex()).isEqualTo("02"); + assertThat(TraceFlags.getDefault().withRandomTraceIdBit().withSampledBit().asHex()) + .isEqualTo("03"); + assertThat(TraceFlags.getDefault().withSampledBit().withRandomTraceIdBit().asHex()) + .isEqualTo("03"); + } + + @Test + void idempotency() { + assertThat(TraceFlags.getDefault().withRandomTraceIdBit().withRandomTraceIdBit().asHex()) + .isEqualTo("02"); + assertThat(TraceFlags.getDefault().withSampledBit().withSampledBit().asHex()).isEqualTo("01"); } @Test void isSampled() { assertThat(TraceFlags.fromByte((byte) 0xff).isSampled()).isTrue(); assertThat(TraceFlags.fromByte((byte) 0x01).isSampled()).isTrue(); + assertThat(TraceFlags.fromByte((byte) 0x02).isSampled()).isFalse(); + assertThat(TraceFlags.fromByte((byte) 0x03).isSampled()).isTrue(); assertThat(TraceFlags.fromByte((byte) 0x05).isSampled()).isTrue(); assertThat(TraceFlags.fromByte((byte) 0x00).isSampled()).isFalse(); } + @Test + void isTraceIdRandom() { + assertThat(TraceFlags.fromByte((byte) 0xff).isTraceIdRandom()).isTrue(); + assertThat(TraceFlags.fromByte((byte) 0x01).isTraceIdRandom()).isFalse(); + assertThat(TraceFlags.fromByte((byte) 0x02).isTraceIdRandom()).isTrue(); + assertThat(TraceFlags.fromByte((byte) 0x03).isTraceIdRandom()).isTrue(); + assertThat(TraceFlags.fromByte((byte) 0x05).isTraceIdRandom()).isFalse(); + assertThat(TraceFlags.fromByte((byte) 0x00).isTraceIdRandom()).isFalse(); + } + @Test void toFromHex() { for (int i = 0; i < 256; i++) { diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt index 9ca1c6c2e64..56ed1aa8f95 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt @@ -1,2 +1,6 @@ Comparing source compatibility of opentelemetry-api-1.59.0-SNAPSHOT.jar against opentelemetry-api-1.58.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.trace.TraceFlags (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) boolean isTraceIdRandom() + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.trace.TraceFlags withRandomTraceIdBit() + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.trace.TraceFlags withSampledBit() diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt index b62e0e32d4c..2c0bc3f7eb6 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt @@ -1,2 +1,4 @@ Comparing source compatibility of opentelemetry-sdk-trace-1.59.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.58.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.trace.IdGenerator (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) boolean generatesRandomTraceIds() diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/IdGenerator.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/IdGenerator.java index e0ecd8efac5..50c808b660f 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/IdGenerator.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/IdGenerator.java @@ -38,4 +38,16 @@ static IdGenerator random() { * @return a new valid {@code TraceId}. */ String generateTraceId(); + + /** + * Declares whether TraceIds generated by this IdGenerator have their lower 56 bits uniformly + * distributed over the [0..2^56-1]interval, making them compatible with W3C Trace Context Level 2 + * recommendation @see Random TraceId flag. + * + * @return true if the generated TraceIds are random + */ + default boolean generatesRandomTraceIds() { + return false; + } } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RandomIdGenerator.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RandomIdGenerator.java index a9a1cc5de88..8c2d71cf017 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RandomIdGenerator.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RandomIdGenerator.java @@ -38,6 +38,11 @@ public String generateTraceId() { return TraceId.fromLongs(idHi, idLo); } + @Override + public boolean generatesRandomTraceIds() { + return true; + } + @Override public String toString() { return "RandomIdGenerator{}"; diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index c5f56c8232e..4166213c7ba 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -16,8 +16,10 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanId; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; @@ -170,14 +172,29 @@ public Span startSpan() { Span parentSpan = Span.fromContext(parentContext); SpanContext parentSpanContext = parentSpan.getSpanContext(); String traceId; + boolean isTraceIdRandom; IdGenerator idGenerator = tracerSharedState.getIdGenerator(); String spanId = idGenerator.generateSpanId(); + + Context parentContextForSampler = parentContext; if (!parentSpanContext.isValid()) { // New root span. traceId = idGenerator.generateTraceId(); + if (idGenerator.generatesRandomTraceIds()) { + isTraceIdRandom = true; + // Replace parentContext for sampling with a temporary one with RANDOM_TRACE_ID bit set + parentContextForSampler = + preparePrimordialContext( + parentContext, + TraceFlags.getDefault().withRandomTraceIdBit(), + TraceState.getDefault()); + } else { + isTraceIdRandom = false; + } } else { // New child span. traceId = parentSpanContext.getTraceId(); + isTraceIdRandom = parentSpanContext.getTraceFlags().isTraceIdRandom(); } List currentLinks = links; List immutableLinks = @@ -190,7 +207,12 @@ public Span startSpan() { tracerSharedState .getSampler() .shouldSample( - parentContext, traceId, spanName, spanKind, immutableAttributes, immutableLinks); + parentContextForSampler, + traceId, + spanName, + spanKind, + immutableAttributes, + immutableLinks); SamplingDecision samplingDecision = samplingResult.getDecision(); TraceState samplingResultTraceState = @@ -199,7 +221,7 @@ public Span startSpan() { ImmutableSpanContext.create( traceId, spanId, - isSampled(samplingDecision) ? TraceFlags.getSampled() : TraceFlags.getDefault(), + newTraceFlags(isTraceIdRandom, isSampled(samplingDecision)), samplingResultTraceState, /* remote= */ false, tracerSharedState.isIdGeneratorSafeToSkipIdValidation()); @@ -239,6 +261,29 @@ public Span startSpan() { recordEndSpanMetrics); } + /* + * A primordial context can be passed as the parent context for a root span + * if a non-default TraceFlags or TraceState need to be passed to the sampler + */ + private static Context preparePrimordialContext( + Context parentContext, TraceFlags traceFlags, TraceState traceState) { + SpanContext spanContext = + SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState); + Span span = Span.wrap(spanContext); + return span.storeInContext(parentContext); + } + + private static TraceFlags newTraceFlags(boolean randomTraceId, boolean sampled) { + TraceFlags traceFlags = TraceFlags.getDefault(); + if (randomTraceId) { + traceFlags = traceFlags.withRandomTraceIdBit(); + } + if (sampled) { + traceFlags = traceFlags.withSampledBit(); + } + return traceFlags; + } + private AttributesMap attributes() { AttributesMap attributes = this.attributes; if (attributes == null) { diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java index 9c9ecdc7e9c..52374f6b2cf 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java @@ -902,6 +902,38 @@ void parent_invalidContext() { } } + @Test + void propagateRandomTraceIdFlag() { + Span parent = sdkTracer.spanBuilder(SPAN_NAME).startSpan(); + assertThat(parent.getSpanContext().getTraceFlags().isTraceIdRandom()).isTrue(); + try (Scope ignored = parent.makeCurrent()) { + Span span = (SdkSpan) sdkTracer.spanBuilder(SPAN_NAME).startSpan(); + assertThat(span.getSpanContext().getTraceId()) + .isEqualTo(parent.getSpanContext().getTraceId()); + assertThat(span.getSpanContext().getTraceFlags().isTraceIdRandom()).isTrue(); + try (Scope spanScope = span.makeCurrent()) { + // Nested span + Span nestedSpan = sdkTracer.spanBuilder(SPAN_NAME).startSpan(); + // check that still the same trace + assertThat(nestedSpan.getSpanContext().getTraceId()) + .isEqualTo(parent.getSpanContext().getTraceId()); + // check if RandomTraceIdFlag is still there + assertThat(nestedSpan.getSpanContext().getTraceFlags().isTraceIdRandom()).isTrue(); + try (Scope nestedScope = span.makeCurrent()) { + Context nestedContext = Context.current(); + Span currentSpan = Span.fromContext(nestedContext); + assertThat(currentSpan.getSpanContext().getTraceFlags().isTraceIdRandom()).isTrue(); + } finally { + nestedSpan.end(); + } + } finally { + span.end(); + } + } finally { + parent.end(); + } + } + @Test void startTimestamp_numeric() { SdkSpan span = @@ -983,7 +1015,7 @@ void spanDataToString() { "SpanData\\{spanContext=ImmutableSpanContext\\{" + "traceId=[0-9a-f]{32}, " + "spanId=[0-9a-f]{16}, " - + "traceFlags=01, " + + "traceFlags=03, " + "traceState=ArrayBasedTraceState\\{entries=\\[]}, remote=false, valid=true}, " + "parentSpanContext=ImmutableSpanContext\\{" + "traceId=00000000000000000000000000000000, " From 6939da3d89fe0f97c2349b6749763a745f43b5f5 Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Tue, 27 Jan 2026 15:36:45 -0800 Subject: [PATCH 2/7] Update api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java Co-authored-by: Jack Berg <34418638+jack-berg@users.noreply.github.com> --- .../src/main/java/io/opentelemetry/api/trace/TraceFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java index 07b39792ca8..5e4e5dd2411 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java @@ -114,7 +114,7 @@ default TraceFlags withSampledBit() { } /** - * Returns a new instance of {@link TraceFlags} whose value is the result of a bitwise OR between + * Returns an instance of {@link TraceFlags} whose value is the result of a bitwise OR between * this object and the RANDOM_TRACE_ID bit. This operation does not modify this object. * * @return a new {@link TraceFlags} object representing {@code this | RANDOM_TRACE_ID_BIT} From e1785c0b8f2f686a6956debe20318a3ca3614dc8 Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Tue, 27 Jan 2026 15:57:06 -0800 Subject: [PATCH 3/7] Issue 7869 - Support the new W3C random flag Addressing code review remarks. Improving comments, eliminating some object creation on the hot path. --- .../opentelemetry/api/trace/TraceFlags.java | 8 ++-- .../sdk/trace/SdkSpanBuilder.java | 38 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java index 5e4e5dd2411..92ded2452cc 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java @@ -81,8 +81,8 @@ static TraceFlags fromByte(byte traceFlagsByte) { * generated by a truly random Id generator, otherwise {@code false}. Providing default * implementation just to maintain compatibility. * - * @return {@code true} if the samplingrandomTraceId bit is on for this {@link TraceFlags}, - * otherwise {@code false}. + * @return {@code true} if the randomTraceId bit is on for this {@link TraceFlags}, otherwise + * {@code false}. */ default boolean isTraceIdRandom() { return false; @@ -103,8 +103,8 @@ default boolean isTraceIdRandom() { byte asByte(); /** - * Returns a new instance of {@link TraceFlags} whose value is the result of a bitwise OR between - * this object and the SAMPLED bit. This operation does not modify this object/ + * Returns an instance of {@link TraceFlags} whose value is the result of a bitwise OR between + * this object and the SAMPLED bit. This operation does not modify this object. * * @return a new {@link TraceFlags} object representing {@code this | SAMPLED_BIT} */ diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index 4166213c7ba..97b9f2f83b6 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -41,6 +41,7 @@ class SdkSpanBuilder implements SpanBuilder { private final InstrumentationScopeInfo instrumentationScopeInfo; private final TracerSharedState tracerSharedState; private final SpanLimits spanLimits; + private final Context rootContextWithRandomTraceIdBit; @Nullable private Context parent; // null means: Use current context. private SpanKind spanKind = SpanKind.INTERNAL; @@ -58,6 +59,23 @@ class SdkSpanBuilder implements SpanBuilder { this.instrumentationScopeInfo = instrumentationScopeInfo; this.tracerSharedState = tracerSharedState; this.spanLimits = spanLimits; + this.rootContextWithRandomTraceIdBit = + preparePrimordialContext( + Context.root(), + TraceFlags.getDefault().withRandomTraceIdBit(), + TraceState.getDefault()); + } + + /* + * A primordial context can be passed as the parent context for a root span + * if a non-default TraceFlags or TraceState need to be passed to the sampler + */ + private static Context preparePrimordialContext( + Context parentContext, TraceFlags traceFlags, TraceState traceState) { + SpanContext spanContext = + SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState); + Span span = Span.wrap(spanContext); + return span.storeInContext(parentContext); } @Override @@ -182,12 +200,8 @@ public Span startSpan() { traceId = idGenerator.generateTraceId(); if (idGenerator.generatesRandomTraceIds()) { isTraceIdRandom = true; - // Replace parentContext for sampling with a temporary one with RANDOM_TRACE_ID bit set - parentContextForSampler = - preparePrimordialContext( - parentContext, - TraceFlags.getDefault().withRandomTraceIdBit(), - TraceState.getDefault()); + // Replace parentContext for sampling with one with RANDOM_TRACE_ID bit set + parentContextForSampler = rootContextWithRandomTraceIdBit; } else { isTraceIdRandom = false; } @@ -261,18 +275,6 @@ public Span startSpan() { recordEndSpanMetrics); } - /* - * A primordial context can be passed as the parent context for a root span - * if a non-default TraceFlags or TraceState need to be passed to the sampler - */ - private static Context preparePrimordialContext( - Context parentContext, TraceFlags traceFlags, TraceState traceState) { - SpanContext spanContext = - SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState); - Span span = Span.wrap(spanContext); - return span.storeInContext(parentContext); - } - private static TraceFlags newTraceFlags(boolean randomTraceId, boolean sampled) { TraceFlags traceFlags = TraceFlags.getDefault(); if (randomTraceId) { From 5c03dfdf0743592c9f09cc884d865eca982676bb Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Mon, 26 Jan 2026 11:06:53 -0800 Subject: [PATCH 4/7] Merging with upstream. Issue 7869 - Support the new W3C random flag Adding a new bit definition to TraceFlags. Adding a method to IdGenerator to declare randomness of the generated trace-ids. Passing the correct TraceFlags to the configured sampler for root spans. Modifying and adding unit tests. --- .../current_vs_latest/opentelemetry-api.txt | 31 ------------------- .../opentelemetry-sdk-trace.txt | 6 ---- .../sdk/trace/SdkSpanBuilder.java | 15 +++++++++ 3 files changed, 15 insertions(+), 37 deletions(-) delete mode 100644 docs/apidiffs/current_vs_latest/opentelemetry-api.txt delete mode 100644 docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt deleted file mode 100644 index 4d28e5098d8..00000000000 --- a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt +++ /dev/null @@ -1,31 +0,0 @@ -Comparing source compatibility of opentelemetry-api-1.59.0-SNAPSHOT.jar against opentelemetry-api-1.58.0.jar -*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.trace.TraceFlags (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) boolean isTraceIdRandom() - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.trace.TraceFlags withRandomTraceIdBit() - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.trace.TraceFlags withSampledBit() -Comparing source compatibility of opentelemetry-api-1.60.0-SNAPSHOT.jar against opentelemetry-api-1.58.0.jar -*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.common.AttributeKey (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - GENERIC TEMPLATES: === T:java.lang.Object - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.api.common.AttributeKey> valueKey(java.lang.String) -*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.common.AttributesBuilder (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.common.AttributesBuilder put(java.lang.String, io.opentelemetry.api.common.Value) -*** MODIFIED ENUM: PUBLIC FINAL io.opentelemetry.api.common.AttributeType (compatible) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.api.common.AttributeType VALUE -+++ NEW CLASS: PUBLIC(+) FINAL(+) io.opentelemetry.api.common.Empty (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) boolean equals(java.lang.Object) - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.api.common.Empty getInstance() - +++ NEW METHOD: PUBLIC(+) int hashCode() - +++ NEW METHOD: PUBLIC(+) java.lang.String toString() -*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.common.Value (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - GENERIC TEMPLATES: === T:java.lang.Object - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.api.common.Value empty() -*** MODIFIED ENUM: PUBLIC FINAL io.opentelemetry.api.common.ValueType (compatible) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.api.common.ValueType EMPTY diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt deleted file mode 100644 index fa07c03740b..00000000000 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt +++ /dev/null @@ -1,6 +0,0 @@ -Comparing source compatibility of opentelemetry-sdk-trace-1.59.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.58.0.jar -*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.trace.IdGenerator (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) boolean generatesRandomTraceIds() -Comparing source compatibility of opentelemetry-sdk-trace-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.58.0.jar -No changes. diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index 48624e36df7..af21f522489 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -275,6 +275,21 @@ public Span startSpan() { recordEndSpanMetrics); } +<<<<<<< HEAD +======= + /* + * A primordial context can be passed as the parent context for a root span + * if a non-default TraceFlags or TraceState need to be passed to the sampler + */ + private static Context preparePrimordialContext( + Context parentContext, TraceFlags traceFlags, TraceState traceState) { + SpanContext spanContext = + SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState); + Span span = Span.wrap(spanContext); + return span.storeInContext(parentContext); + } + +>>>>>>> fc520a087 (Merging with upstream.) private static TraceFlags newTraceFlags(boolean randomTraceId, boolean sampled) { TraceFlags traceFlags = TraceFlags.getDefault(); if (randomTraceId) { From c32d6b0e7ec487a1f3c1cda2b8ad1bec59a559c0 Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Fri, 6 Feb 2026 10:08:38 -0800 Subject: [PATCH 5/7] Addressing code review remarks and suggestions. Refactoring to use the builder pattern to create and manipulate TraceFlags. --- .../api/trace/ImmutableTraceFlags.java | 26 +++- .../opentelemetry/api/trace/TraceFlags.java | 23 +--- .../api/trace/TraceFlagsBuilder.java | 51 ++++++++ .../api/trace/TraceFlagsTest.java | 26 ++-- .../opentelemetry-common.txt | 2 +- .../opentelemetry-context.txt | 2 +- .../opentelemetry-exporter-common.txt | 2 +- .../opentelemetry-exporter-logging-otlp.txt | 2 +- .../opentelemetry-exporter-logging.txt | 2 +- .../opentelemetry-exporter-otlp-common.txt | 2 +- .../opentelemetry-exporter-otlp.txt | 2 +- ...y-exporter-sender-grpc-managed-channel.txt | 2 +- .../opentelemetry-exporter-sender-jdk.txt | 2 +- .../opentelemetry-exporter-sender-okhttp.txt | 2 +- .../opentelemetry-exporter-zipkin.txt | 9 +- .../opentelemetry-extension-kotlin.txt | 2 +- ...ntelemetry-extension-trace-propagators.txt | 9 +- .../opentelemetry-opentracing-shim.txt | 2 +- .../opentelemetry-sdk-common.txt | 111 +----------------- ...emetry-sdk-extension-autoconfigure-spi.txt | 2 +- ...ntelemetry-sdk-extension-autoconfigure.txt | 2 +- ...ry-sdk-extension-jaeger-remote-sampler.txt | 2 +- .../opentelemetry-sdk-logs.txt | 2 +- .../opentelemetry-sdk-metrics.txt | 2 +- .../opentelemetry-sdk-testing.txt | 14 +-- .../current_vs_latest/opentelemetry-sdk.txt | 2 +- .../sdk/trace/SdkSpanBuilder.java | 25 ++-- 27 files changed, 133 insertions(+), 197 deletions(-) create mode 100644 api/all/src/main/java/io/opentelemetry/api/trace/TraceFlagsBuilder.java diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java b/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java index 75842317e34..ca007995abe 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/ImmutableTraceFlags.java @@ -10,13 +10,13 @@ import javax.annotation.concurrent.Immutable; @Immutable -final class ImmutableTraceFlags implements TraceFlags { +final class ImmutableTraceFlags implements TraceFlags, TraceFlagsBuilder { private static final ImmutableTraceFlags[] INSTANCES = buildInstances(); // Bit to represent whether trace is sampled or not. - static final byte SAMPLED_BIT = 0x01; + private static final byte SAMPLED_BIT = 0x01; // Bit to indicate that the lower 56 bits of the trace id have been randomly generated with // uniform distribution - static final byte RANDOM_TRACE_ID_BIT = 0x02; + private static final byte RANDOM_TRACE_ID_BIT = 0x02; static final ImmutableTraceFlags DEFAULT = fromByte((byte) 0x00); static final ImmutableTraceFlags SAMPLED = fromByte(SAMPLED_BIT); @@ -73,6 +73,26 @@ public byte asByte() { return this.byteRep; } + @Override + public ImmutableTraceFlags setSampled(boolean isSampled) { + byte newByte = isSampled ? (byte) (asByte() | SAMPLED_BIT) : (byte) (asByte() & ~SAMPLED_BIT); + return fromByte(newByte); + } + + @Override + public ImmutableTraceFlags setRandomTraceId(boolean isRandomTraceId) { + byte newByte = + isRandomTraceId + ? (byte) (asByte() | RANDOM_TRACE_ID_BIT) + : (byte) (asByte() & ~RANDOM_TRACE_ID_BIT); + return fromByte(newByte); + } + + @Override + public TraceFlags build() { + return this; + } + @Override public String toString() { return asHex(); diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java index 92ded2452cc..9f918b7c8e5 100644 --- a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java +++ b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlags.java @@ -102,25 +102,8 @@ default boolean isTraceIdRandom() { */ byte asByte(); - /** - * Returns an instance of {@link TraceFlags} whose value is the result of a bitwise OR between - * this object and the SAMPLED bit. This operation does not modify this object. - * - * @return a new {@link TraceFlags} object representing {@code this | SAMPLED_BIT} - */ - default TraceFlags withSampledBit() { - byte newByte = (byte) (asByte() | ImmutableTraceFlags.SAMPLED_BIT); - return ImmutableTraceFlags.fromByte(newByte); - } - - /** - * Returns an instance of {@link TraceFlags} whose value is the result of a bitwise OR between - * this object and the RANDOM_TRACE_ID bit. This operation does not modify this object. - * - * @return a new {@link TraceFlags} object representing {@code this | RANDOM_TRACE_ID_BIT} - */ - default TraceFlags withRandomTraceIdBit() { - byte newByte = (byte) (asByte() | ImmutableTraceFlags.RANDOM_TRACE_ID_BIT); - return ImmutableTraceFlags.fromByte(newByte); + /** Returns an instance of {@link TraceFlagsBuilder} for {@link TraceFlags}. */ + static TraceFlagsBuilder builder() { + return ImmutableTraceFlags.DEFAULT; } } diff --git a/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlagsBuilder.java b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlagsBuilder.java new file mode 100644 index 00000000000..de95a9a43f5 --- /dev/null +++ b/api/all/src/main/java/io/opentelemetry/api/trace/TraceFlagsBuilder.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.trace; + +/** + * {@link TraceFlagsBuilder} is used to construct {@link TraceFlags} instances which satisfy the + * https://www.w3.org/TR/trace-context-2/#trace-flags specification. + * + *

This is a simple usage example: + * + *

{@code
+ * TraceFlags traceFlags = TraceFlags.builder().setSampled(true).build();
+ * }
+ * + *

Implementation note: no new objects are created by the methods defined by this interface when + * the default implementation, {@link ImmutableTraceFlags}, is used. + */ +public interface TraceFlagsBuilder { + + /** + * Returns an instance of {@link TraceFlagsBuilder} which represents a {@link TraceFlags} object + * which has the SAMPLED bit set if the argument is {@code true} and the SAMPLED bit cleared when + * the argument is {@code false}. Other bits remain unchanged. The operation does not modify this + * object. + * + * @param isSampled the new value for the SAMPLED bit + * @return a {@link TraceFlagsBuilder} object representing the modified {@link TraceFlags} + */ + TraceFlagsBuilder setSampled(boolean isSampled); + + /** + * Returns an instance of {@link TraceFlagsBuilder} which represents a {@link TraceFlags} object + * which has the RANDOM_TRACE_ID bit set if the argument is {@code true} and the RANDOM_TRACE_ID + * bit cleared when the argument is {@code false}. Other bits remain unchanged. The operation does + * not modify this object. + * + * @param isRandomTraceId the new value for the RANDOM_TRACE_ID bit + * @return a {@link TraceFlagsBuilder} object representing the modified {@link TraceFlags} + */ + TraceFlagsBuilder setRandomTraceId(boolean isRandomTraceId); + + /** + * Returns {@link TraceFlags} represented by this object. + * + * @return a {@link TraceFlags} object with the bits set as configured + */ + TraceFlags build(); +} diff --git a/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java b/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java index b3a97fa955a..fc5c52e8ed5 100644 --- a/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/trace/TraceFlagsTest.java @@ -9,25 +9,37 @@ import org.junit.jupiter.api.Test; -/** Unit tests for {@link TraceFlags}. */ +/** Unit tests for {@link TraceFlags} and {@link TraceFlagsBuilder}. */ class TraceFlagsTest { @Test void defaultInstances() { assertThat(TraceFlags.getDefault().asHex()).isEqualTo("00"); - assertThat(TraceFlags.getDefault().withSampledBit().asHex()).isEqualTo("01"); - assertThat(TraceFlags.getDefault().withRandomTraceIdBit().asHex()).isEqualTo("02"); - assertThat(TraceFlags.getDefault().withRandomTraceIdBit().withSampledBit().asHex()) + assertThat(TraceFlags.builder().build().asHex()).isEqualTo("00"); + assertThat(TraceFlags.builder().setSampled(true).build().asHex()).isEqualTo("01"); + assertThat(TraceFlags.builder().setSampled(false).build().asHex()).isEqualTo("00"); + assertThat(TraceFlags.builder().setRandomTraceId(true).build().asHex()).isEqualTo("02"); + assertThat(TraceFlags.builder().setRandomTraceId(false).build().asHex()).isEqualTo("00"); + assertThat(TraceFlags.builder().setSampled(true).setRandomTraceId(true).build().asHex()) .isEqualTo("03"); - assertThat(TraceFlags.getDefault().withSampledBit().withRandomTraceIdBit().asHex()) + assertThat(TraceFlags.builder().setRandomTraceId(true).setSampled(true).build().asHex()) .isEqualTo("03"); } @Test void idempotency() { - assertThat(TraceFlags.getDefault().withRandomTraceIdBit().withRandomTraceIdBit().asHex()) + assertThat(TraceFlags.builder().setRandomTraceId(true).setRandomTraceId(true).build().asHex()) .isEqualTo("02"); - assertThat(TraceFlags.getDefault().withSampledBit().withSampledBit().asHex()).isEqualTo("01"); + assertThat(TraceFlags.builder().setSampled(true).setSampled(true).build().asHex()) + .isEqualTo("01"); + } + + @Test + void setAndClear() { + assertThat(TraceFlags.builder().setRandomTraceId(true).setRandomTraceId(false).build().asHex()) + .isEqualTo("00"); + assertThat(TraceFlags.builder().setSampled(true).setSampled(false).build().asHex()) + .isEqualTo("00"); } @Test diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-common.txt index cecc3cfa608..1c7766db78d 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-common.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-common-1.60.0-SNAPSHOT.jar against opentelemetry-common-1.58.0.jar +Comparing source compatibility of opentelemetry-common-1.60.0-SNAPSHOT.jar against opentelemetry-common-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-context.txt b/docs/apidiffs/current_vs_latest/opentelemetry-context.txt index 9de49026235..7b97994ba22 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-context.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-context.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-context-1.60.0-SNAPSHOT.jar against opentelemetry-context-1.58.0.jar +Comparing source compatibility of opentelemetry-context-1.60.0-SNAPSHOT.jar against opentelemetry-context-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt index cefd0bb625f..1ca29e5bb6b 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-common.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-common-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-common-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-common-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-common-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt index 1b089413821..79aba5f52a9 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging-otlp.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-logging-otlp-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-logging-otlp-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-logging-otlp-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-logging-otlp-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt index c90b8615590..1e882ee8025 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-logging.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-logging-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-logging-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-logging-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-logging-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt index 6cb77321322..7dc6c6acd23 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp-common.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-otlp-common-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-common-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-otlp-common-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-common-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt index 10e62a0aa0d..5870f6ab703 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-otlp-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-otlp-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt index 904145d545b..0fa47200766 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-grpc-managed-channel.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-sender-grpc-managed-channel-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-sender-grpc-managed-channel-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt index 8c231b310d0..6e8444c2b16 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-jdk.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-sender-jdk-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-sender-jdk-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-sender-jdk-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt index 706cdf53d5c..834fe687f4d 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-sender-okhttp.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-sender-okhttp-1.58.0.jar +Comparing source compatibility of opentelemetry-exporter-sender-okhttp-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-sender-okhttp-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt index 783f90fbcf8..f84fd690919 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt @@ -1,7 +1,2 @@ -Comparing source compatibility of opentelemetry-exporter-zipkin-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.58.0.jar -=== UNCHANGED CLASS: PUBLIC FINAL io.opentelemetry.exporter.zipkin.ZipkinSpanExporter (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW ANNOTATION: java.lang.Deprecated -=== UNCHANGED CLASS: PUBLIC FINAL io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW ANNOTATION: java.lang.Deprecated +Comparing source compatibility of opentelemetry-exporter-zipkin-1.60.0-SNAPSHOT.jar against opentelemetry-exporter-zipkin-1.59.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt b/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt index dc845cde7ed..9620b4531f5 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-extension-kotlin.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-extension-kotlin-1.60.0-SNAPSHOT.jar against opentelemetry-extension-kotlin-1.58.0.jar +Comparing source compatibility of opentelemetry-extension-kotlin-1.60.0-SNAPSHOT.jar against opentelemetry-extension-kotlin-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt b/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt index ca63d3c006d..619e3785d87 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-extension-trace-propagators.txt @@ -1,7 +1,2 @@ -Comparing source compatibility of opentelemetry-extension-trace-propagators-1.60.0-SNAPSHOT.jar against opentelemetry-extension-trace-propagators-1.58.0.jar -=== UNCHANGED CLASS: PUBLIC FINAL io.opentelemetry.extension.trace.propagation.JaegerPropagator (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW ANNOTATION: java.lang.Deprecated -=== UNCHANGED CLASS: PUBLIC FINAL io.opentelemetry.extension.trace.propagation.OtTracePropagator (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW ANNOTATION: java.lang.Deprecated +Comparing source compatibility of opentelemetry-extension-trace-propagators-1.60.0-SNAPSHOT.jar against opentelemetry-extension-trace-propagators-1.59.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt b/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt index 546bd04b8c9..497e042dd05 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-opentracing-shim.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-opentracing-shim-1.60.0-SNAPSHOT.jar against opentelemetry-opentracing-shim-1.58.0.jar +Comparing source compatibility of opentelemetry-opentracing-shim-1.60.0-SNAPSHOT.jar against opentelemetry-opentracing-shim-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt index e80ffa54113..39f3530e868 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-common.txt @@ -1,109 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-common-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.58.0.jar -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.Compressor (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.io.OutputStream compress(java.io.OutputStream) - +++ NEW EXCEPTION: java.io.IOException - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getEncoding() -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.GrpcResponse (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) byte[] getResponseMessage() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.GrpcStatusCode getStatusCode() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getStatusDescription() - +++ NEW ANNOTATION: javax.annotation.Nullable -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.GrpcSender (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) void send(io.opentelemetry.sdk.common.export.MessageWriter, java.util.function.Consumer, java.util.function.Consumer) - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.CompletableResultCode shutdown() -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.GrpcSenderConfig (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.Compressor getCompressor() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.time.Duration getConnectTimeout() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.net.URI getEndpoint() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.util.concurrent.ExecutorService getExecutorService() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getFullMethodName() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.util.function.Supplier>> getHeadersSupplier() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.RetryPolicy getRetryPolicy() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) javax.net.ssl.SSLContext getSslContext() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.time.Duration getTimeout() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) javax.net.ssl.X509TrustManager getTrustManager() - +++ NEW ANNOTATION: javax.annotation.Nullable -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.GrpcSenderProvider (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.GrpcSender createSender(io.opentelemetry.sdk.common.export.GrpcSenderConfig) -+++ NEW ENUM: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode (compatible) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.lang.constant.Constable - +++ NEW INTERFACE: java.lang.Comparable - +++ NEW INTERFACE: java.io.Serializable - +++ NEW SUPERCLASS: java.lang.Enum - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode RESOURCE_EXHAUSTED - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode ALREADY_EXISTS - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode UNIMPLEMENTED - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode FAILED_PRECONDITION - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode NOT_FOUND - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode DEADLINE_EXCEEDED - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode OUT_OF_RANGE - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode UNAUTHENTICATED - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode CANCELLED - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode DATA_LOSS - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode INTERNAL - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode UNAVAILABLE - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode UNKNOWN - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode ABORTED - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode OK - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode INVALID_ARGUMENT - +++ NEW FIELD: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.common.export.GrpcStatusCode PERMISSION_DENIED - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.export.GrpcStatusCode fromValue(int) - +++ NEW METHOD: PUBLIC(+) int getValue() - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.export.GrpcStatusCode valueOf(java.lang.String) - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.common.export.GrpcStatusCode[] values() -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.HttpResponse (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) byte[] getResponseBody() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) int getStatusCode() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getStatusMessage() -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.HttpSender (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) void send(io.opentelemetry.sdk.common.export.MessageWriter, java.util.function.Consumer, java.util.function.Consumer) - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.CompletableResultCode shutdown() -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.HttpSenderConfig (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.Compressor getCompressor() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.time.Duration getConnectTimeout() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getContentType() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.net.URI getEndpoint() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.util.concurrent.ExecutorService getExecutorService() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.util.function.Supplier>> getHeadersSupplier() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.ProxyOptions getProxyOptions() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.RetryPolicy getRetryPolicy() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) javax.net.ssl.SSLContext getSslContext() - +++ NEW ANNOTATION: javax.annotation.Nullable - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) java.time.Duration getTimeout() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) javax.net.ssl.X509TrustManager getTrustManager() - +++ NEW ANNOTATION: javax.annotation.Nullable -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.HttpSenderProvider (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.HttpSender createSender(io.opentelemetry.sdk.common.export.HttpSenderConfig) -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.common.export.MessageWriter (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW SUPERCLASS: java.lang.Object - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) int getContentLength() - +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) void writeMessage(java.io.OutputStream) - +++ NEW EXCEPTION: java.io.IOException +Comparing source compatibility of opentelemetry-sdk-common-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-common-1.59.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt index ce094679fc5..9b3a1b54754 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure-spi.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.58.0.jar +Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-spi-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-spi-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt index c0b2d899b11..ee686c98a28 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-autoconfigure.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-1.58.0.jar +Comparing source compatibility of opentelemetry-sdk-extension-autoconfigure-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-extension-autoconfigure-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt index ad71007ae9e..25237dac2a8 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.58.0.jar +Comparing source compatibility of opentelemetry-sdk-extension-jaeger-remote-sampler-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-extension-jaeger-remote-sampler-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt index 2215be166c3..159360981ef 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-logs-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.58.0.jar +Comparing source compatibility of opentelemetry-sdk-logs-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt index c2e3da91426..d339d345d3c 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-metrics.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-metrics-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.58.0.jar +Comparing source compatibility of opentelemetry-sdk-metrics-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.59.0.jar No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt index aca21d6f14e..5150f6abc29 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt @@ -1,12 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-testing-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.58.0.jar -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.AttributesAssert (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.AttributesAssert containsEntry(java.lang.String, io.opentelemetry.api.common.Value) -*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions (not serializable) - === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) STATIC(+) java.util.Map$Entry>,io.opentelemetry.api.common.Value> attributeEntry(java.lang.String, io.opentelemetry.api.common.Value) - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.testing.assertj.AttributeAssertion satisfies(io.opentelemetry.api.common.AttributeKey>, io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions$ValueAssertConsumer) -+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) STATIC(+) io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions$ValueAssertConsumer (not serializable) - +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. - +++ NEW INTERFACE: java.util.function.Consumer - +++ NEW SUPERCLASS: java.lang.Object +Comparing source compatibility of opentelemetry-sdk-testing-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.59.0.jar +No changes. \ No newline at end of file diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt index 40082ae5e42..c24f94bb0ab 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk.txt @@ -1,2 +1,2 @@ -Comparing source compatibility of opentelemetry-sdk-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-1.58.0.jar +Comparing source compatibility of opentelemetry-sdk-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-1.59.0.jar No changes. \ No newline at end of file diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index af21f522489..f553641b29e 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -37,11 +37,14 @@ /** {@link SdkSpanBuilder} is SDK implementation of {@link SpanBuilder}. */ class SdkSpanBuilder implements SpanBuilder { + private static final Context ROOT_CONTEXT_WITH_RANDOM_TRACE_ID_BIT = + preparePrimordialContext( + TraceFlags.builder().setRandomTraceId(true).build(), TraceState.getDefault()); + private final String spanName; private final InstrumentationScopeInfo instrumentationScopeInfo; private final TracerSharedState tracerSharedState; private final SpanLimits spanLimits; - private final Context rootContextWithRandomTraceIdBit; @Nullable private Context parent; // null means: Use current context. private SpanKind spanKind = SpanKind.INTERNAL; @@ -59,23 +62,17 @@ class SdkSpanBuilder implements SpanBuilder { this.instrumentationScopeInfo = instrumentationScopeInfo; this.tracerSharedState = tracerSharedState; this.spanLimits = spanLimits; - this.rootContextWithRandomTraceIdBit = - preparePrimordialContext( - Context.root(), - TraceFlags.getDefault().withRandomTraceIdBit(), - TraceState.getDefault()); } /* * A primordial context can be passed as the parent context for a root span * if a non-default TraceFlags or TraceState need to be passed to the sampler */ - private static Context preparePrimordialContext( - Context parentContext, TraceFlags traceFlags, TraceState traceState) { + private static Context preparePrimordialContext(TraceFlags traceFlags, TraceState traceState) { SpanContext spanContext = SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState); Span span = Span.wrap(spanContext); - return span.storeInContext(parentContext); + return span.storeInContext(Context.root()); } @Override @@ -201,7 +198,7 @@ public Span startSpan() { if (idGenerator.generatesRandomTraceIds()) { isTraceIdRandom = true; // Replace parentContext for sampling with one with RANDOM_TRACE_ID bit set - parentContextForSampler = rootContextWithRandomTraceIdBit; + parentContextForSampler = ROOT_CONTEXT_WITH_RANDOM_TRACE_ID_BIT; } else { isTraceIdRandom = false; } @@ -235,7 +232,10 @@ public Span startSpan() { ImmutableSpanContext.create( traceId, spanId, - newTraceFlags(isTraceIdRandom, isSampled(samplingDecision)), + TraceFlags.builder() + .setSampled(isSampled(samplingDecision)) + .setRandomTraceId(isTraceIdRandom) + .build(), samplingResultTraceState, /* remote= */ false, tracerSharedState.isIdGeneratorSafeToSkipIdValidation()); @@ -275,8 +275,6 @@ public Span startSpan() { recordEndSpanMetrics); } -<<<<<<< HEAD -======= /* * A primordial context can be passed as the parent context for a root span * if a non-default TraceFlags or TraceState need to be passed to the sampler @@ -289,7 +287,6 @@ private static Context preparePrimordialContext( return span.storeInContext(parentContext); } ->>>>>>> fc520a087 (Merging with upstream.) private static TraceFlags newTraceFlags(boolean randomTraceId, boolean sampled) { TraceFlags traceFlags = TraceFlags.getDefault(); if (randomTraceId) { From c394ea78a5f65b3d59dd7c34a6f6b1accf9d4abd Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Fri, 6 Feb 2026 11:12:53 -0800 Subject: [PATCH 6/7] Addressing code review remarks and suggestions. Refactoring to use the builder pattern to create and manipulate TraceFlags. --- .../sdk/trace/SdkSpanBuilder.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java index f553641b29e..f8f70724644 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java @@ -275,29 +275,6 @@ public Span startSpan() { recordEndSpanMetrics); } - /* - * A primordial context can be passed as the parent context for a root span - * if a non-default TraceFlags or TraceState need to be passed to the sampler - */ - private static Context preparePrimordialContext( - Context parentContext, TraceFlags traceFlags, TraceState traceState) { - SpanContext spanContext = - SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState); - Span span = Span.wrap(spanContext); - return span.storeInContext(parentContext); - } - - private static TraceFlags newTraceFlags(boolean randomTraceId, boolean sampled) { - TraceFlags traceFlags = TraceFlags.getDefault(); - if (randomTraceId) { - traceFlags = traceFlags.withRandomTraceIdBit(); - } - if (sampled) { - traceFlags = traceFlags.withSampledBit(); - } - return traceFlags; - } - private AttributesMap attributes() { AttributesMap attributes = this.attributes; if (attributes == null) { From 92fceae545fd11c4088404954b8613443cba5ab7 Mon Sep 17 00:00:00 2001 From: Peter Findeisen Date: Fri, 6 Feb 2026 11:36:47 -0800 Subject: [PATCH 7/7] Adding missing(?) apidiff files. --- docs/apidiffs/current_vs_latest/opentelemetry-api.txt | 11 +++++++++++ .../current_vs_latest/opentelemetry-sdk-trace.txt | 4 ++++ 2 files changed, 15 insertions(+) create mode 100644 docs/apidiffs/current_vs_latest/opentelemetry-api.txt create mode 100644 docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt new file mode 100644 index 00000000000..08d05547f55 --- /dev/null +++ b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt @@ -0,0 +1,11 @@ +Comparing source compatibility of opentelemetry-api-1.60.0-SNAPSHOT.jar against opentelemetry-api-1.59.0.jar +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.trace.TraceFlags (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.api.trace.TraceFlagsBuilder builder() + +++ NEW METHOD: PUBLIC(+) boolean isTraceIdRandom() ++++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) io.opentelemetry.api.trace.TraceFlagsBuilder (not serializable) + +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. + +++ NEW SUPERCLASS: java.lang.Object + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.api.trace.TraceFlags build() + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.api.trace.TraceFlagsBuilder setRandomTraceId(boolean) + +++ NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.api.trace.TraceFlagsBuilder setSampled(boolean) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt new file mode 100644 index 00000000000..5e8cfb5214e --- /dev/null +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt @@ -0,0 +1,4 @@ +Comparing source compatibility of opentelemetry-sdk-trace-1.60.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.59.0.jar +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.trace.IdGenerator (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) boolean generatesRandomTraceIds()