NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #639 most downloaded on crates.io
Exporter for the OpenTelemetry Collector
Last release 19 days ago
18 Sep 2026
Ships fairly regularly
a new release about every 2 months
Nearly every release is documented
notes for 26 of 27 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
27 releases · first in 2020
One column per quarter.
See the 0.33.0 release notes and migration guidance .
See the 0.33.0 release notes and migration guidance.
The OTLP exporters for Logs and Metrics remain release candidates. We plan to declare them stable in 0.33.1 after approximately two weeks of validation, provided no issues requiring breaking API changes arise. The Logs and Metrics API and SDK remain stable; Distributed Tracing remains pre-stable.
First release of opentelemetry-propagator-b3, providing B3 trace context propagation for OpenTelemetry Rust.
Based on the B3 implementation in opentelemetry-zipkin, with the existing API and behavior. B3 users can migrate their dependency and imports to opentelemetry_propagator_b3::{B3Encoding, Propagator}.
Released 2026-Sep-18
Exporter builder usage and environment configuration are unchanged.
Breaking for callers parsing compression strings: Compression::from_str
(including .parse::<Compression>()) now returns the opaque ParseConfigError
instead of ExporterBuildError. Update explicit result types and error handling
that expects ExporterBuildError::UnsupportedCompressionAlgorithm. The new error
implements Display and std::error::Error; its message is for diagnostics.
Accepted strings and parsing behavior are unchanged.
// Before:
let result: Result<Compression, ExporterBuildError> = value.parse();
// After:
let result: Result<Compression, ParseConfigError> = value.parse();
if let Err(error) = result {
eprintln!("invalid compression configuration: {error}");
}
Interpret protocol, compression, and metrics temporality environment values
case-insensitively. Treat empty values as unset, and warn and ignore invalid,
non-Unicode, or feature-unavailable enum values so resolution can continue
to the next environment variable or default. Compression none explicitly
disables compression, including when a generic compression value is set.
Programmatic configuration remains strict.
.with_retry_policy(RetryPolicy::disabled()) to disable retries,
or provide a custom RetryPolicy to change the behavior.Cargo.toml enables experimental-grpc-retry or
experimental-http-retry, remove those feature flags. No migration action is
required for users who did not enable them.
#3621retry and retry_classification modules crate-private,
removing their retry engine, error type, and protocol classifiers from the
public API. RetryPolicy remains available from the crate root with private
fields and fluent configuration methods. Replace imports from
opentelemetry_otlp::retry with opentelemetry_otlp::RetryPolicy, and replace
struct literals with its with_* methods.
#3672The following fixes apply to retry behavior that was experimental before this release:
Retry-After on 503 responses.RetryInfo delays returned with Unavailable responses.RetryInfo and
Retry-After delays when subsequent export attempts fail.Exporter compression configuration and behavior are unchanged; users of
.with_compression(...) need no changes. Breaking only for direct conversion
callers: removed TryFrom<Compression> for
tonic::codec::CompressionEncoding. Code explicitly converting between these
enums must map the variants itself.
Return an exporter build error when construction of a built-in reqwest HTTP client fails instead of silently falling back to a client without the exporter-configured timeout. Failure to spawn the blocking client's setup thread, or a panic in that thread, is also returned instead of panicking.
Breaking Removed Default from the TonicExporterBuilderSet and
HttpExporterBuilderSet typestate markers. This also removes Default from
the transport-selected exporter builders (e.g.
SpanExporterBuilder<TonicExporterBuilderSet>). Use the intended builder
flow instead:
// Before (no longer compiles):
let exporter = SpanExporterBuilder::<TonicExporterBuilderSet>::default().build()?;
// After (use the builder entry point):
let exporter = SpanExporter::builder().with_tonic().build()?;
Also removed the unused #[doc(hidden)] NoExporterConfig type.
Breaking Mark Protocol and Compression as non-exhaustive so new OTLP
protocols, encodings, and compression algorithms can be added without
breaking downstream users. External exhaustive matches must add a wildcard
arm. Constructing existing variants and passing them to exporter builders is
unchanged.
let protocol_name = match protocol {
Protocol::Grpc => "grpc",
Protocol::HttpBinary => "http/protobuf",
Protocol::HttpJson => "http/json",
_ => "unknown", // Required because Protocol is non-exhaustive.
};
Breaking Make Protocol::from_env() crate-private. Exporter builders
already resolve OTEL_EXPORTER_OTLP_PROTOCOL when built; applications that
need to inspect the raw environment setting should read the variable
directly.
Breaking Remove OTEL_EXPORTER_OTLP_ENDPOINT_DEFAULT, which always held
the HTTP default (http://localhost:4318) despite gRPC using
http://localhost:4317. Omit .with_endpoint(...) to let the selected
transport use its correct default, or provide the appropriate URL explicitly.
#3690
Breaking Restrict MetricExporterBuilder::with_http() and with_tonic()
to builders where no transport has been selected, matching the span and log
exporter builders. Select a transport once; with_temporality() remains
available before or after transport selection.
Breaking Remove the public HttpExporterBuilder and
TonicExporterBuilder transport-first APIs. Configure transports through the
signal builders instead:
HttpExporterBuilder::default() with the corresponding signal
exporter builder followed by .with_http(), then replace
.build_span_exporter() or .build_log_exporter() with .build()..build_metrics_exporter(temporality) with
.with_temporality(temporality).build().TonicExporterBuilder::default() with the corresponding signal
exporter builder followed by .with_tonic().
Transport-specific configuration methods remain available after
.with_http() or .with_tonic().Breaking Removed the deprecated tls feature alias. Replace tls with
tls-ring, or select tls-aws-lc or tls-provider-agnostic explicitly.
Exporter builder usage is unchanged. Breaking for code matching or constructing
removed error variants: Simplified ExporterBuildError to the exhaustive
InvalidConfiguration(String) and InternalFailure(String) variants.
The enum is no longer marked #[non_exhaustive].
Configuration errors such as invalid endpoints, missing HTTP clients,
transport/protocol mismatches, and missing compression features now use
InvalidConfiguration. Replace implementation-specific, non-exhaustive
matches such as:
match error {
ExporterBuildError::InvalidUri(_, _)
| ExporterBuildError::InvalidConfig { .. }
| ExporterBuildError::NoHttpClient => {
eprintln!("fix the exporter configuration");
}
ExporterBuildError::InternalFailure(message) => {
eprintln!("exporter initialization failed: {message}");
}
_ => {}
}
with an exhaustive match over the two stable categories:
match error {
ExporterBuildError::InvalidConfiguration(message) => {
eprintln!("fix the exporter configuration: {message}");
}
ExporterBuildError::InternalFailure(message) => {
eprintln!("exporter initialization failed: {message}");
}
}
Code that propagates build errors with ? without inspecting their variants
needs no changes.
Tonic endpoint errors identify the originating environment variable when
validating the URI or reporting endpoint-related TLS setup failures.
#3691
Return an exporter build error for invalid OTLP/HTTP endpoint environment variables instead of silently falling back to another endpoint or localhost. Empty endpoint environment variables are now treated as unset.
Return an exporter build error for invalid OTLP/gRPC endpoint environment variables instead of silently falling back to another endpoint or localhost. Empty endpoint environment variables are now treated as unset.
Add WithHttpConfig::with_max_request_body_size to configure the HTTP request
body limit. OTLP/HTTP request bodies are now limited to 64 MiB by default, before and
after compression; oversized requests are discarded without being sent or
retried.
Breaking Seal WithExportConfig, WithHttpConfig, and
WithTonicConfig. These traits remain public for calling configuration
methods on OTLP builders, but can no longer be implemented for external
types.
Add support for INSECURE environment variables for gRPC (env-var-only, no builder method, per spec):
OTEL_EXPORTER_OTLP_INSECURE (generic), OTEL_EXPORTER_OTLP_TRACES_INSECURE,
OTEL_EXPORTER_OTLP_METRICS_INSECURE, OTEL_EXPORTER_OTLP_LOGS_INSECURE.
Per the spec, these only apply to gRPC connections. When an endpoint has no explicit scheme,
INSECURE=true uses http://, INSECURE=false (default) uses https:// with auto-TLS.
Breaking: Schemeless endpoints (e.g., collector.example.com:4317) now default to https://
instead of being passed as-is. Set OTEL_EXPORTER_OTLP_INSECURE=true for plaintext connections.
Endpoints with an explicit scheme (e.g., http://, https://, unix://) are unaffected.
#774
#984
Breaking Removed the serialize feature flag and its implicit serde
dependency. This feature gated Serialize/Deserialize derives on
Protocol and Compression, but the derived representations were incorrect
(Rust variant names instead of spec values) and the feature only covered
these two enums. The equivalent feature was removed from the core
opentelemetry crate in 2022.
Migration: Remove serialize (and serde, if listed) from your feature
list. If these values are part of serialisable app config, define a local
config enum or wrapper and convert it to Protocol or Compression when
building the exporter.
#3711
Breaking Removed reqwest-rustls-webpki-roots feature. The webpki-roots cargo feature was
removed from reqwest in v0.13.0, making this feature broken for anyone resolving reqwest >= 0.13.0.
Migration: Use reqwest-rustls instead (now correctly uses reqwest/rustls with platform native
trust roots). If you specifically need Mozilla's embedded CA bundle, construct a custom client:
let root_store = rustls::RootCertStore::from_iter(
webpki_roots::TLS_SERVER_ROOTS.iter().cloned(),
);
let tls_config = rustls::ClientConfig::builder()
.with_root_certificates(root_store)
.with_no_client_auth();
let client = reqwest::Client::builder()
.tls_backend_preconfigured(tls_config)
.build()?;
exporter_builder.with_http_client(client)
Allow to provide http client wrapped in Arc when configuring HTTP exporter. 3468
"opentelemetry-otlp 0.32.0 release."
"opentelemetry-otlp 0.32.0 release."
Released 2026-May-08
tls-provider-agnostic feature flag for environments that require a custom crypto backend (e.g., OpenSSL for FIPS compliance). Enables TLS code paths without bundling ring or aws-lc-rs.build() directly on SpanExporterBuilder, MetricExporterBuilder, and LogExporterBuilder
(before selecting a transport), which auto-selects the transport based on the
OTEL_EXPORTER_OTLP_PROTOCOL environment variable or enabled features.
#3394ExportConfig, HasExportConfig, with_export_config(), HasTonicConfig, HasHttpConfig, TonicConfig, and HttpConfig from public API.
Use the public WithExportConfig, WithTonicConfig, and WithHttpConfig trait methods instead, which remain unchanged.https:// endpoint is configured but no TLS feature (tls-ring or tls-aws-lc) is enabled, instead of
silently sending unencrypted traffic. When a TLS feature is enabled and an https:// endpoint is used without
an explicit .with_tls_config(), a default ClientTlsConfig is automatically applied.
#3182grpc-tonic
OTLP export fails due to a local misconfiguration. When the returned
tonic::Status wraps a local transport error (invalid URL, connect failure,
DNS), its source chain (e.g., "transport error: invalid URI") is appended
to the returned error so SDK processors surface it at ERROR without
requiring DEBUG logging. Server-returned gRPC status messages remain
DEBUG-only to preserve the auth-token leak safeguards from
#3021.
#3331OTEL_EXPORTER_OTLP_TRACES_PROTOCOL, OTEL_EXPORTER_OTLP_METRICS_PROTOCOL,
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL. These allow configuring different transport protocols
per signal type. Signal-specific vars take precedence over generic OTEL_EXPORTER_OTLP_PROTOCOL.
The auto-select build() method on each exporter builder now respects the full priority chain:
signal-specific env var > generic env var > feature-based default.InvalidConfig when gRPC protocol
is requested; gRPC transport returns InvalidConfig when an HTTP protocol is requested.Protocol::default() no longer consults the OTEL_EXPORTER_OTLP_PROTOCOL
environment variable. It now returns only the feature-based default (http-json > http-proto >
grpc-tonic). Protocol resolution from environment variables is handled internally by the
exporter builders. Users who relied on Protocol::default() to read env vars should use
Protocol::from_env() instead.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE environment variable
to configure metrics temporality. Accepted values: cumulative (default), delta,
lowmemory (case-insensitive). Programmatic .with_temporality() overrides the env var.NoHttpClient error when multiple HTTP client features are enabled by using priority-based selection (reqwest-client > hyper-client > reqwest-blocking-client). #2994internal-logs feature in opentelemetry-otlp to reduce unnecessary dependencies3191shutdown_with_timeout() when using grpc-tonic.tls feature in favor of explicit tls-ring and tls-aws-lc features.
Migration: Replace tls with tls-ring (or tls-aws-lc). Users of tls-roots or tls-webpki-roots must now also enable one of these.Nothing published for this version
Update opentelemetry-proto and opentelemetry-http dependency version to 0.31.0
Released 2025-Sep-25
opentelemetry-proto and opentelemetry-http dependency version to 0.31.0gzip-http and zstd-http feature flagsexperimental-grpc-retry and experimental-http-retry flags on this crate. You can customize the retry policy using the with_retry_policy on the exporter builders.Update opentelemetry dependency version to 0.30
Released 2025-May-23
opentelemetry dependency version to 0.30opentelemetry_sdk dependency version to 0.30opentelemetry-http dependency version to 0.30opentelemetry-proto dependency version to 0.30tonic dependency version to 0.13tonic types under tonic_types
2898MetricExporterBuilder, SpanExporterBuilder, and
LogExporterBuilder types, enabling users to directly reference and use these
builder types for metrics, traces, and logs exporters.
2966Update opentelemetry dependency version to 0.29
Released 2025-Mar-21
Update opentelemetry dependency version to 0.29
Update opentelemetry_sdk dependency version to 0.29
Update opentelemetry-http dependency version to 0.29
Update opentelemetry-proto dependency version to 0.29
The OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT and OTEL_EXPORTER_OTLP_LOGS_TIMEOUT are changed from seconds to milliseconds.
Fixed .with_headers() in HttpExporterBuilder to correctly support multiple key/value pairs. #2699
Fixed
#2770
partially to properly handle shutdown() when using http. (tonic still
does not do proper shutdown)
Breaking
ExporterBuilder's build() method now Result with ExporterBuildError being the
Error variant. Previously it returned signal specific errors like LogError
from the opentelemetry_sdk, which are no longer part of the sdk. No changes
required if you were using unwrap/expect. If you were matching on the returning
Error enum, replace with the enum ExporterBuildError. Unlike the previous
Error which contained many variants unrelated to building an exporter, the
new one returns specific variants applicable to building an exporter. Some
variants might be applicable only on select features.
Also, now unused Error enum is removed.
Breaking ExportConfig's timeout field is now optional(Option<Duration>)
Breaking Export configuration done via code is final. ENV variables cannot be used to override the code config. Do not use code based config, if there is desire to control the settings via ENV variables. List of ENV variables and corresponding setting being affected by this change.
OTEL_EXPORTER_OTLP_ENDPOINT -> ExportConfig.endpointOTEL_EXPORTER_OTLP_TIMEOUT -> ExportConfig.timeoutUpdate opentelemetry dependency version to 0.28.
Released 2025-Feb-10
opentelemetry dependency version to 0.28.opentelemetry_sdk dependency version to 0.28.opentelemetry-http dependency version to 0.28.opentelemetry-proto dependency version to 0.28.event_name() is now automatically populated on the newly added
"event_name" field in LogRecord proto definition.opentelemetry_otlp::metrics::MetricsClient
and MetricExporter::new(..) method. Use
MetricExporter::builder()...build() to obtain MetricExporter.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
OTEL_EXPORTER_OTLP_LOGS_TIMEOUT or OTEL_EXPORTER_OTLP_TIMEOUT.OTEL_EXPORTER_OTLP_TIMEOUT env variable.with_http().with_timeout() API method of
LogExporterBuilder and SpanExporterBuilder and MetricsExporterBuilder.Released 2025-Feb-10
Update opentelemetry dependency version to 0.27
Released 2024-Nov-11
Update opentelemetry dependency version to 0.27
Update opentelemetry_sdk dependency version to 0.27
Update opentelemetry-http dependency version to 0.27
Update opentelemetry-proto dependency version to 0.27
BREAKING:
(#2217) Replaced: The MetricsExporterBuilder interface is modified from with_temporality_selector to with_temporality example can be seen below:
Previous Signature:
MetricsExporterBuilder::default().with_temporality_selector(DeltaTemporalitySelector::new())
Updated Signature:
MetricsExporterBuilder::default().with_temporality(opentelemetry_sdk::metrics::Temporality::Delta)
(#2221) Replaced:
opentelemetry_otlp::new_pipeline().{trace,logging,metrics}() interface is now replaced with {TracerProvider,SdkMeterProvider,LoggerProvider}::builder().opentelemetry_otlp::new_exporter() interface is now replaced with {SpanExporter,MetricsExporter,LogExporter}::builder().Pull request #2221 has a detailed migration guide in the description. See example below, and basic-otlp for more details:
Previous Signature:
let logger_provider: LoggerProvider = opentelemetry_otlp::new_pipeline()
.logging()
.with_resource(RESOURCE.clone())
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317")
)
.install_batch(runtime::Tokio)?;
Updated Signature:
let exporter = LogExporter::builder()
.with_tonic()
.with_endpoint("http://localhost:4317")
.build()?;
Ok(LoggerProvider::builder()
.with_resource(RESOURCE.clone())
.with_batch_exporter(exporter, runtime::Tokio)
.build())
Renamed
MetricsExporter -> MetricExporterMetricsExporterBuilder -> MetricExporterBuilder#2263
Support hyper client for opentelemetry-otlp. This can be enabled using flag hyper-client.
Refer example: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-otlp/examples/basic-otlp-http
Update opentelemetry dependency version to 0.26
Released 2024-Sep-30
opentelemetry dependency version to 0.26opentelemetry_sdk dependency version to 0.26opentelemetry-http dependency version to 0.26opentelemetry-proto dependency version to 0.26Released 2024-Sep-30
semconv_experimental to enable experimental semantic conventions.
This feature is disabled by default.Update opentelemetry dependency version to 0.25
opentelemetry dependency version to 0.25opentelemetry_sdk dependency version to 0.25opentelemetry-http dependency version to 0.25opentelemetry-proto dependency version to 0.25opentelemetry crate
on major,minor versions.populate-logs-event-name is enabled. The name of the attribute is changed from
"name" to "event.name".
1994,
2050Add "metrics", "logs" to default features. With this, default feature list is "trace", "metrics" and "logs".
OtlpMetricPipeline.build() no longer invoke the
global::set_meter_provider. User who setup the pipeline must do it
themselves using global::set_meter_provider(meter_provider.clone());.with_resource on OtlpLogPipeline, replacing the with_config method.
Instead of using
.with_config(Config::default().with_resource(RESOURCE::default())) users must
now use .with_resource(RESOURCE::default()) to configure Resource when using
OtlpLogPipeline.OtlpTracePipeline::install_simple() and OtlpTracePipeline::install_batch() would now return TracerProvider instead of Tracer.
These methods would also no longer set the global tracer provider. It would now be the responsibility of users to set it by calling global::set_tracer_provider(tracer_provider.clone());. Refer to the basic-otlp and basic-otlp-http examples on how to initialize OTLP Trace Exporter.target from LogRecord, if target is populated.LogRecord and Span by their resource and instrumentation scope before exporting, for better efficiency #1873.http v1 and tonic v0.12 #1674opentelemetry dependency version to 0.24opentelemetry_sdk dependency version to 0.24opentelemetry-http dependency version to 0.13opentelemetry-proto dependency version to 0.7URL encoded values in OTEL_EXPORTER_OTLP_HEADERS are now correctly decoded. #1578
OTEL_EXPORTER_OTLP_HEADERS are now correctly decoded. #1578ExportConfig #1706/v1/traces) #1706OTEL_EXPORTER_OTLP_PROTOCOL_DEFAULT #1746DeltaTemporalitySelector (#1568)webpki-roots features to reqwest and tonic backendsLoggerProvider instead of
Logger. Refer to the basic-otlp and basic-otlp-http examples for how to initialize OTLP Log Exporter to use with OpenTelemetryLogBridge and OpenTelemetryTracingBridge respectively.opentelemetry dependency version to 0.23opentelemetry_sdk dependency version to 0.23opentelemetry-http dependency version to 0.12opentelemetry-proto dependency version to 0.6opentelemetry_semantic_conventions::trace and opentelemetry_semantic_conventions::resource into opentelemetry_semantic_conventions::attribute (which now contains all semantic attributes). trace and resource now only contain references to attributes which fall under their respective category.opentelemetry_semantic_conventions::metric to store metric semantic conventions.Support custom channels in topic exporters #1335
Add build_{signal}_exporter methods to client builders #1187
Add OTLP HTTP Metrics Exporter #1020.
Add batch config for otlp pipeline #979.
opentelemetry to 0.19.opentelemetry-semantic-conventions to 0.11.opentelemetry-http to 0.8.User-Agent header on all exporters #896.MetricsExporterBuilder #943.reduce tokio feature requirements #750
tokio feature requirements #750tonic to 0.7 #783Update to opentelemetry v0.17.0
tonic to 0.6 #660Merge metrics and tracing pipeline #585
MetricsExporterBuilder drops exporter_pipeline #590tonic to 0.5.x #597Update grpcio version and add the coverage badge #556
adding otlp http transport, using proto binary #516
with_env method for OtlpPipelineBuilder to use environment variables to config otlp pipeline #451tracing-grpc example to include extractors and injectors #464service.name resource in README #476tonic-build dependency to 0.4 #463from_env and use environment variables to initialize the configurations by default #459Update to spec version 1.3.0 #547
Otlp exporter integration test #424
from_env and use environment variables to initialize the configurations by default #459Add openssl feature flags for grpcio #367
4317 #388Resource information #366Resource in tonic as well #390Update to opentelemetry v0.10.0
### Changed - Update to opentelemetry v0.9.0 - Add exporter pipeline #210
### Added - Initial Alpha implementation
Your coding agent can read these notes before it upgrades. Set up the MCP server →