66 KiB
Changelog
vNext
- Fixed
Histogram,Sum,LastValue, andPrecomputedSumaggregators (and their bound-instrument handles) silently accepting NaN/Infinity measurements. ForHistogramandSum, a single NaN measurement permanently corrupted the cumulativesum/total for the rest of the process's lifetime (x + NaN == NaN);LastValueandPrecomputedSumself-healed on the next valid measurement but still exported one bad value in the meantime, andPrecomputedSumunder delta temporality corrupted two export cycles. Non-finite measurements are now dropped before recording, matchingExponentialHistogram's existing behavior. (#3656)
0.33.0
Released 2026-Sep-18
- Publicly export the
OTEL_*/OTEL_*_DEFAULTenvironment variable name and default value constants forBatchSpanProcessor(opentelemetry_sdk::trace),BatchLogProcessor(opentelemetry_sdk::logs), andPeriodicReader(opentelemetry_sdk::metrics), so downstream configuration systems can read the SDK's spec-defined defaults programmatically instead of duplicating them. As part of this,PeriodicReader's previously-privateDEFAULT_INTERVAL/METRIC_EXPORT_INTERVAL_NAMEconstants were renamed toOTEL_METRIC_EXPORT_INTERVAL_DEFAULT/OTEL_METRIC_EXPORT_INTERVALto match the naming convention already used elsewhere. (#3623) - Added SDK self-observability metrics, feature-gated behind
experimental_metrics_bound_instruments:otel.sdk.log.createdcounts log records submitted to the SDK;otel.sdk.processor.log.processedandotel.sdk.processor.span.processedcount records and spans submitted to an exporter by batch and simple processors, witherror.typereporting items dropped before submission; andotel.sdk.processor.log.queue.capacityreports the configuredBatchLogProcessorqueue capacity. (#3514, #3608, #3609, #3611) - Made
futures-channel,futures-executor,futures-util, andthiserroroptional, enabling a minimal SDK build. Withdefault-features = false, the SDK's only dependency is theopentelemetryAPI crate. (#3593) - Bound instruments are now available for
GaugeandUpDownCountervia the newBoundGauge<T>andBoundUpDownCounter<T>types exposed by theopentelemetrycrate. Requires theexperimental_metrics_bound_instrumentsfeature. - Fixed a race in
BatchSpanProcessorandBatchLogProcessorwhere a span/log enqueued just beforeforce_flush()orshutdown()could be missed by the flush and dropped at shutdown: the pending-item counter is now incremented before enqueueing (and reverted if the queue is full), so the worker's counter snapshot can no longer under-count items already in the queue (#3453). - Default SDK Resource construction now falls back to
unknown_serviceunder Miri instead of callingstd::env::current_exe(), avoiding an abort in Miri isolation mode while preserving the normalunknown_service:<process.executable.name>fallback outside Miri. - Fixed asynchronous counters (
ObservableCounter,ObservableUpDownCounter) using delta temporality reporting incorrect deltas when observed attributes were recorded in an unsorted key order.
0.32.1
Released 2026-May-23
BaggagePropagatornow enforces the W3C Baggage maximum header length (8192 bytes) and maximum list-member count (64) when extracting an inboundbaggageheader. Headers exceeding 8192 bytes are dropped at the propagator boundary; headers with more than 64 list members are truncated to the first 64 entries. The change keeps the propagator from parsing attacker-controlled input beyond the W3C limits instead of doing per-entry parse, decode, and allocation work only to discard the excess onBaggageinsert. See https://www.w3.org/TR/baggage/#limits.- Reverted the
SimpleSpanProcessortelemetry suppression added in 0.32.0 (see #3494), which caused aRefCell already borrowedpanic when a span was started and dropped inside aget_active_span(orContext::map_current) closure. Tracked in #3510. A proper fix for the underlyingContext::map_currentre-entrancy will be investigated separately, after which the suppression can be safely re-applied. - View-provided metric stream
name(set viaStream::builder().with_name(...)) is no longer validated against the instrument name syntax, per spec clarification.unitand other stream parameters continue to be validated.
0.32.0
Released 2026-May-08
SimpleSpanProcessornow suppresses telemetry during export, preventing telemetry-induced-telemetry feedback loops. This aligns with the existing behavior inBatchSpanProcessorandSimpleLogProcessor.- Removed
SimpleConcurrentLogProcessorand theexperimental_logs_concurrent_log_processorfeature flag. The use cases it was designed for (ETW/user_events exporters) are better served by modeling those exporters as processors directly. - Added
Counter::bind()andHistogram::bind()SDK implementations that return pre-bound measurement handles (BoundCounter<T>,BoundHistogram<T>). Bound instruments resolve the attribute-to-aggregator mapping once at bind time and cache the result, eliminating per-call HashMap lookups. View attribute filtering is applied at bind time so the hot path stays free of per-call attribute processing. Bound and unbound recordings with the same (post-view) attribute set always aggregate into the same data point, including the empty attribute set. Bound entries are never evicted during delta collection while a handle exists — idle cycles produce no export but the tracker persists. Ifbind()is called at the cardinality limit, the handle binds directly to the overflow tracker — its writes stay on the same direct (no-lookup) hot path and consistently land in theotel.metric.overflow=truebucket for the lifetime of the handle. To recover a bound handle after delta collection frees space, drop the existing handle and callbind()again. Gated behind theexperimental_metrics_bound_instrumentsfeature flag. Benchmarks show ~28x speedup for counter operations and ~9x for histograms. - Delta metrics collection now uses in-place eviction instead of draining the HashMap on every collect cycle. Stale attribute sets that received no measurements since the last collection are evicted. Note: recovery from cardinality overflow now requires 2 collect cycles — the first marks entries as stale, the second evicts them.
- Breaking The SDK
testingfeature is now runtime agnostic. #3407TokioSpanExporterandnew_tokio_test_exporterhave been renamed toTestSpanExporterandnew_test_exporter.- The following transitive dependencies and features have been removed:
tokio/rt,tokio/time,tokio/macros,tokio/rt-multi-thread,tokio-stream,experimental_async_runtime
- Store
InstrumentationScopeinArcinternally inSdkTracer, making tracer clones cheaper (Arc refcount increment instead of deep copy). - Add 32-bit platform support by using
portable-atomicforAtomicI64andAtomicU64in the metrics module. This enables compilation on 32-bit ARM targets (e.g.,armv5te-unknown-linux-gnueabi,armv7-unknown-linux-gnueabihf). Aggregationenum andStreamBuilder::with_aggregation()are now stable and no longer require thespec_unstable_metrics_viewsfeature flag.- Fix
service.nameResource attribute fallback to follow OpenTelemetry specification by usingunknown_service:<process.executable.name>format when service name is not explicitly configured. Previously, it only usedunknown_service. - Fix
SpanExporter::shutdown()default timeout from 5 nanoseconds to 5 seconds. - Breaking
SpanExportertrait methodsshutdown,shutdown_with_timeout, andforce_flushnow take&selfinstead of&mut selffor consistency withLogExporterandPushMetricExporter. Implementers using interior mutability (e.g.,Mutex,AtomicBool) require no changes. - Added
Resource::get_ref(&self, key: &Key) -> Option<&Value>to allow retrieving a reference to a resource value without cloning. - Breaking Removed the following public hidden methods from the
SdkTracer#3227:id_generator,should_sample
- Breaking Moved the following SDK sampling types from
opentelemetry::tracetoopentelemetry_sdk::trace#3277:SamplingDecision,SamplingResult- These types are SDK implementation details and should be imported from
opentelemetry_sdk::traceinstead.
StreamBuilder::build()now rejectsusize::MAXas a cardinality limit with a validation error. #3506- Fix Histogram boundaries being ignored in the presence of views #3312
TracerProviderBuilder::with_samplerallows to pass boxed instance ofShouldSample[#3313][3313]- Fix ObservableCounter and ObservableUpDownCounter now correctly report only data points from the current measurement cycle, removing stale attribute combinations that are no longer observed. #3248
- Fix panic when
SpanProcessor::on_endcallsContext::current()(#3262).- Updated
SpanProcessor::on_enddocumentation to clarify thatContext::current()returns the parent context, not the span's context
- Updated
- Fix
traceparentheaders with unknown flags (e.g. W3C random-trace-id flag0x02) being incorrectly rejected. Unknown flags are now accepted and zeroed out as required by the W3C trace-context spec. #3435 - Add public constructors to metrics data types and make SdkLogRecord::new() public. [#2992][2992]
- Breaking
InMemoryExporterErrorhas been removed and replaced byOTelSdkError, and a newJaegerRemoteSamplerBuildErrorintroduced to replace last uses ofTraceError. #3458 - "spec_unstable_logs_enabled" feature flag is removed. The capability (and the backing specification) is now stable and is enabled by default. #3278
0.31.0
Released 2025-Sep-25
-
Updated
opentelemetryandopentelemetry-httpdependencies to version 0.31.0. -
Feature: Add span flags support for
isRemoteproperty in OTLP exporter (#3153) -
Updated span and link transformations to properly set flags field (0x100 for local, 0x300 for remote)
-
TODO: Placeholder for Span processor related things
- Fix SpanProcessor::on_start is no longer called on non recording spans
-
Fix: Restore true parallel exports in the async-native
BatchSpanProcessorby honoringOTEL_BSP_MAX_CONCURRENT_EXPORTS(#2959). A regression in #2685 inadvertently awaited theexport()future directly inopentelemetry-sdk/src/trace/span_processor_with_async_runtime.rsinstead of spawning it on the runtime, forcing all exports to run sequentially. -
Feature: Added
Cloneimplementation toSdkLoggerfor API consistency withSdkTracer(#3058). -
Fix: batch size accounting in BatchSpanProcessor when queue is full (#3089).
-
Fix: Resolved dependency issue where the "logs" feature incorrectly required the "trace" feature flag (#3096). The logs functionality now operates independently, while automatic correlation between logs and traces continues to work when the "trace" feature is explicitly enabled.
-
Fix: Fix shutdown of
SimpleLogProcessorand asyncBatchLogProcessor. -
Default implementation of
LogProcessor::shutdown_with_timeout()will now warn to encourage users to implement proper shutdown.
0.30.0
Released 2025-May-23
-
Updated
opentelemetryandopentelemetry-httpdependencies to version 0.30.0. -
It is now possible to add links to a
Spanvia theSpanRefthat you get from aContext. 2959 -
Feature: Added context based telemetry suppression. #2868
SdkLogger,SdkTracermodified to respect telemetry suppression based onContext. In other words, if the current context has telemetry suppression enabled, then logs/spans will be ignored.- The flag is typically set by OTel components to prevent telemetry from itself being fed back into OTel.
BatchLogProcessor,BatchSpanProcessor, andPeriodicReadermodified to set the suppression flag in their dedicated thread, so that telemetry generated from those threads will not be fed back into OTel.- Similarly,
SimpleLogProcessoralso modified to suppress telemetry before invoking exporters.
-
Feature: Implemented and enabled cardinality capping for Metrics by default. #2901
- The default cardinality limit is 2000 and can be customized using Views.
- This feature was previously removed in version 0.28 due to the lack of configurability but has now been reintroduced with the ability to configure the limit.
- Fixed the overflow attribute to correctly use the boolean value
trueinstead of the string"true". #2878
-
The
shutdown_with_timeoutmethod is added to SpanProcessor, SpanExporter trait and TracerProvider. -
The
shutdown_with_timeoutmethod is added to LogExporter trait. -
The
shutdown_with_timeoutmethod is added to LogProvider and LogProcessor trait. -
Breaking
MetricError,MetricResultno longer public (except whenspec_unstable_metrics_viewsfeature flag is enabled).OTelSdkResultshould be used instead, wherever applicable. #2906 -
Breaking change, affecting custom
MetricReaderauthors: -
Views improvements:
- Core view functionality is now available by default—users can change the
name, unit, description, and cardinality limit of a metric via views without
enabling the
spec_unstable_metrics_viewsfeature flag. Advanced view features, such as custom aggregation or attribute filtering, still require thespec_unstable_metrics_viewsfeature. - Removed
new_view()method andViewtrait. Views can now be added by passing a function with signatureFn(&Instrument) -> Option<Stream>to thewith_viewmethod onMeterProviderBuilder.
- Core view functionality is now available by default—users can change the
name, unit, description, and cardinality limit of a metric via views without
enabling the
-
Introduced a builder pattern for
Streamcreation to use with views:- Added
StreamBuilderstruct with methods to configure stream properties - Added
Stream::builder()method that returns a newStreamBuilder StreamBuilder::build()returnsResult<Stream, Box<dyn Error>>enabling proper validation.
- Added
Example of using views to rename a metric:
let view_rename = |i: &Instrument| {
if i.name() == "my_histogram" {
Some(
Stream::builder()
.with_name("my_histogram_renamed")
.build()
.unwrap(),
)
} else {
None
}
};
let provider = SdkMeterProvider::builder()
// add exporters, set resource etc.
.with_view(view_rename)
.build();
- Breaking
Aggregationenum moved behind feature flag "spec_unstable_metrics_views". This was only required when using advanced view capabilities. #2928 - Breaking change, affecting custom
PushMetricExporterauthors:- The
exportmethod onPushMetricExporternow accepts&ResourceMetricsinstead of&mut ResourceMetrics. ResourceMetricsno longer exposesscope_metricsfield, but instead offersscope_metrics()method that returns an iterator over the same.ScopeMetricsno longer exposesmetricsfield, but instead offersmetrics()method that returns an iterator over the same.Sum,Gauge,Histogram&ExponentialHistogramno longer exposesdata_pointsfield, but instead offersdata_points()method that returns an iterator over the same.SumDataPoint,GaugeDataPoint,HistogramDataPoint&ExponentialHistogramDataPointno longer exposesattributes,exemplarsfield, but instead offersattributes(), andexemplars()method that returns an iterator over the same.Exemplarno longer exposesfiltered_attributesfield, but instead offersfiltered_attributes()method that returns an iterator over the same.HistogramDataPointno longer exposesboundsandbucket_counts, but instead offersbounds()andbucket_counts()methods that returns an iterator over the same.Metricno longer exposesname,description,unit,datafields, but instead offersname(),description(),unit(), anddata()accessor methods.ResourceMetricsno longer exposesresourcefield, but instead offers aresource()accessor method.ScopeMetricsno longer exposesscopefield, but instead offers ascope()accessor method.
- The
0.29.0
Released 2025-Mar-21
- Update
opentelemetrydependency to 0.29. - Update
opentelemetry-httpdependency to 0.29. - Breaking: The
Runtimetrait has been simplified and refined. See the #2641 for the changes. - Removed
async-stdsupport forRuntime, asasync-stdcrate is deprecated. - Calls to
MeterProviderBuilder::with_resource,TracerProviderBuilder::with_resource,LoggerProviderBuilder::with_resourceare now additive (#2677). - Moved
ExportErrortrait fromopentelemetry::trace::ExportErrortoopentelemetry_sdk::export::ExportError - Moved
TraceErrorenum fromopentelemetry::trace::TraceErrortoopentelemetry_sdk::trace::TraceError - Moved
TraceResulttype alias fromopentelemetry::trace::TraceResulttoopentelemetry_sdk::trace::TraceResult - Breaking: Make
force_flush()inPushMetricExportersynchronous - Breaking: Updated the
SpanExportertrait method signature:
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult>;
to
fn export(
&mut self,
batch: Vec<SpanData>,
) -> impl std::future::Future<Output = OTelSdkResult> + Send;
This affects anyone who writes custom exporters, as custom implementations of SpanExporter
should now define export as an async fn:
impl trace::SpanExporter for CustomExporter {
async fn export(&mut self, batch: Vec<trace::SpanData>) -> OTelSdkResult {
// Implementation here
}
}
-
Breaking The SpanExporter::export() method no longer requires a mutable reference to self. Before:
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResultAfter:
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResultCustom exporters will need to internally synchronize any mutable state, if applicable.
-
Breaking The
shutdown_with_timeoutmethod is added to MetricExporter trait. This is breaking change for customMetricExporterauthors. -
Bug Fix:
BatchLogProcessornow correctly callsshutdownon the exporter when itsshutdownis invoked. -
Reduced some info level logs to debug
-
Breaking for custom LogProcessor/Exporter authors: Changed
nameparameter from&strtoOption<&str>inevent_enabledmethod on theLogProcessorandLogExportertraits.SdkLoggerno longer passes itsscopename but instead passes the incomingnamewhen invokingevent_enabledon processors. -
Breaking for custom LogExporter authors:
shutdown()method inLogExportertrait no longer requires a mutable ref toself. If the exporter needs to mutate state, it should rely on interior mutability. 2764 -
Breaking (Affects custom Exporter/Processor authors only) Removed
opentelemetry_sdk::logs::error::{LogError, LogResult}. These were not intended to be public. If you are authoring custom processor/exporters, useopentelemetry_sdk::error::OTelSdkErrorandopentelemetry_sdk::error::OTelSdkResult. 2790 -
Breaking for custom
LogProcessorauthors: Changedset_resourceto require mutable ref.fn set_resource(&mut self, _resource: &Resource) {} -
Breaking: InMemoryExporter's return type change.
TraceResult<Vec<SpanData>>toResult<Vec<SpanData>, InMemoryExporterError>MetricResult<Vec<ResourceMetrics>>toResult<Vec<ResourceMetrics>, InMemoryExporterError>LogResult<Vec<LogDataWithResource>>toResult<Vec<LogDataWithResource>, InMemoryExporterError>
0.28.0
Released 2025-Feb-10
Note: Due to the large amount of making changes, check migration guide to 0.28 for a summary that can help majority users to quickly migrate. The changelog below is the full list of changes.
-
Update
opentelemetrydependency to 0.28. -
Update
opentelemetry-httpdependency to 0.28. -
Bump msrv to 1.75.0.
-
Bug fix: For cumulative temporality, ObservableGauge no longer export MetricPoints unless measurements were newly reported (in Observable callbacks) since last export. This bug fixes ensures ObservableGauge behaves as per OTel Spec. The bug is not addressed for other Observable instruments #2213
-
Upgrade the tracing crate used for internal logging to version 0.1.40 or later. This is necessary because the internal logging macros utilize the name field as metadata, a feature introduced in version 0.1.40. #2418
-
Feature: Introduced a new feature flag,
experimental_metrics_disable_name_validation, which disables entire Instrument Name Validation. This is an experimental feature to unblock use cases requiring currently disallowed characters (eg: Windows Perf Counters). Use caution when enabling this feature as this breaks guarantees about metric name. -
Bug fix: Empty Tracer names are retained as-is instead of replacing with "rust.opentelemetry.io/sdk/tracer" #2486
-
Update
EnvResourceDetectorto allow resource attribute values containing equal signs ("="). #2120 -
ResourceDetector.detect()no longer supports timeout option. -
Breaking Resource.get() modified to require reference to Key instead of owned. Replace
get(Key::from_static_str("key"))withget(&Key::from_static_str("key")) -
Feature: Add
ResourceBuilderfor an easy way to create newResources -
Breaking: Remove
-
Resource::{new,empty,from_detectors,new_with_defaults,from_schema_url,merge,default}. To create Resources you should only useResource::builder()orResource::builder_empty(). See #2322 for a migration guide.Example Usage:
// old Resource::default().with_attributes([ KeyValue::new("service.name", "test_service"), KeyValue::new("key", "value"), ]); // new Resource::builder() .with_service_name("test_service") .with_attribute(KeyValue::new("key", "value")) .build(); -
Breaking : #2314
- The LogRecord struct has been updated:
- All fields are now pub(crate) instead of pub.
- Getter methods have been introduced to access field values. This change
impacts custom exporter and processor developers by requiring updates to
code that directly accessed LogRecord fields. They must now use the provided
getter methods (e.g.,
log_record.event_name()instead oflog_record.event_name).
- The LogRecord struct has been updated:
-
Breaking (Affects custom metric exporter authors only)
start_timeandtimeis moved from DataPoints to aggregations (Sum, Gauge, Histogram, ExpoHistogram) see #2377 and #2411, to reduce memory. -
Breaking
start_timeis no longer optional forSumaggregation, see #2367, but is still optional forGaugeaggregation see #2389. -
SimpleLogProcessor modified to be generic over
LogExporterto avoid dynamic dispatch to invoke exporter. If you were usingwith_simple_exporterto addLogExporterwith SimpleLogProcessor, this is a transparent change. #2338 -
Breaking
opentelemetry::global::shutdown_tracer_provider()removed from the API, should now usetracer_provider.shutdown()see #2369 for a migration example. "Tracer provider" is cheaply clonable, so users are encouraged to set a clone of it as the global (ex:global::set_tracer_provider(provider.clone())), so that instrumentations and other components can obtain tracers fromglobal::tracer(). The tracer_provider must be kept around to call shutdown on it at the end of application (ex:tracer_provider.shutdown()) -
Breaking The LogExporter::export() method no longer requires a mutable reference to self.: Before:
async fn export(&mut self, _batch: LogBatch<'_>) -> LogResult<()>After:async fn export(&self, _batch: LogBatch<'_>) -> LogResult<()>Custom exporters will need to internally synchronize any mutable state, if applicable. -
Breaking Removed the following deprecated struct:
- logs::LogData - Previously deprecated in version 0.27.1 Migration Guidance: This structure is no longer utilized within the SDK, and users should not have dependencies on it.
-
Breaking Removed the following deprecated methods:
Logger::provider(): Previously deprecated in version 0.27.1Logger::instrumentation_scope(): Previously deprecated in version 0.27.1. Migration Guidance: - These methods were intended for log appender authors. Keep the clone of the provider handle, instead of depending on above methods.
-
Rename
opentelemetry_sdk::logs::Buildertoopentelemetry_sdk::logs::LoggerProviderBuilder. -
Rename
opentelemetry_sdk::trace::Buildertoopentelemetry_sdk::trace::SdkTracerProviderBuilder. -
Redesigned PeriodicReader, BatchSpanProcessor, BatchLogProcessor to no longer require an async runtime. They create its own background thread instead. When pairing with OTLP,
grpc-tonicorreqwest-blocking-clientare the only supported features (hyper,reqwestare not supported) These are now enabled by default and can be migrated to by removing the extrart:Runtimeargument as shown below.PeriodicReader::builder(exporter,runtime::Tokio).build();toPeriodicReader::builder(exporter).build();.with_batch_exporter(exporter, runtime::Tokio)to.with_batch_exporter(exporter)
The new implementation has following limitations:
- Does not work if your application cannot spawn new Thread.
- Does not support
hyper,reqwestHTTP Clients - Does not support multiple concurrent exports (
with_max_concurrent_exportsis not supported). This existed only for traces.
If this applies to you, you can get the old behavior back by following steps below:
- Enable one or more of the feature flag from below
experimental_metrics_periodicreader_with_async_runtimeexperimental_logs_batch_log_processor_with_async_runtimeexperimental_trace_batch_span_processor_with_async_runtime - Use updated namespace; i.e
periodic_reader_with_async_runtime::PeriodicReader,log_processor_with_async_runtime::BatchLogProcessorandspan_processor_with_async_runtime::BatchSpanProcessor - Continue using existing features flags
rt-tokio,rt-tokio-current-thread, orrt-async-std.
As part of the above redesign of PeriodicReader and BatchProcessors, these components no longer enforce timeout themselves and instead relies on Exporters to enforce own timeouts. In other words, the following are no longer supported.
with_max_export_timeout,with_timeoutmethods onBatchConfigBuilder,PeriodicReaderBuilderOTEL_BLRP_EXPORT_TIMEOUT,OTEL_BSP_EXPORT_TIMEOUT
Users are advised to configure timeout on the Exporters itself. For example, in the OTLP exporter, the export timeout can be configured using:
- Environment variables
OTEL_EXPORTER_OTLP_TIMEOUTOTEL_EXPORTER_OTLP_LOGS_TIMEOUT,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT
- The opentelemetry_otlp API, via
.with_tonic().with_timeout()or.with_http().with_timeout().
-
Breaking Introduced
experimental_async_runtimefeature for runtime-specific traits.- Runtime-specific features (
rt-tokio,rt-tokio-current-thread, andrt-async-std) now depend on theexperimental_async_runtimefeature. - For most users, no action is required. Enabling runtime features such as
rt-tokio,rt-tokio-current-thread, orrt-async-stdwill automatically enable theexperimental_async_runtimefeature. - If you're implementing a custom runtime, you must explicitly enable the
experimental_async_runtime
feature in your Cargo.toml and implement the requiredRuntime` traits.
- Runtime-specific features (
-
Removed Metrics Cardinality Limit feature. This was originally introduced in #1066 with a hardcoded limit of 2000 and no ability to change it. This feature will be re-introduced in a future date, along with the ability to change the cardinality limit.
-
Breaking Removed unused
opentelemetry_sdk::Errorenum. -
Breaking (Affects custom Exporter authors only) Moved
ExportErrortrait fromopentelemetry::export::ExportErrortoopentelemetry_sdk::ExportError -
Breaking (Affects custom SpanExporter, SpanProcessor authors only): Rename namespaces for Span exporter structs/traits before:
opentelemetry_sdk::export::spans::{ExportResult, SpanData, SpanExporter};now:opentelemetry_sdk::trace::{ExportResult, SpanData, SpanExporter}; -
Breaking (Affects custom LogExporter, LogProcessor authors only): Rename namespaces for Log exporter structs/traits. before:
opentelemetry_sdk::export::logs::{ExportResult, LogBatch, LogExporter};now:opentelemetry_sdk::logs::{ExportResult, LogBatch, LogExporter}; -
Breaking
opentelemetry_sdk::LogRecord::default()method is removed. The only way to create log record outside opentelemetry_sdk crate is usingLogger::create_log_record()method. -
Breaking: Rename namespaces for InMemoryExporters. (The module is still under "testing" feature flag) before:
opentelemetry_sdk::testing::logs::{InMemoryLogExporter, InMemoryLogExporterBuilder}; opentelemetry_sdk::testing::trace::{InMemorySpanExporter, InMemorySpanExporterBuilder}; opentelemetry_sdk::testing::metrics::{InMemoryMetricExporter, InMemoryMetricExporterBuilder};now:
opentelemetry_sdk::logs::{InMemoryLogExporter, InMemoryLogExporterBuilder}; opentelemetry_sdk::trace::{InMemorySpanExporter, InMemorySpanExporterBuilder}; opentelemetry_sdk::metrics::{InMemoryMetricExporter, InMemoryMetricExporterBuilder}; -
Breaking Renamed
LoggerProvider,LoggerandLogRecordtoSdkLoggerProvider,SdkLoggerandSdkLogRecordrespectively to avoid name collision with public API types. #2612 -
Breaking Renamed
TracerProviderandTracertoSdkTracerProviderandSdkTracerto avoid name collision with public API types.Traceris still type-aliased toSdkTracerto keep back-compat with tracing-opentelemetry. #2614 -
Breaking Providers, Exporters, Processors, and Readers are modified to use a unified Result type for
export(),force_flush(), andshutdown()methods. All these methods now useOTelSdkResultas their return type. Following PRs show the exact changes: 2613 2625 2604 2606 2573
0.27.1
Released 2024-Nov-27
-
DEPRECATED:
-
trace::Configmethods are moving ontoTracerProviderBuilder to be consistent with other signals. See https://github.com/open-telemetry/opentelemetry-rust/pull/2303 for migration guide.trace::Configis scheduled to be removed from public API inv0.28.0. example:// old let tracer_provider: TracerProvider = TracerProvider::builder() .with_config(Config::default().with_resource(Resource::empty())) .build(); // new let tracer_provider: TracerProvider = TracerProvider::builder() .with_resource(Resource::empty()) .build(); -
logs::LogDatastruct is deprecated, and scheduled to be removed from public API inv0.28.0. -
Bug fix: Empty Meter names are retained as-is instead of replacing with "rust.opentelemetry.io/sdk/meter" #2334
-
Bug fix: Empty Logger names are retained as-is instead of replacing with "rust.opentelemetry.io/sdk/logger" #2316
-
Logger::provider: This method is deprecated as of version0.27.1. To be removed in0.28.0. -
Logger::instrumentation_scope: This method is deprecated as of version0.27.1. To be removed in0.28.0Migration Guidance: - These methods are intended for log appenders. Keep the clone of the provider handle, instead of depending on above methods. -
Bug Fix: Validates the
with_boundariesbucket boundaries used in Histograms. The boundaries provided by the user must not containf64::NAN,f64::INFINITYorf64::NEG_INFINITYand must be sorted in strictly increasing order, and contain no duplicates. Instruments will not record measurements if the boundaries are invalid. #2351
-
-
Added
with_periodic_exportermethod toMeterProviderBuilder, allowing users to easily attach an exporter with a PeriodicReader for automatic metric export. Retained with_reader() for advanced use cases where a custom MetricReader configuration is needed. 2597 Example Usage:SdkMeterProvider::builder() .with_periodic_exporter(exporter) .build();Using a custom PeriodicReader (advanced use case):
let reader = PeriodicReader::builder(exporter).build(); SdkMeterProvider::builder() .with_reader(reader) .build();
0.27.0
Released 2024-Nov-11
-
Update
opentelemetrydependency version to 0.27 -
Update
opentelemetry-httpdependency version to 0.27 -
Bump MSRV to 1.70 #2179
-
Implement
LogRecord::set_trace_contextforLogRecord. Respect any trace context set on aLogRecordwhen emitting through aLogger. -
Improved
LoggerProvidershutdown handling to prevent redundant shutdown calls whendropis invoked. #2195 -
When creating new metric instruments by calling
build(), SDK would return a no-op instrument if the validation fails (eg: Invalid metric name). #2166 -
BREAKING for Metrics users:
- Replaced
- (#2217): Removed
{Delta,Cumulative}TemporalitySelector::new()in favor of directly usingTemporalityenum to simplify the configuration of MetricsExporterBuilder with different temporalities.
- (#2217): Removed
- Renamed
-
(#2232): The
initmethod used to create instruments has been renamed tobuild. Before:let counter = meter.u64_counter("my_counter").init();Now:
let counter = meter.u64_counter("my_counter").build(); -
(#2255): de-pluralize Metric types.
PushMetricsExporter->PushMetricExporterInMemoryMetricsExporter->InMemoryMetricExporterInMemoryMetricsExporterBuilder->InMemoryMetricExporterBuilder
-
- Replaced
-
BREAKING: #2220
- Removed
InstrumentationLibraryre-export and itsScopealias, useopentelemetry::InstrumentationLibraryinstead. - Unified builders across signals
- Removed deprecated
LoggerProvider::versioned_logger,TracerProvider::versioned_tracer - Removed
MeterProvider::versioned_meter - Replaced these methods with
LoggerProvider::logger_with_scope,TracerProvider::logger_with_scope,MeterProvider::meter_with_scope
- Removed deprecated
- Removed
-
- Pin url version to
2.5.2. The higher version breaks the build refer: servo/rust-url#992. Theurlcrate is used whenjaeger_remote_samplerfeature is enabled.
- Pin url version to
-
BREAKING: #2266
-
Moved
ExportErrortrait fromopentelemetry::ExportErrortoopentelemetry_sdk::export::ExportError -
Moved
LogErrorenum fromopentelemetry::logs::LogErrortoopentelemetry_sdk::logs::LogError -
Moved
LogResulttype alias fromopentelemetry::logs::LogResulttoopentelemetry_sdk::logs::LogResult -
Renamed
opentelemetry::metrics::Resulttype alias toopentelemetry::metrics::MetricResult -
Renamed
opentelemetry::metrics::MetricsErrorenum toopentelemetry::metrics::MetricError -
Moved
MetricErrorenum fromopentelemetry::metrics::MetricErrortoopentelemetry_sdk::metrics::MetricError -
Moved
MetricResulttype alias fromopentelemetry::metrics::MetricResulttoopentelemetry_sdk::metrics::MetricResult -
Users calling public APIs that return these constructs (e.g, LoggerProvider::shutdown(), MeterProvider::force_flush()) should now import them from the SDK instead of the API.
-
Developers creating custom exporters should ensure they import these constructs from the SDK, not the API.
-
2291 Rename
logs_level_enabled flagtospec_unstable_logs_enabled. Please enable this updated flag if the feature is needed. This flag will be removed once the feature is stabilized in the specifications.
-
-
BREAKING:
Temporalityenum moved fromopentelemetry_sdk::metrics::data::Temporalitytoopentelemetry_sdk::metrics::Temporality. -
BREAKING:
Viewsare now an opt-in ONLY feature. Please include the featurespec_unstable_metrics_viewsto enableViews. It will be stabilized post 1.0 stable release of the SDK. #2295 -
Added a new
PeriodicReaderimplementation (PeriodicReaderWithOwnThread) that does not rely on an async runtime, and instead creates own Thread. This is under feature flag "experimental_metrics_periodic_reader_no_runtime". The functionality maybe moved into existing PeriodReader or even removed in the future. As of today, this cannot be used as-is with OTLP Metric Exporter or any exporter that require an async runtime.
v0.26.0
Released 2024-Sep-30
-
Update
opentelemetrydependency version to 0.26 -
BREAKING Public API changes:
-
Update
async-stddependency version to 1.13 -
Breaking - Remove support for
MetricProducerwhich allowed metrics from external sources to be sent through OpenTelemetry. #2105 -
Feature:
SimpleSpanProcessor::newis now public #2119 -
For Delta Temporality, exporters are not invoked unless there were new measurements since the last collect/export. #2153
-
MeterProvidermodified to not invoke shutdown onDrop, if user has already calledshutdown(). #2156
v0.25.0
-
Update
opentelemetrydependency version to 0.25 -
Starting with this version, this crate will align with
opentelemetrycrate on major,minor versions. -
Perf improvements for all metric instruments (except
ExponentialHistogram) that led to faster metric updates and higher throughput #1740:- Zero allocations when recording measurements: Once a measurement for a given attribute combination is reported, the SDK would not allocate additional memory for subsequent measurements reported for the same combination.
- Minimized thread contention: Threads reporting measurements for the same instrument no longer contest for the same
Mutex. The internal aggregation data structure now uses a combination ofRwLockand atomics. Consequently, threads reporting measurements now only have to acquire a read lock. - Lock-free floating point updates: Measurements reported for
f64based metrics no longer need to acquire aMutexto update thef64value. They use a CAS-based loop instead.
-
opentelemetry_sdk::logs::record::LogRecordandopentelemetry_sdk::logs::record::TraceContextderive fromPartialEqto facilitate Unit Testing. -
Fixed an issue causing a panic during shutdown when using the
TokioCurrentThreadin BatchExportProcessor for traces and logs. #1964 #1973 -
Fix BatchExportProcessor for traces and logs to trigger first export at the first interval instead of doing it right away. #1970 #1973
- Breaking #1985
Hide LogRecord attributes Implementation Details from processors and exporters.
The custom exporters and processors can't directly access the
LogData::LogRecord::attributes, as these are private to opentelemetry-sdk. Instead, they would now use LogRecord::attributes_iter() method to access them.
- Breaking #1985
Hide LogRecord attributes Implementation Details from processors and exporters.
The custom exporters and processors can't directly access the
-
Fixed various Metric aggregation bug related to ObservableCounter,UpDownCounter including #1517. #2004
-
Fixed a bug related to cumulative aggregation of
Gaugemeasurements. #1975. #2021 -
Provide default implementation for
event_enabledmethod inLogProcessortrait that returnstruealways. -
-
The Exporter::export() interface is modified as below: Previous Signature:
async fn export<'a>(&mut self, batch: Vec<Cow<'a, LogData>>) -> LogResult<()>;Updated Signature:
async fn export(&mut self, batch: LogBatch<'_>) -> LogResult<()>;where
pub struct LogBatch<'a> { data: &'a [(&'a LogRecord, &'a InstrumentationLibrary)], }This change enhances performance by reducing unnecessary heap allocations and maintains object safety, allowing for more efficient handling of log records. It also simplifies the processing required by exporters. Exporters no longer need to determine if the LogData is borrowed or owned, as they now work directly with references. As a result, exporters must explicitly create a copy of LogRecord and/or InstrumentationLibrary when needed, as the new interface only provides references to these structures.
-
v0.24.1
- Add hidden method to support tracing-opentelemetry
v0.24.0
-
Add "metrics", "logs" to default features. With this, default feature list is "trace", "metrics" and "logs".
-
Add
with_resourceon Builder for LoggerProvider, replacing thewith_configmethod. Instead of using.with_config(Config::default().with_resource(RESOURCE::default()))users must now use.with_resource(RESOURCE::default())to configure Resource on logger provider. -
Removed dependency on
ordered-float. -
Removed
XrayIdGenerator, which was marked deprecated since 0.21.3. Useopentelemetry-aws, version 0.10.0 or newer. -
Performance Improvement - Counter/UpDownCounter instruments internally use
RwLockinstead ofMutexto reduce contention -
Breaking 1726 Update
LogProcessor::emit()method to take mutable reference to LogData. This is breaking change for LogProcessor developers. If the processor needs to invoke the exporter asynchronously, it should clone the data to ensure it can be safely processed without lifetime issues. Any changes made to the log data before cloning in this method will be reflected in the next log processor in the chain, as well as to the exporter. -
Breaking 1726 Update
LogExporter::export()method to accept a batch of log data, which can be either a reference or ownedLogData. If the exporter needs to process the log data asynchronously, it should clone the log data to ensure it can be safely processed without lifetime issues. -
Clean up public methods in SDK.
- [
TracerProvider::span_processors] and [TracerProvider::config] was removed as it's not part of the spec. - Added
non_exhaustiveannotation to [trace::Config]. Marked [config] as deprecated since it's only a wrapper forConfig::default - Removed [
Tracer::tracer_provider] and [Tracer::instrument_libraries] as it's not part of the spec.
- [
-
Breaking #1830 [Traces SDK] Improves performance by sending Resource information to processors (and exporters) once, instead of sending with every log. If you are an author of Processor, Exporter, the following are BREAKING changes.
- Implement
set_resourcemethod in your custom SpanProcessor, which invokes exporter'sset_resource. - Implement
set_resourcemethod in your custom SpanExporter. This method should save the resource object in original or serialized format, to be merged with every span event during export. SpanDatadoesn't have the resource attributes. TheSpanExporter::export()method needs to merge it with the earlier preserved resource before export.
- Implement
-
Breaking 1836
SpanProcessor::shutdownnow takes an immutable reference to self. Any reference can call shutdown on the processor. After the first call toshutdownthe processor will not process any new spans. -
Breaking [1850] (https://github.com/open-telemetry/opentelemetry-rust/pull/1850)
LoggerProvider::log_processors()andLoggerProvider::resource()are not public methods anymore. They are only used within theopentelemetry-sdkcrate. -
1857 Fixed an issue in Metrics SDK which prevented export errors from being send to global error handler. With the fix, errors occurring during export like OTLP Endpoint unresponsive shows up in stderr by default.
-
1869 Added a
targetfield toLogRecordstructure, populated byopentelemetry-appender-tracingandopentelemetry-appender-logappenders.
async fn export<'a>(&mut self, batch: Vec<Cow<'a, LogData>>) -> LogResult<()>;
where LogRecord within LogData now includes:
LogData {
LogRecord {
event_name,
target, // newly added
timestamp,
observed_timestamp,
trace_context,
trace_context,
severity_number,
body,
attributes
}
Instrumentation {
name,
version,
schema_url,
version
}
}
The LogRecord::target field contains the actual target/component emitting the logs, while the Instrumentation::name contains the name of the OpenTelemetry appender.
- Breaking #1674 Update to
httpv1 types (viaopentelemetry-httpupdate) - Update
opentelemetrydependency version to 0.24 - Update
opentelemetry-httpdependency version to 0.13
v0.23.0
- Fix SimpleSpanProcessor to be consistent with log counterpart. Also removed dependency on crossbeam-channel. 1612
- #1422 Fix metrics aggregation bug when using Views to drop attributes.
- #1766 Fix Metrics PeriodicReader to trigger first collect/export at the first interval instead of doing it right away.
- #1623 Add Drop implementation for SdkMeterProvider,
which shuts down
MetricReaders, thereby allowing metrics still in memory to be flushed out. - Breaking #1624 Remove
OsResourceDetectorandProcessResourceDetectorresource detectors, use theopentelemetry-resource-detectorinstead. - #1636 [Logs SDK] Improves performance by sending
Resource information to processors (and exporters) once, instead of sending with every log. If you are an author
of Processor, Exporter, the following are BREAKING changes.
- Implement
set_resourcemethod in your custom LogProcessor, which invokes exporter'sset_resource. - Implement
set_resourcemethod in your custom LogExporter. This method should save the resource object in original or serialized format, to be merged with every log event during export. LogDatadoesn't have the resource attributes. TheLogExporter::export()method needs to merge it with the earlier preserved resource before export.
- Implement
- Baggage propagation error will be reported to global error handler #1640
- Improves
shutdownbehavior ofLoggerProviderandLogProcessor#1643.shutdowncan be called by any clone of theLoggerProviderwithout the need of waiting on allLoggerdrops. Thus,try_shutdownhas been removed.shutdownmethods inLoggerProviderandLogProcessornow takes a immutable reference- After
shutdown,LoggerProviderwill return noopLogger - After
shutdown,LogProcessorwill not process any new logs
- Moving LogRecord implementation to the SDK. 1702.
- Relocated
LogRecordstruct to SDK, as an implementation for the trait in the API.
- Relocated
- Breaking #1729
- Update the return type of
TracerProvider.span_processors()from&Vec<Box<dyn SpanProcessor>>to&[Box<dyn SpanProcessor>]. - Update the return type of
LoggerProvider.log_processors()from&Vec<Box<dyn LogProcessor>>to&[Box<dyn LogProcessor>].
- Update the return type of
- Update
opentelemetrydependency version to 0.23 - Update
opentelemetry-httpdependency version to 0.12 - Breaking #1750
- Update the return type of
LoggerProvider.shutdown()fromVec<LogResult<()>>toLogResult<()>.
- Update the return type of
v0.22.1
Fixed
- #1576 Fix Span kind is always set to "internal".
v0.22.0
Deprecated
- XrayIdGenerator in the opentelemetry-sdk has been deprecated and moved to version 0.10.0 of the opentelemetry-aws crate.
Added
-
#1410 Add experimental synchronous gauge
-
#1471 Configure batch log record processor via
OTEL_BLRP_*environment variables and viaOtlpLogPipeline::with_batch_config -
#1503 Make the documentation for In-Memory exporters visible.
-
#1526 Performance Improvement : Creating Spans and LogRecords are now faster, by avoiding expensive cloning of
Resourcefor every Span/LogRecord.
Changed
-
Breaking #1313 #1350 Changes how Span links/events are stored to achieve performance gains. See below for details:
Behavior Change: When enforcing
max_links_per_span,max_events_per_spanfromSpanLimits, links/events are kept in the first-come order. The previous "eviction" based approach is no longer performed.Breaking Change Affecting Exporter authors:
SpanDatanow storeslinksasSpanLinksinstead ofEvictedQueuewhereSpanLinksis a struct with aVecof links anddropped_count.SpanDatanow storeseventsasSpanEventsinstead ofEvictedQueuewhereSpanEventsis a struct with aVecof events anddropped_count. -
Breaking Remove
TextMapCompositePropagator#1373. UseTextMapCompositePropagatorin opentelemetry API. -
#1375 Fix metric collections during PeriodicReader shutdown
-
Breaking #1480 Remove fine grained
BatchConfigconfigurations fromBatchLogProcessorBuilderandBatchSpanProcessorBuilder. UseBatchConfigBuilderto construct aBatchConfiginstance and pass it usingBatchLogProcessorBuilder::with_batch_configorBatchSpanProcessorBuilder::with_batch_config. -
Breaking #1480 Remove mutating functions from
BatchConfig, useBatchConfigBuilderto construct aBatchConfiginstance. -
Breaking #1495 Remove Batch LogRecord&Span Processor configuration via non-standard environment variables. Use the following table to migrate from the no longer supported non-standard environment variables to the standard ones.
| No longer supported | Standard equivalent |
|---|---|
| OTEL_BLRP_SCHEDULE_DELAY_MILLIS | OTEL_BLRP_SCHEDULE_DELAY |
| OTEL_BLRP_EXPORT_TIMEOUT_MILLIS | OTEL_BLRP_EXPORT_TIMEOUT |
| OTEL_BSP_SCHEDULE_DELAY_MILLIS | OTEL_BSP_SCHEDULE_DELAY |
| OTEL_BSP_EXPORT_TIMEOUT_MILLIS | OTEL_BSP_EXPORT_TIMEOUT |
-
Breaking #1455 Make the LoggerProvider Owned
Loggernow takes an Owned Logger instead of aWeak<LoggerProviderInner>LoggerProviderInneris no longerpub (crate)Logger.provider()now returns&LoggerProviderinstead of anOption<LoggerProvider>
-
#1519 Performance improvements when calling
Counter::add()andUpDownCounter::add()with an empty set of attributes (e.g.counter.Add(5, &[])) -
Breaking Renamed
MeterProviderandMetertoSdkMeterProviderandSdkMeterrespectively to avoid name collision with public API types. #1328
Fixed
- #1481 Fix error message caused by race condition when using PeriodicReader
v0.21.2
Fixed
- Fix delta aggregation metric reuse. #1434
- Fix
max_scalevalidation of exponential histogram configuration. #1452
v0.21.1
Fixed
- Fix metric export corruption if gauges have not received a last value. #1363
- Return consistent
Meterfor a given scope fromMeterProvider. #1351
v0.21.0
Added
- Log warning if two instruments have the same name with different #1266 casing
- Log warning if view is created with empty criteria #1266
- Add exponential histogram support #1267
- Add
opentelemetry::sdk::logs::config()for parity withopentelemetry::sdk::trace::config()#1197
Changed
-
Bump MSRV to 1.65 #1318
-
Default Resource (the one used when no other Resource is explicitly provided) now includes
TelemetryResourceDetector, populating "telemetry.sdk.*" attributes. #1194. -
Bump MSRV to 1.64 #1203
-
Add unit/doc tests for MeterProvider #1220
-
Changed dependency from
opentelemetry_apitoopentelemetryas the latter is now the API crate. #1226 -
Add in memory span exporter #1216
-
Add in memory log exporter #1231
-
Add
Syncbound to theSpanExporterandLogExportertraits #1240 -
Move
MetricsProducerconfig to builders to match other config #1266 -
Return error earlier if readers are shut down #1266
-
Add
/to valid characters for instrument names #1269 -
Increase instrument name maximum length from 63 to 255 #1269
-
Updated crate documentation and examples. #1256
-
Replace regex with glob #1301
-
Breaking #1293 makes few breaking changes with respect to how Span attributes are stored to achieve performance gains. See below for details:
Behavior Change:
SDK will no longer perform de-duplication of Span attribute Keys. Please share feedback here, if you are affected.
Breaking Change Affecting Exporter authors:
SpanDatanow storesattributesasVec<KeyValue>instead ofEvictedHashMap.SpanDatanow exposedropped_attributes_countas a separate field.Breaking Change Affecting Sampler authors:
should_samplechangesattributesfromOrderMap<Key, Value>toVec<KeyValue>. -
Breaking Move type argument from
RuntimeChannel<T>to associated types #1314
Removed
- Remove context from Metric force_flush #1245
- Remove
logs::BatchMessageandtrace::BatchMessagetypes #1314
Fixed
- Fix metric instrument name validation to include
_#1274
v0.20.0
Added
- Implement cardinality limits for metric streams #1066.
- Propagate shutdown calls from
PeriodicReaderto metrics exporter #1138. - Add in memory metrics exporter #1017
Changed
- New metrics SDK #1000
- Use
Cow<'static, str>instead of&'static str#1018 - Unify trace and logs runtime extensions traits. #1067
Changed
- Fix EvictedQueue bug when capacity is set to 0 #1151.
Removed
- Samplers no longer has access to
InstrumentationLibraryas one of parameters toshould_sample. #1041. - Synchronous instruments no longer accepts
Contextwhile reporting measurements. #1076. - Don't use CARGO_BIN_NAME for service name #1150
Fixed
- Wait for exports on the simple span processor's ForceFlush #1030
v0.19.0
Added
- Add instrument validation to
InstrumentBuilder#884. - Add
TelemetryResourceDetector#899. - Add support for instrumentation scope attributes #1021.
Changed
- Update to
opentelemetry_apiv0.19. - Update to
opentelemetry_httpv0.8. - Bump MSRV to 1.57 #953.
- Fix doc in
ShouldSampletrait #951 - Only run
ParentBaseddelegate sampler when there is no parent #948. - Improve
SdkProvidedResourceDetector's doc #964. - Update dependencies and bump MSRV to 1.60 #969.
- Use CARGO_BIN_NAME as default service name #991.
Removed
- Remove
in_memorysettings #946.
main
Changed
- Update the Number in the SDK API to support min and max. #989
v0.18.0
Changed
- BREAKING
structs which implementShouldSamplea.k.a Custom Samplers must now implementClone. This enables (#833) - SDK split from
opentelemetrycrate