From f6d31c0b62cef5b7316dda8c8e3d43dc406c03f1 Mon Sep 17 00:00:00 2001 From: Eunbin Son <58901024+thswlsqls@users.noreply.github.com> Date: Thu, 30 Jul 2026 22:59:15 +0900 Subject: [PATCH 1/7] Fix target_info metric name in PrometheusHttpServerBuilder javadoc (#8628) --- .../exporter/prometheus/PrometheusHttpServerBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index 7b85bb027ac..156c721e449 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -97,7 +97,7 @@ public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLa return this; } - /** Set if the {@code otel_target_info} metric is generated. Default is {@code true}. */ + /** Set if the {@code target_info} metric is generated. Default is {@code true}. */ public PrometheusHttpServerBuilder setTargetInfoMetricEnabled(boolean targetInfoMetricEnabled) { metricReaderBuilder.setTargetInfoMetricEnabled(targetInfoMetricEnabled); return this; From f224ff7042e1f448558cbeb76ae91add093225ed Mon Sep 17 00:00:00 2001 From: Eunbin Son <58901024+thswlsqls@users.noreply.github.com> Date: Thu, 30 Jul 2026 23:01:02 +0900 Subject: [PATCH 2/7] Skip empty baggage key in OtTracePropagator extract (#8631) --- .../trace/propagation/OtTracePropagator.java | 3 ++- .../trace/propagation/OtTracePropagatorTest.java | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java index 10f3c8d8e8e..a8ebb8c7a6e 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java @@ -146,7 +146,8 @@ public Context extract(Context context, @Nullable C carrier, TextMapGetter carrier = new LinkedHashMap<>(); + carrier.put(OtTracePropagator.TRACE_ID_HEADER, TRACE_ID); + carrier.put(OtTracePropagator.SPAN_ID_HEADER, SPAN_ID); + carrier.put(OtTracePropagator.SAMPLED_HEADER, Common.TRUE_INT); + carrier.put(OtTracePropagator.PREFIX_BAGGAGE_HEADER, "value"); // Not really a valid key. + + Context context = propagator.extract(Context.current(), carrier, getter); + + assertThat(Baggage.fromContext(context)).isEqualTo(Baggage.empty()); + } + @Test void extract_Baggage_InvalidContext() { Map carrier = new LinkedHashMap<>(); From d9abf30670a61b2d10c312790a9074020709396a Mon Sep 17 00:00:00 2001 From: Eunbin Son <58901024+thswlsqls@users.noreply.github.com> Date: Thu, 30 Jul 2026 23:02:39 +0900 Subject: [PATCH 3/7] Log the exception when a gRPC response frame is invalid (#8626) --- .../exporter/sender/okhttp/internal/OkHttpGrpcSender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java index d9c1e490051..878cca34781 100644 --- a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java +++ b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java @@ -188,7 +188,7 @@ private void handleResponse(Response response, Consumer onResponse compressed = body.source().readByte() != 0; body.source().skip(4); // message length — we bound reads by EOF instead } catch (IOException e) { - logger.log(Level.FINE, "Invalid gRPC response frame"); + logger.log(Level.FINE, "Invalid gRPC response frame", e); onResponse.accept( ImmutableGrpcResponse.create(grpcStatus(response), grpcMessage(response), new byte[0])); return; From 99a9d73d06971ebe9463c10649e8fbfecfb952e6 Mon Sep 17 00:00:00 2001 From: Eunbin Son <58901024+thswlsqls@users.noreply.github.com> Date: Thu, 30 Jul 2026 23:09:42 +0900 Subject: [PATCH 4/7] Add links to OpenCensus spans after span start (#8635) --- CHANGELOG.md | 5 +++ opencensus-shim/README.md | 5 --- .../opencensusshim/OpenTelemetrySpanImpl.java | 20 +++++++-- .../OpenTelemetrySpanImplTest.java | 45 +++++++++++++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf04a42f4d9..69e5107e410 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,11 @@ * Logging: Output event name in `SystemOutLogRecordExporter` ([#8609](https://github.com/open-telemetry/opentelemetry-java/pull/8609)) +### Shims + +* Add OpenCensus links to the OpenTelemetry span instead of logging a warning and dropping them + ([#8635](https://github.com/open-telemetry/opentelemetry-java/pull/8635)) + ## Version 1.64.0 (2026-07-10) ### API diff --git a/opencensus-shim/README.md b/opencensus-shim/README.md index 69c9f3319cd..b124e4d2c76 100644 --- a/opencensus-shim/README.md +++ b/opencensus-shim/README.md @@ -38,8 +38,3 @@ SdkMeterProvider.builder() .registerMetricReader(OpenCensusMetrics.attachTo(PeriodicMetricReader.create(metricExporter))) .build(); ``` - -## Known Problems - -* OpenCensus links added after an OpenCensus span is created will not be -exported, as OpenTelemetry only supports links added when a span is created. diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java index 87c41b1ff07..5e4c76a386b 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java @@ -39,6 +39,8 @@ import io.opencensus.trace.MessageEvent; import io.opencensus.trace.Span; import io.opencensus.trace.Status; +import io.opencensus.trace.TraceOptions; +import io.opencensus.trace.Tracestate; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; @@ -46,13 +48,12 @@ import io.opentelemetry.api.trace.StatusCode; import java.util.EnumSet; import java.util.Map; -import java.util.logging.Logger; class OpenTelemetrySpanImpl extends Span implements io.opentelemetry.api.trace.Span, DelegatingSpan { - private static final Logger LOGGER = Logger.getLogger(OpenTelemetrySpanImpl.class.getName()); private static final EnumSet RECORD_EVENTS_SPAN_OPTIONS = EnumSet.of(Span.Options.RECORD_EVENTS); + private static final Tracestate OC_TRACESTATE_DEFAULT = Tracestate.builder().build(); private final io.opentelemetry.api.trace.Span otelSpan; @@ -104,7 +105,20 @@ public void addAnnotation(Annotation annotation) { @Override public void addLink(Link link) { - LOGGER.warning("OpenTelemetry does not support links added after a span is created."); + Preconditions.checkNotNull(link, "link"); + AttributesBuilder attributesBuilder = Attributes.builder(); + mapAttributes(link.getAttributes(), attributesBuilder); + // DelegatingSpan does not override addLink, so DelegatingSpan.super.addLink(..) would call the + // no-op default method of Span and drop the link. Call the delegate directly instead. + getDelegate() + .addLink( + mapSpanContext( + io.opencensus.trace.SpanContext.create( + link.getTraceId(), + link.getSpanId(), + TraceOptions.DEFAULT, + OC_TRACESTATE_DEFAULT)), + attributesBuilder.build()); } @Override diff --git a/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java b/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java index 448c032a3f8..e700d5b30f6 100644 --- a/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java +++ b/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java @@ -5,16 +5,27 @@ package io.opentelemetry.opencensusshim; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.Link; +import io.opencensus.trace.SpanId; import io.opencensus.trace.Status; +import io.opencensus.trace.TraceId; +import io.opencensus.trace.TraceOptions; +import io.opencensus.trace.Tracestate; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.StatusCode; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import java.util.Collections; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -26,6 +37,9 @@ @MockitoSettings(strictness = Strictness.LENIENT) class OpenTelemetrySpanImplTest { + private static final String TRACE_ID = "0123456789abcdef0123456789abcdef"; + private static final String SPAN_ID = "fedcba9876543210"; + @Mock private Span otelSpan; private OpenTelemetrySpanImpl shimSpan() { @@ -47,4 +61,35 @@ void setStatus_withoutDescription_setsCodeOnly() { verify(otelSpan).setStatus(StatusCode.OK); verify(otelSpan, never()).setStatus(any(StatusCode.class), anyString()); } + + @Test + void addLink_delegatesToOtelSpan() { + shimSpan().addLink(Link.fromSpanContext(ocSpanContext(), Link.Type.CHILD_LINKED_SPAN)); + + verify(otelSpan).addLink(expectedOtelSpanContext(), Attributes.empty()); + } + + @Test + void addLink_mapsAttributes() { + shimSpan() + .addLink( + Link.fromSpanContext( + ocSpanContext(), + Link.Type.PARENT_LINKED_SPAN, + Collections.singletonMap("key", AttributeValue.stringAttributeValue("value")))); + + verify(otelSpan).addLink(expectedOtelSpanContext(), Attributes.of(stringKey("key"), "value")); + } + + private static io.opencensus.trace.SpanContext ocSpanContext() { + return io.opencensus.trace.SpanContext.create( + TraceId.fromLowerBase16(TRACE_ID), + SpanId.fromLowerBase16(SPAN_ID), + TraceOptions.DEFAULT, + Tracestate.builder().build()); + } + + private static SpanContext expectedOtelSpanContext() { + return SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()); + } } From 3a12e2b5cb5b2695104d571ca342743361c3086b Mon Sep 17 00:00:00 2001 From: Eunbin Son <58901024+thswlsqls@users.noreply.github.com> Date: Thu, 30 Jul 2026 23:59:01 +0900 Subject: [PATCH 5/7] Return extracted SpanContext when it is sampled but invalid (#8634) Co-authored-by: Jack Berg <34418638+jack-berg@users.noreply.github.com> --- CHANGELOG.md | 2 + .../opentracingshim/Propagation.java | 4 +- .../opentracingshim/TracerShimTest.java | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69e5107e410..6252a43ec29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ ### Shims +* OpenTracing: Return the extracted `SpanContext` when it is sampled but invalid + ([#8634](https://github.com/open-telemetry/opentelemetry-java/pull/8634)) * Add OpenCensus links to the OpenTelemetry span instead of logging a warning and dropping them ([#8635](https://github.com/open-telemetry/opentelemetry-java/pull/8635)) diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java index 04f0407b4a8..e67bf4fa73d 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/Propagation.java @@ -46,7 +46,9 @@ SpanContextShim extractTextMap(Format format, TextMapExtract carrier) { Span span = Span.fromContext(context); Baggage baggage = Baggage.fromContext(context); - if (!span.getSpanContext().isValid() && baggage.isEmpty()) { + if (!span.getSpanContext().isValid() + && !span.getSpanContext().isSampled() + && baggage.isEmpty()) { return null; } diff --git a/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/TracerShimTest.java b/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/TracerShimTest.java index f539e5e3bfa..199b6209e26 100644 --- a/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/TracerShimTest.java +++ b/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/TracerShimTest.java @@ -14,9 +14,15 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; +import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceId; +import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension; @@ -32,9 +38,11 @@ import io.opentracing.tag.StringTag; import io.opentracing.tag.Tag; import io.opentracing.tag.Tags; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import javax.annotation.Nullable; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -350,6 +358,21 @@ void extract_onlyBaggage() { assertThat(spanContextShim.getBaggage()).isEqualTo(baggage); } + @Test + void extract_invalidButSampledSpanContext() { + tracerShim = + new TracerShim(provider, new InvalidButSampledPropagator(), TextMapPropagator.noop()); + + SpanContext spanContext = + tracerShim.extract(Format.Builtin.TEXT_MAP, new TextMapAdapter(new HashMap<>())); + + assertThat(spanContext).isNotNull(); + SpanContextShim spanContextShim = (SpanContextShim) spanContext; + assertThat(spanContextShim.getSpanContext().isValid()).isFalse(); + assertThat(spanContextShim.getSpanContext().isSampled()).isTrue(); + assertThat(spanContextShim.getBaggage().isEmpty()).isTrue(); + } + @Test void extract_emptyCarrier_withActiveSpan_returnsNull() { Span span = tracerShim.buildSpan("one").start(); @@ -467,4 +490,26 @@ void noopDoesNotCrash() { assertThat(((SpanShim) span).getSpan().isRecording()).isFalse(); } + + /** Extracts an invalid but sampled {@code SpanContext}, as {@code jaeger-debug-id} headers do. */ + private static class InvalidButSampledPropagator implements TextMapPropagator { + @Override + public Collection fields() { + return Collections.emptyList(); + } + + @Override + public void inject(Context context, @Nullable C carrier, TextMapSetter setter) {} + + @Override + public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { + return context.with( + io.opentelemetry.api.trace.Span.wrap( + io.opentelemetry.api.trace.SpanContext.create( + TraceId.getInvalid(), + SpanId.getInvalid(), + TraceFlags.getSampled(), + TraceState.getDefault()))); + } + } } From bc956bcf7d402104fe59af8ba31ff9b73849e9b7 Mon Sep 17 00:00:00 2001 From: Mohammed AbdessetarElyagoubi Date: Thu, 30 Jul 2026 20:15:18 +0100 Subject: [PATCH 6/7] Fix declarative Jaeger sampler interval configuration (#8668) --- .../trace/jaeger/sampler/JaegerRemoteSampler.java | 14 +++++++++++++- .../jaeger/sampler/JaegerRemoteSamplerBuilder.java | 3 ++- .../JaegerRemoteSamplerComponentProvider.java | 2 +- .../jaeger/sampler/JaegerRemoteSamplerTest.java | 14 ++++++++------ .../sampler/JaegerRemoteSamplerGrpcNettyTest.java | 13 +++++++------ 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java index 52a8b350e7c..96d196da719 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import java.io.IOException; +import java.net.URI; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -45,14 +46,19 @@ public final class JaegerRemoteSampler implements Sampler { private final AtomicBoolean isShutdown = new AtomicBoolean(); private final GrpcSender grpcSender; + private final URI endpoint; + private final int pollingIntervalMs; JaegerRemoteSampler( GrpcSender grpcSender, + URI endpoint, @Nullable String serviceName, int pollingIntervalMs, Sampler initialSampler) { this.serviceName = serviceName != null ? serviceName : ""; this.grpcSender = grpcSender; + this.endpoint = endpoint; + this.pollingIntervalMs = pollingIntervalMs; this.sampler = initialSampler; pollExecutor = Executors.newScheduledThreadPool(1, new DaemonThreadFactory(WORKER_THREAD_NAME)); pollFuture = @@ -161,7 +167,13 @@ private static Sampler updateSampler(SamplingStrategyResponse response) throws I @Override public String getDescription() { - return String.format("JaegerRemoteSampler{%s}", this.sampler); + return "JaegerRemoteSampler{sampler=" + + this.sampler + + ", endpoint=" + + this.endpoint + + ", pollingIntervalMs=" + + this.pollingIntervalMs + + "}"; } @Override diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java index 2228956c47f..c6b2783e1a2 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java @@ -181,7 +181,8 @@ public JaegerRemoteSamplerBuilder setChannel(ManagedChannel channel) { */ public JaegerRemoteSampler build() { GrpcSender grpcSender = resolveGrpcSender(); - return new JaegerRemoteSampler(grpcSender, serviceName, pollingIntervalMillis, initialSampler); + return new JaegerRemoteSampler( + grpcSender, endpoint, serviceName, pollingIntervalMillis, initialSampler); } private GrpcSender resolveGrpcSender() { diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java index b6dd93b77c1..b983f6751ef 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/internal/JaegerRemoteSamplerComponentProvider.java @@ -47,7 +47,7 @@ public Sampler create(DeclarativeConfigProperties config) { } builder.setInitialSampler(DeclarativeConfiguration.createSampler(initialSamplerModel)); - Long pollingIntervalMs = config.getLong("internal"); + Long pollingIntervalMs = config.getLong("interval"); if (pollingIntervalMs != null) { builder.setPollingInterval(Duration.ofMillis(pollingIntervalMs)); } diff --git a/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java b/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java index 88047b9f92d..4ed67399f87 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java +++ b/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java @@ -284,7 +284,8 @@ void description() { assertThat(sampler).extracting("grpcSender").isInstanceOf(OkHttpGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}") + .contains("endpoint=" + server.httpUri(), "pollingIntervalMs=1000"); // wait until the sampling strategy is retrieved before exiting test method await().untilAsserted(samplerIsType(sampler, RateLimitingSampler.class)); @@ -301,7 +302,8 @@ void initialSampler() { .build()) { assertThat(sampler).extracting("grpcSender").isInstanceOf(OkHttpGrpcSender.class); - assertThat(sampler.getDescription()).startsWith("JaegerRemoteSampler{AlwaysOnSampler}"); + assertThat(sampler.getDescription()) + .startsWith("JaegerRemoteSampler{sampler=AlwaysOnSampler"); } } @@ -400,7 +402,7 @@ void perOperationSampling() { () -> { assertThat(sampler.getDescription()) .startsWith( - "JaegerRemoteSampler{ParentBased{root:PerOperationSampler{default=TraceIdRatioBased{0.550000}, perOperation={foo=TraceIdRatioBased{0.900000}, bar=TraceIdRatioBased{0.700000}}}"); + "JaegerRemoteSampler{sampler=ParentBased{root:PerOperationSampler{default=TraceIdRatioBased{0.550000}, perOperation={foo=TraceIdRatioBased{0.900000}, bar=TraceIdRatioBased{0.700000}}}"); assertThat(sampler.getDescription()).contains("bar"); }); } @@ -419,7 +421,7 @@ void internal_error_server_response() { assertThat(sampler).extracting("grpcSender").isInstanceOf(OkHttpGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); await() .untilAsserted( @@ -444,7 +446,7 @@ void unavailable_error_server_response() { assertThat(sampler).extracting("grpcSender").isInstanceOf(OkHttpGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); await() .untilAsserted( @@ -468,7 +470,7 @@ void unimplemented_error_server_response() { assertThat(sampler).extracting("grpcSender").isInstanceOf(OkHttpGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); await() .untilAsserted( diff --git a/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java b/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java index c2ddc1987ad..7ef47608f9f 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java +++ b/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java @@ -159,7 +159,7 @@ void description() { assertThat(sampler).extracting("grpcSender").isInstanceOf(UpstreamGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); // wait until the sampling strategy is retrieved before exiting test method await().untilAsserted(samplerIsType(sampler, RateLimitingSampler.class)); @@ -178,7 +178,8 @@ void initialSampler() { .build()) { assertThat(sampler).extracting("grpcSender").isInstanceOf(UpstreamGrpcSender.class); - assertThat(sampler.getDescription()).startsWith("JaegerRemoteSampler{AlwaysOnSampler}"); + assertThat(sampler.getDescription()) + .startsWith("JaegerRemoteSampler{sampler=AlwaysOnSampler"); } } @@ -277,7 +278,7 @@ void perOperationSampling() { () -> { assertThat(sampler.getDescription()) .startsWith( - "JaegerRemoteSampler{ParentBased{root:PerOperationSampler{default=TraceIdRatioBased{0.550000}, perOperation={foo=TraceIdRatioBased{0.900000}, bar=TraceIdRatioBased{0.700000}}}"); + "JaegerRemoteSampler{sampler=ParentBased{root:PerOperationSampler{default=TraceIdRatioBased{0.550000}, perOperation={foo=TraceIdRatioBased{0.900000}, bar=TraceIdRatioBased{0.700000}}}"); assertThat(sampler.getDescription()).contains("bar"); }); } @@ -297,7 +298,7 @@ void internal_error_server_response() { assertThat(sampler).extracting("grpcSender").isInstanceOf(UpstreamGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); await() .untilAsserted( @@ -323,7 +324,7 @@ void unavailable_error_server_response() { assertThat(sampler).extracting("grpcSender").isInstanceOf(UpstreamGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); await() .untilAsserted( @@ -348,7 +349,7 @@ void unimplemented_error_server_response() { assertThat(sampler).extracting("grpcSender").isInstanceOf(UpstreamGrpcSender.class); assertThat(sampler.getDescription()) - .startsWith("JaegerRemoteSampler{ParentBased{root:TraceIdRatioBased{0.001000}"); + .startsWith("JaegerRemoteSampler{sampler=ParentBased{root:TraceIdRatioBased{0.001000}"); await() .untilAsserted( From f8bd413df10411d7ecc76add7371c73eb8c333e7 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 31 Jul 2026 14:22:51 -0500 Subject: [PATCH 7/7] Restore java 25 lts to test matrix, collect coverage on java 25 (#8678) --- .github/workflows/build.yml | 3 ++- .../sdk/metrics/internal/state/TestInstrumentType.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aef1339eef9..ca3d8fab774 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,11 +31,12 @@ jobs: - 11 - 17 - 21 + - 25 - 26 # renovate(java-version) # Collect coverage on latest LTS include: - os: ubuntu-latest - test-java-version: 21 + test-java-version: 25 coverage: true jmh-based-tests: true steps: diff --git a/sdk/metrics/src/jmhBasedTest/java/io/opentelemetry/sdk/metrics/internal/state/TestInstrumentType.java b/sdk/metrics/src/jmhBasedTest/java/io/opentelemetry/sdk/metrics/internal/state/TestInstrumentType.java index 5a462fd94c8..9877d02a945 100644 --- a/sdk/metrics/src/jmhBasedTest/java/io/opentelemetry/sdk/metrics/internal/state/TestInstrumentType.java +++ b/sdk/metrics/src/jmhBasedTest/java/io/opentelemetry/sdk/metrics/internal/state/TestInstrumentType.java @@ -31,7 +31,7 @@ public enum TestInstrumentType { DOUBLE_SUM( DoubleSumTester::new, /* dataAllocRateReductionPercentage= */ 97.3f, - /* allowedPercentOffset= */ 2.0f), + /* allowedPercentOffset= */ 4.0f), LONG_LAST_VALUE( LongLastValueTester::new, /* dataAllocRateReductionPercentage= */ 97.3f,