> ## Documentation Index
> Fetch the complete documentation index at: https://mintlify.com/open-telemetry/opentelemetry-rust/llms.txt
> Use this file to discover all available pages before exploring further.

# opentelemetry-sdk

> Official OpenTelemetry SDK implementation for collecting and processing telemetry in Rust

# opentelemetry-sdk

**Version:** 0.31.0

The `opentelemetry-sdk` crate provides the official SDK implementation for OpenTelemetry in Rust. It implements the processing pipeline for traces, metrics, and logs, including batching, sampling, and resource detection.

## Installation

```toml theme={null}
[dependencies]
opentelemetry-sdk = "0.31"
```

### Feature Flags

**Core Features:**

* `trace`: Trace SDK (enabled by default)
* `metrics`: Metrics SDK (enabled by default)
* `logs`: Logs SDK (enabled by default)
* `internal-logs`: Internal SDK logging (enabled by default)

**Async Runtime Support:**

* `rt-tokio`: Use Tokio's multi-thread runtime
* `rt-tokio-current-thread`: Use Tokio's current-thread runtime
* `experimental_async_runtime`: Enable async runtime trait

**Advanced Features:**

* `jaeger_remote_sampler`: Remote sampling from Jaeger
* `spec_unstable_metrics_views`: Metrics views (experimental)
* `experimental_metrics_custom_reader`: Custom metric readers
* `experimental_logs_batch_log_processor_with_async_runtime`: Async batch log processor

## Quick Start

### Tracing

```rust theme={null}
use opentelemetry::trace::Tracer;
use opentelemetry_sdk::trace::SdkTracerProvider;

let exporter = /* your exporter */;
let provider = SdkTracerProvider::builder()
    .with_simple_exporter(exporter)
    .build();

let tracer = provider.tracer("my_service");

tracer.in_span("doing_work", |cx| {
    // Your traced logic here
});

provider.shutdown().expect("shutdown successful");
```

### Metrics

```rust theme={null}
use opentelemetry::metrics::MeterProvider;
use opentelemetry_sdk::metrics::SdkMeterProvider;

let exporter = /* your exporter */;
let provider = SdkMeterProvider::builder()
    .with_periodic_exporter(exporter)
    .build();

let meter = provider.meter("my_service");
let counter = meter.u64_counter("requests").build();
counter.add(1, &[]);
```

### Logs

```rust theme={null}
use opentelemetry_sdk::logs::SdkLoggerProvider;

let exporter = /* your exporter */;
let provider = SdkLoggerProvider::builder()
    .with_simple_exporter(exporter)
    .build();
```

## Key Components

### Trace SDK

<ParamField path="trace::SdkTracerProvider" type="struct">
  Main entry point for tracing. Creates `Tracer` instances and manages span processors.
</ParamField>

<ParamField path="trace::BatchSpanProcessor" type="struct">
  Batches spans before exporting (recommended for production)
</ParamField>

<ParamField path="trace::SimpleSpanProcessor" type="struct">
  Exports each span immediately (useful for debugging)
</ParamField>

<ParamField path="trace::Sampler" type="enum">
  Controls which spans to record:

  * `AlwaysOn`: Sample all spans
  * `AlwaysOff`: Sample no spans
  * `TraceIdRatioBased`: Sample based on trace ID
  * `ParentBased`: Defer to parent span's sampling decision
</ParamField>

### Metrics SDK

<ParamField path="metrics::SdkMeterProvider" type="struct">
  Creates `Meter` instances and manages metric readers
</ParamField>

<ParamField path="metrics::PeriodicReader" type="struct">
  Periodically exports metrics at a fixed interval (default: 60 seconds)
</ParamField>

<ParamField path="metrics::ManualReader" type="struct">
  Exports metrics on-demand (useful for pull-based exporters like Prometheus)
</ParamField>

### Logs SDK

<ParamField path="logs::SdkLoggerProvider" type="struct">
  Creates `Logger` instances and manages log processors
</ParamField>

<ParamField path="logs::BatchLogProcessor" type="struct">
  Batches log records before exporting
</ParamField>

<ParamField path="logs::SimpleLogProcessor" type="struct">
  Exports each log record immediately
</ParamField>

## Resource Detection

<ParamField path="Resource" type="struct">
  Immutable set of attributes describing the entity producing telemetry
</ParamField>

```rust theme={null}
use opentelemetry_sdk::Resource;
use opentelemetry::KeyValue;

let resource = Resource::builder_empty()
    .with_service_name("my_service")
    .with_attribute(KeyValue::new("environment", "production"))
    .build();

let provider = SdkTracerProvider::builder()
    .with_resource(resource)
    .build();
```

## Propagation

The SDK includes propagator implementations:

<ParamField path="propagation::TraceContextPropagator" type="struct">
  W3C Trace Context propagation format
</ParamField>

<ParamField path="propagation::BaggagePropagator" type="struct">
  W3C Baggage propagation format
</ParamField>

## Environment Variables

The SDK respects OpenTelemetry environment variables:

### General

* `OTEL_SERVICE_NAME`: Service name
* `OTEL_RESOURCE_ATTRIBUTES`: Resource attributes as key-value pairs

### Trace

* `OTEL_TRACES_SAMPLER`: Sampler type (`always_on`, `always_off`, `traceidratio`, `parentbased_always_on`, etc.)
* `OTEL_TRACES_SAMPLER_ARG`: Sampler argument (e.g., ratio for `traceidratio`)
* `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT`: Max attributes per span (default: 128)
* `OTEL_SPAN_EVENT_COUNT_LIMIT`: Max events per span (default: 128)
* `OTEL_BSP_SCHEDULE_DELAY`: Batch span processor export interval in ms (default: 5000)
* `OTEL_BSP_MAX_QUEUE_SIZE`: Max queue size (default: 2048)
* `OTEL_BSP_MAX_EXPORT_BATCH_SIZE`: Max batch size (default: 512)

### Metrics

* `OTEL_METRIC_EXPORT_INTERVAL`: Export interval in ms (default: 60000)

### Logs

* `OTEL_BLRP_SCHEDULE_DELAY`: Batch log processor export interval in ms (default: 1000)
* `OTEL_BLRP_MAX_QUEUE_SIZE`: Max queue size (default: 2048)
* `OTEL_BLRP_MAX_EXPORT_BATCH_SIZE`: Max batch size (default: 512)

## Related Crates

* **[opentelemetry](/api/opentelemetry)** - Core API
* **[opentelemetry-otlp](/api/opentelemetry-otlp)** - OTLP exporter
* **[opentelemetry-stdout](/api/opentelemetry-stdout)** - Stdout exporter

## Documentation

<Card title="Full API Documentation" icon="book" href="https://docs.rs/opentelemetry_sdk/0.31.0">
  View complete API reference on docs.rs
</Card>

## Minimum Rust Version

**MSRV:** 1.75.0
