opentelemetry-rust
opentelemetry-rust copied to clipboard
feat: replace OtlpPipeline with exporter builders
Fixes #1810
Migration Guide
To move from opentelemetry_otlp::new_exporter()
, and opentelemetry_otlp::new_pipeline().{tracing,metrics,logging}()
, you will need to select the Exporter
, and Provider
for the signal you are using.
Below there is a guide with details about Exporters and Providers. There are also Examples for each type of signal.
Exporter Guide
The following are the available exporters:
- SpanExporter
- MetricsExporter
- LogExporter
The exporter interface should have the same options as with the old method. For example, a tonic grpc exporter being configured old vs new:
// old
let old_exporter = opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317");
// new
let new_exporter = SpanExporter::builder()
.tonic()
.with_endpoint("http://localhost:4317")
.build()?; // note: you need to build the exporter after setting configuration.
Provider Guide
The following are the available providers:
- TracingProvider
- SdkMeterProvider
- LoggerProvider
The provider interface should be similar to the old method. For example, a TracerProvider
being configured old vs new:
// old
let tracer_provider: TracerProvider = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(old_exporter /* ^^ See exporter guide above ^^ */)
.with_trace_config(Config::default().with_resource(RESOURCE.clone()))
.install_batch(runtime::Tokio)?;
// new
let tracer_provider: TracerProvider = TracerProvider::builder()
.with_batch_exporter(new_exporter /* ^^ See exporter guide above ^^ */, runtime::Tokio)
.with_config(Config::default().with_resource(RESOURCE.clone()))
.build(); // note: you need to build the provider after setting configuration.
Signal Examples
Trace Example
// old
fn init_tracer_provider() -> Result<sdktrace::TracerProvider, TraceError> {
opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317"),
)
.with_trace_config(Config::default().with_resource(RESOURCE.clone()))
.install_batch(runtime::Tokio)
}
// new
fn init_tracer_provider() -> Result<sdktrace::TracerProvider, TraceError> {
let exporter = SpanExporter::builder()
.with_tonic()
.with_endpoint("http://localhost:4317")
.build()?;
Ok(sdktrace::TracerProvider::builder()
.with_config(Config::default().with_resource(RESOURCE.clone()))
.with_batch_exporter(exporter, runtime::Tokio)
.build())
}
Metric Example
// old
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
let export_config = ExportConfig {
endpoint: "http://localhost:4317".to_string(),
..ExportConfig::default()
};
opentelemetry_otlp::new_pipeline()
.metrics(runtime::Tokio)
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_export_config(export_config),
)
}
// new
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
let exporter = MetricsExporter::builder().with_tonic().build()?;
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
Ok(SdkMeterProvider::builder()
.with_reader(reader)
.with_resource(RESOURCE.clone())
.build()
.build())
}
Log Example
// old
fn init_logs() -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
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)
.with_batch_exporter(exporter, runtime::Tokio)
.build())
}
// new
fn init_logs() -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
let exporter = LogExporter::builder()
.with_tonic()
.with_endpoint("http://localhost:4317")
.build()?;
Ok(LoggerProvider::builder()
.with_resource(RESOURCE.clone())
.with_exporter(
exporter,
)
.with_batch_exporter(exporter, runtime::Tokio)
.build())
}
Changes
Started to replace the OTLPPipeline
pattern in the opentelemetry-otlp
crate.
Merge requirement checklist
- [x] CONTRIBUTING guidelines followed
- [x] Unit tests added/updated (if applicable)
- [x] Appropriate
CHANGELOG.md
files updated for non-trivial, user-facing changes - [ ] Changes in public API reviewed (if applicable)