diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ebd56e3531..fe3600e8d15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,90 @@ ## Unreleased +### API + +* Add null guards and API usage logging for tracing, metrics, propagation, and context APIs + ([#8913](https://github.com/open-telemetry/opentelemetry-java/pull/8913), [#8968](https://github.com/open-telemetry/opentelemetry-java/pull/8968)) +* Add stable `io.opentelemetry.api.impl.Base16EncodingUtils` and `TemporaryBuffers` utilities + ([#8929](https://github.com/open-telemetry/opentelemetry-java/pull/8929), [#8955](https://github.com/open-telemetry/opentelemetry-java/pull/8955)) +* Fix uncompilable Javadoc examples in context APIs + ([#8934](https://github.com/open-telemetry/opentelemetry-java/pull/8934)) + +#### Incubating + +* Avoid false type warnings in `DeclarativeConfigProperties.toMap()` + ([#8921](https://github.com/open-telemetry/opentelemetry-java/pull/8921)) + +#### Extensions + +* Trace propagators: Handle malformed URL escapes in Jaeger headers + ([#8912](https://github.com/open-telemetry/opentelemetry-java/pull/8912)) +* Trace propagators: Include the B3 debug header in multi-header propagation fields + ([#8930](https://github.com/open-telemetry/opentelemetry-java/pull/8930)) +* Trace propagators: Fix hexadecimal flag parsing in Jaeger headers + ([#8975](https://github.com/open-telemetry/opentelemetry-java/pull/8975)) + +### SDK + +* Remove cross-module internal utility dependencies from resource and retry code + ([#8916](https://github.com/open-telemetry/opentelemetry-java/pull/8916)) +* Add experimental `SdkResourceProvider` support shared by tracer, meter, and logger providers + ([#8865](https://github.com/open-telemetry/opentelemetry-java/pull/8865)) + +#### Traces + +* Retain invalid span links with attributes or trace state + ([#8917](https://github.com/open-telemetry/opentelemetry-java/pull/8917)) + +#### Metrics + +* Use a dedicated export worker in `PeriodicMetricReader`, queue concurrent flushes, and add `setExporterTimeout()` with a default equal to the export interval + ([#8827](https://github.com/open-telemetry/opentelemetry-java/pull/8827)) + +#### Exporters + +* Logging: Fall back to the observed timestamp in `SystemOutLogRecordExporter` when the timestamp is unset + ([#8944](https://github.com/open-telemetry/opentelemetry-java/pull/8944)) +* OTLP: Close the JDK HTTP response body on unsupported `Content-Encoding` + ([#8962](https://github.com/open-telemetry/opentelemetry-java/pull/8962)) +* OTLP: Match the `Host` header case-insensitively in the managed-channel gRPC sender + ([#8957](https://github.com/open-telemetry/opentelemetry-java/pull/8957)) +* OTLP: Fix exporter metric server attributes for hosts that `java.net.URI` cannot parse + ([#8941](https://github.com/open-telemetry/opentelemetry-java/pull/8941)) +* OTLP: Pass the original exception to the JDK HTTP sender's error callback + ([#8963](https://github.com/open-telemetry/opentelemetry-java/pull/8963)) +* OTLP: Retry OkHttp gRPC exports on the current thread to avoid rejection by bounded executors + ([#8965](https://github.com/open-telemetry/opentelemetry-java/pull/8965)) +* OTLP: Restore per-attempt retry logging in the OkHttp gRPC sender + ([#8967](https://github.com/open-telemetry/opentelemetry-java/pull/8967)) +* OTLP: Correct exporter builder Javadoc + ([#8996](https://github.com/open-telemetry/opentelemetry-java/pull/8996)) +* OTLP: Accept `0` as no limit for maximum request body and message sizes + ([#8945](https://github.com/open-telemetry/opentelemetry-java/pull/8945)) +* OTLP: gRPC exporter internal telemetry uses `rpc.status_code` instead of + `rpc.response.status.code` when `InternalTelemetryVersion` is set to `LATEST` + ([#9007](https://github.com/open-telemetry/opentelemetry-java/pull/9007)) +* Prometheus: Give exemplar `trace_id` and `span_id` precedence over filtered attributes + ([#8959](https://github.com/open-telemetry/opentelemetry-java/pull/8959)) + +#### Extensions + +* **BREAKING** Incubator: Change `SamplingIntent.create()` and `getTraceStateUpdater()` from `Function` to `BiFunction` accepting the final `SamplingDecision`, and fix consistent sampling corner cases + ([#8952](https://github.com/open-telemetry/opentelemetry-java/pull/8952)) +* Autoconfigure: Match environment variables for configuration keys containing underscores + ([#8933](https://github.com/open-telemetry/opentelemetry-java/pull/8933), [#8951](https://github.com/open-telemetry/opentelemetry-java/pull/8951)) +* Autoconfigure: Support `PeriodicMetricReader` batch sizes through `otel.metric.export.max.batch.size` + ([#8935](https://github.com/open-telemetry/opentelemetry-java/pull/8935)) +* Autoconfigure: Correct SPI Javadoc + ([#8900](https://github.com/open-telemetry/opentelemetry-java/pull/8900)) + +#### Testing + +* Add fluent metric point assertions to `MetricAssert` + ([#8994](https://github.com/open-telemetry/opentelemetry-java/pull/8994)) +* Add a builder supporting aggregation temporality selectors to `InMemoryMetricExporter` + ([#8993](https://github.com/open-telemetry/opentelemetry-java/pull/8993)) + ## Version 1.67.0 (2026-10-09) ### API diff --git a/api/all/src/main/java/io/opentelemetry/api/impl/Base16EncodingUtils.java b/api/all/src/main/java/io/opentelemetry/api/impl/Base16EncodingUtils.java index a0a236247fd..d25e90208b9 100644 --- a/api/all/src/main/java/io/opentelemetry/api/impl/Base16EncodingUtils.java +++ b/api/all/src/main/java/io/opentelemetry/api/impl/Base16EncodingUtils.java @@ -12,6 +12,8 @@ * *

This class is not intended for use by application developers. Its API is stable and will not * be changed or removed in a backwards-incompatible manner. + * + * @since 1.68.0 */ public final class Base16EncodingUtils { diff --git a/api/all/src/main/java/io/opentelemetry/api/impl/TemporaryBuffers.java b/api/all/src/main/java/io/opentelemetry/api/impl/TemporaryBuffers.java index 10474037573..c3a6a1c2c82 100644 --- a/api/all/src/main/java/io/opentelemetry/api/impl/TemporaryBuffers.java +++ b/api/all/src/main/java/io/opentelemetry/api/impl/TemporaryBuffers.java @@ -14,6 +14,8 @@ * *

This class is not intended for use by application developers. Its API is stable and will not * be changed or removed in a backwards-incompatible manner. + * + * @since 1.68.0 */ public final class TemporaryBuffers { diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderBuilder.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderBuilder.java index aa8eab4bf95..e0d7e342425 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderBuilder.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderBuilder.java @@ -65,6 +65,8 @@ public PeriodicMetricReaderBuilder setInterval(Duration interval) { * *

When {@link #setMaxExportBatchSize(int)} is configured, the timeout applies to each * individual export(batch) invocation, not the aggregate export cycle. + * + * @since 1.68.0 */ public PeriodicMetricReaderBuilder setExporterTimeout(long timeout, TimeUnit unit) { requireNonNull(unit, "unit"); @@ -80,6 +82,8 @@ public PeriodicMetricReaderBuilder setExporterTimeout(long timeout, TimeUnit uni * *

When {@link #setMaxExportBatchSize(int)} is configured, the timeout applies to each * individual export(batch) invocation, not the aggregate export cycle. + * + * @since 1.68.0 */ public PeriodicMetricReaderBuilder setExporterTimeout(Duration timeout) { requireNonNull(timeout, "timeout"); diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/MetricAssert.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/MetricAssert.java index 9b4e3cc9dbc..bcc2af929c1 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/MetricAssert.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/MetricAssert.java @@ -125,6 +125,8 @@ public MetricAssert hasDoubleGaugeSatisfying(Consumer asserti /** * Asserts this {@link MetricData} is a double gauge with points matching all of the given * assertions and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -136,6 +138,8 @@ public final MetricAssert hasDoubleGaugePointsSatisfying( /** * Asserts this {@link MetricData} is a double gauge with points matching all of the given * assertions and no more, in any order. + * + * @since 1.68.0 */ public MetricAssert hasDoubleGaugePointsSatisfying( Iterable> assertions) { @@ -162,6 +166,8 @@ public MetricAssert hasLongGaugeSatisfying(Consumer assertion) /** * Asserts this {@link MetricData} is a long gauge with points matching all of the given * assertions and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -172,6 +178,8 @@ public final MetricAssert hasLongGaugePointsSatisfying(Consumer /** * Asserts this {@link MetricData} is a long gauge with points matching all of the given * assertions and no more, in any order. + * + * @since 1.68.0 */ public MetricAssert hasLongGaugePointsSatisfying( Iterable> assertions) { @@ -196,6 +204,8 @@ public MetricAssert hasDoubleSumSatisfying(Consumer assertion) /** * Asserts this {@link MetricData} is a double sum with points matching all of the given * assertions and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -207,6 +217,8 @@ public final MetricAssert hasDoubleSumPointsSatisfying( /** * Asserts this {@link MetricData} is a double sum with points matching all of the given * assertions and no more, in any order. + * + * @since 1.68.0 */ public MetricAssert hasDoubleSumPointsSatisfying( Iterable> assertions) { @@ -231,6 +243,8 @@ public MetricAssert hasLongSumSatisfying(Consumer assertion) { /** * Asserts this {@link MetricData} is a long sum with points matching all of the given assertions * and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -241,6 +255,8 @@ public final MetricAssert hasLongSumPointsSatisfying(Consumer.. /** * Asserts this {@link MetricData} is a long sum with points matching all of the given assertions * and no more, in any order. + * + * @since 1.68.0 */ public MetricAssert hasLongSumPointsSatisfying( Iterable> assertions) { @@ -265,6 +281,8 @@ public MetricAssert hasHistogramSatisfying(Consumer assertion) /** * Asserts this {@link MetricData} is a histogram with points matching all of the given assertions * and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -276,6 +294,8 @@ public final MetricAssert hasHistogramPointsSatisfying( /** * Asserts this {@link MetricData} is a histogram with points matching all of the given assertions * and no more, in any order. + * + * @since 1.68.0 */ public MetricAssert hasHistogramPointsSatisfying( Iterable> assertions) { @@ -306,6 +326,8 @@ public MetricAssert hasExponentialHistogramSatisfying( /** * Asserts this {@link MetricData} is an exponential histogram with points matching all of the * given assertions and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -318,6 +340,8 @@ public final MetricAssert hasExponentialHistogramPointsSatisfying( /** * Asserts this {@link MetricData} is an exponential histogram with points matching all of the * given assertions and no more, in any order. + * + * @since 1.68.0 */ public MetricAssert hasExponentialHistogramPointsSatisfying( Iterable> assertions) { @@ -343,6 +367,8 @@ public MetricAssert hasSummarySatisfying(Consumer assertion) { /** * Asserts this {@link MetricData} is a summary with points matching all of the given assertions * and no more, in any order. + * + * @since 1.68.0 */ @SafeVarargs @SuppressWarnings("varargs") @@ -353,6 +379,8 @@ public final MetricAssert hasSummaryPointsSatisfying(Consumer> assertions) {