Skip to content

Commit 5308844

Browse files
gruebelcijothomaslalitb
authored
Remove global set_tracer_provider from trace pipelines (#156)
Co-authored-by: Cijo Thomas <[email protected]> Co-authored-by: Cijo Thomas <[email protected]> Co-authored-by: Lalit Kumar Bhasin <[email protected]>
1 parent a30b850 commit 5308844

File tree

11 files changed

+91
-80
lines changed

11 files changed

+91
-80
lines changed

examples/traceresponse/src/client.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,28 @@ use hyper_util::{client::legacy::Client, rt::TokioExecutor};
44
use opentelemetry::{
55
global,
66
propagation::TextMapPropagator,
7-
trace::{SpanKind, TraceContextExt, Tracer},
7+
trace::{SpanKind, TraceContextExt, TraceError, Tracer},
88
Context, KeyValue,
99
};
1010
use opentelemetry_contrib::trace::propagator::trace_context_response::TraceContextResponsePropagator;
1111
use opentelemetry_http::{Bytes, HeaderExtractor, HeaderInjector};
1212
use opentelemetry_sdk::{propagation::TraceContextPropagator, trace::TracerProvider};
1313
use opentelemetry_stdout::SpanExporter;
1414

15-
fn init_tracer() {
15+
fn init_traces() -> Result<TracerProvider, TraceError> {
1616
global::set_text_map_propagator(TraceContextPropagator::new());
1717
// Install stdout exporter pipeline to be able to retrieve the collected spans.
1818
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
1919
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
20-
let provider = TracerProvider::builder()
20+
Ok(TracerProvider::builder()
2121
.with_simple_exporter(SpanExporter::default())
22-
.build();
23-
24-
global::set_tracer_provider(provider);
22+
.build())
2523
}
2624

2725
#[tokio::main]
28-
async fn main() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
29-
init_tracer();
26+
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
27+
let tracer_provider = init_traces()?;
28+
global::set_tracer_provider(tracer_provider.clone());
3029

3130
let client = Client::builder(TokioExecutor::new()).build_http();
3231
let tracer = global::tracer("example/client");
@@ -68,5 +67,7 @@ async fn main() -> std::result::Result<(), Box<dyn std::error::Error + Send + Sy
6867
],
6968
);
7069

70+
tracer_provider.shutdown()?;
71+
7172
Ok(())
7273
}

examples/traceresponse/src/server.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use http_body_util::{combinators::BoxBody, BodyExt, Full};
22
use hyper::{body::Incoming, service::service_fn, Request, Response};
33
use hyper_util::rt::{TokioExecutor, TokioIo};
4+
use hyper_util::server::conn::auto::Builder;
5+
use opentelemetry::trace::TraceError;
46
use opentelemetry::{
57
global,
68
propagation::TextMapPropagator,
@@ -43,23 +45,22 @@ async fn handle(
4345
Ok(res)
4446
}
4547

46-
fn init_tracer() {
48+
fn init_traces() -> Result<TracerProvider, TraceError> {
4749
global::set_text_map_propagator(TraceContextPropagator::new());
4850

4951
// Install stdout exporter pipeline to be able to retrieve the collected spans.
5052
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
5153
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
52-
let provider = TracerProvider::builder()
54+
Ok(TracerProvider::builder()
5355
.with_simple_exporter(SpanExporter::default())
54-
.build();
55-
56-
global::set_tracer_provider(provider);
56+
.build())
5757
}
5858

5959
#[tokio::main]
60-
async fn main() {
61-
use hyper_util::server::conn::auto::Builder;
62-
init_tracer();
60+
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
61+
let tracer_provider = init_traces()?;
62+
global::set_tracer_provider(tracer_provider.clone());
63+
6364
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
6465
let listener = TcpListener::bind(addr).await.unwrap();
6566

@@ -71,4 +72,8 @@ async fn main() {
7172
eprintln!("{err}");
7273
}
7374
}
75+
76+
tracer_provider.shutdown()?;
77+
78+
Ok(())
7479
}

opentelemetry-contrib/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## vNext
44

5+
- [Breaking] `JaegerJsonExporter::install_batch()` now returns `TracerProvider`.
6+
Additionally, global tracer provider now needs to be set by the user by calling `global::set_tracer_provider(tracer_provider.clone())` (original PR [opentelemetry-rust#1812](https://github.com/open-telemetry/opentelemetry-rust/pull/1812))
7+
58
## v0.19.0
69

710
- Bump opentelemetry and opentelemetry_sdk versions to 0.27

opentelemetry-contrib/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ api = []
2323
default = []
2424
base64_format = ["base64", "binary_propagator"]
2525
binary_propagator = []
26-
jaeger_json_exporter = ["opentelemetry_sdk", "serde_json", "futures-core", "futures-util", "async-trait", "opentelemetry-semantic-conventions"]
26+
jaeger_json_exporter = ["opentelemetry_sdk", "serde_json", "futures-core", "futures-util", "async-trait"]
2727
rt-tokio = ["tokio", "opentelemetry_sdk/rt-tokio"]
2828
rt-tokio-current-thread = ["tokio", "opentelemetry_sdk/rt-tokio-current-thread"]
2929
rt-async-std = ["async-std", "opentelemetry_sdk/rt-async-std"]
@@ -36,7 +36,6 @@ futures-core = { version = "0.3", optional = true }
3636
futures-util = { version = "0.3", optional = true, default-features = false }
3737
opentelemetry = { workspace = true }
3838
opentelemetry_sdk = { workspace = true, optional = true }
39-
opentelemetry-semantic-conventions = { workspace = true, optional = true }
4039
serde_json = { version = "1", optional = true }
4140
tokio = { version = "1.0", features = ["fs", "io-util"], optional = true }
4241

opentelemetry-contrib/src/trace/exporter/jaeger_json.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,11 @@ use opentelemetry::trace::SpanId;
1111
feature = "rt-tokio-current-thread"
1212
))]
1313
use opentelemetry::trace::TraceError;
14-
use opentelemetry::trace::TracerProvider as _;
15-
use opentelemetry::InstrumentationScope;
1614
use opentelemetry_sdk::{
1715
export::trace::{ExportResult, SpanData, SpanExporter},
1816
runtime::RuntimeChannel,
19-
trace::{Tracer, TracerProvider},
17+
trace::TracerProvider,
2018
};
21-
use opentelemetry_semantic_conventions::SCHEMA_URL;
2219
use std::collections::HashMap;
2320
use std::path::{Path, PathBuf};
2421
use std::time::SystemTime;
@@ -49,18 +46,11 @@ impl<R: JaegerJsonRuntime> JaegerJsonExporter<R> {
4946
}
5047

5148
/// Install the exporter using the internal provided runtime
52-
pub fn install_batch(self) -> Tracer {
49+
pub fn install_batch(self) -> TracerProvider {
5350
let runtime = self.runtime.clone();
54-
let provider_builder = TracerProvider::builder().with_batch_exporter(self, runtime);
55-
let provider = provider_builder.build();
56-
let scope = InstrumentationScope::builder("opentelemetry")
57-
.with_version(env!("CARGO_PKG_VERSION"))
58-
.with_schema_url(SCHEMA_URL)
59-
.build();
60-
let tracer = provider.tracer_with_scope(scope);
61-
let _ = opentelemetry::global::set_tracer_provider(provider);
62-
63-
tracer
51+
TracerProvider::builder()
52+
.with_batch_exporter(self, runtime)
53+
.build()
6454
}
6555
}
6656

opentelemetry-datadog/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
- Bump thiserror to 2.0
66
- [Breaking] Replace `opentelemetry::global::shutdown_tracer_provider()` with `tracer_provider.shutdown()` (original PR [opentelemetry-rust#2369](https://github.com/open-telemetry/opentelemetry-rust/pull/2369))
7+
- [Breaking] `DatadogPipelineBuilder::install_simple()` and `DatadogPipelineBuilder::install_batch()` now return `TracerProvider`.
8+
Additionally, global tracer provider now needs to be set by the user by calling `global::set_tracer_provider(tracer_provider.clone())` (original PR [opentelemetry-rust#1812](https://github.com/open-telemetry/opentelemetry-rust/pull/1812))
79

810
## v0.15.0
911

opentelemetry-datadog/examples/agent_sampling.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use opentelemetry::{
22
global,
3-
trace::{SamplingResult, Span, TraceContextExt, Tracer},
4-
Key, KeyValue, Value,
3+
trace::{SamplingResult, Span, TraceContextExt, Tracer, TracerProvider},
4+
InstrumentationScope, Key, KeyValue, Value,
55
};
66
use opentelemetry_datadog::{new_pipeline, ApiVersion, DatadogTraceStateBuilder};
77
use opentelemetry_sdk::trace::{self, RandomIdGenerator, ShouldSample};
8+
use opentelemetry_semantic_conventions as semcov;
89
use std::thread;
910
use std::time::Duration;
1011

@@ -57,7 +58,7 @@ impl ShouldSample for AgentBasedSampler {
5758

5859
fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
5960
#[allow(deprecated)]
60-
let (tracer, provider) = new_pipeline()
61+
let provider = new_pipeline()
6162
.with_service_name("agent-sampling-demo")
6263
.with_api_version(ApiVersion::Version05)
6364
.with_trace_config(
@@ -66,6 +67,13 @@ fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
6667
.with_id_generator(RandomIdGenerator::default()),
6768
)
6869
.install_simple()?;
70+
global::set_tracer_provider(provider.clone());
71+
let scope = InstrumentationScope::builder("opentelemetry-datadog-demo")
72+
.with_version(env!("CARGO_PKG_VERSION"))
73+
.with_schema_url(semcov::SCHEMA_URL)
74+
.with_attributes(None)
75+
.build();
76+
let tracer = provider.tracer_with_scope(scope);
6977

7078
tracer.in_span("foo", |cx| {
7179
let span = cx.span();

opentelemetry-datadog/examples/datadog.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use opentelemetry::{
22
global,
3-
trace::{Span, TraceContextExt, Tracer},
4-
Key, KeyValue, Value,
3+
trace::{Span, TraceContextExt, Tracer, TracerProvider},
4+
InstrumentationScope, Key, KeyValue, Value,
55
};
66
use opentelemetry_datadog::{new_pipeline, ApiVersion};
7+
use opentelemetry_semantic_conventions as semcov;
78
use std::thread;
89
use std::time::Duration;
910

@@ -23,10 +24,17 @@ fn bar() {
2324
}
2425

2526
fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
26-
let (tracer, provider) = new_pipeline()
27+
let provider = new_pipeline()
2728
.with_service_name("trace-demo")
2829
.with_api_version(ApiVersion::Version05)
2930
.install_simple()?;
31+
global::set_tracer_provider(provider.clone());
32+
let scope = InstrumentationScope::builder("opentelemetry-datadog")
33+
.with_version(env!("CARGO_PKG_VERSION"))
34+
.with_schema_url(semcov::SCHEMA_URL)
35+
.with_attributes(None)
36+
.build();
37+
let tracer = provider.tracer_with_scope(scope);
3038

3139
tracer.in_span("foo", |cx| {
3240
let span = cx.span();

opentelemetry-datadog/src/exporter/mod.rs

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,17 @@ mod model;
44
pub use model::ApiVersion;
55
pub use model::Error;
66
pub use model::FieldMappingFn;
7-
use opentelemetry::InstrumentationScope;
87

98
use crate::exporter::model::FieldMapping;
109
use futures_core::future::BoxFuture;
1110
use http::{Method, Request, Uri};
12-
use opentelemetry::trace::TracerProvider as _;
13-
use opentelemetry::{global, trace::TraceError, KeyValue};
11+
use opentelemetry::{trace::TraceError, KeyValue};
1412
use opentelemetry_http::{HttpClient, ResponseExt};
1513
use opentelemetry_sdk::{
1614
export::trace::{ExportResult, SpanData, SpanExporter},
1715
resource::{ResourceDetector, SdkProvidedResourceDetector},
1816
runtime::RuntimeChannel,
19-
trace::{Config, Tracer, TracerProvider},
17+
trace::{Config, TracerProvider},
2018
Resource,
2119
};
2220
use opentelemetry_semantic_conventions as semcov;
@@ -283,41 +281,27 @@ impl DatadogPipelineBuilder {
283281
}
284282

285283
/// Install the Datadog trace exporter pipeline using a simple span processor.
286-
pub fn install_simple(mut self) -> Result<(Tracer, TracerProvider), TraceError> {
284+
pub fn install_simple(mut self) -> Result<TracerProvider, TraceError> {
287285
let (config, service_name) = self.build_config_and_service_name();
288286
let exporter = self.build_exporter_with_service_name(service_name)?;
289-
let mut provider_builder = TracerProvider::builder().with_simple_exporter(exporter);
290-
provider_builder = provider_builder.with_resource(config.resource.into_owned());
291-
let provider = provider_builder.build();
292-
let scope = InstrumentationScope::builder("opentelemetry-datadog")
293-
.with_version(env!("CARGO_PKG_VERSION"))
294-
.with_schema_url(semcov::SCHEMA_URL)
295-
.with_attributes(None)
296-
.build();
297-
let tracer = provider.tracer_with_scope(scope);
298-
let _ = global::set_tracer_provider(provider.clone());
299-
Ok((tracer, provider))
287+
Ok(TracerProvider::builder()
288+
.with_simple_exporter(exporter)
289+
.with_resource(config.resource.into_owned())
290+
.build())
300291
}
301292

302293
/// Install the Datadog trace exporter pipeline using a batch span processor with the specified
303294
/// runtime.
304295
pub fn install_batch<R: RuntimeChannel>(
305296
mut self,
306297
runtime: R,
307-
) -> Result<(Tracer, TracerProvider), TraceError> {
298+
) -> Result<TracerProvider, TraceError> {
308299
let (config, service_name) = self.build_config_and_service_name();
309300
let exporter = self.build_exporter_with_service_name(service_name)?;
310-
let mut provider_builder = TracerProvider::builder().with_batch_exporter(exporter, runtime);
311-
provider_builder = provider_builder.with_resource(config.resource.into_owned());
312-
let provider = provider_builder.build();
313-
let scope = InstrumentationScope::builder("opentelemetry-datadog")
314-
.with_version(env!("CARGO_PKG_VERSION"))
315-
.with_schema_url(semcov::SCHEMA_URL)
316-
.with_attributes(None)
317-
.build();
318-
let tracer = provider.tracer_with_scope(scope);
319-
let _ = global::set_tracer_provider(provider.clone());
320-
Ok((tracer, provider))
301+
Ok(TracerProvider::builder()
302+
.with_batch_exporter(exporter, runtime)
303+
.with_resource(config.resource.into_owned())
304+
.build())
321305
}
322306

323307
/// Assign the service name under which to group traces

opentelemetry-datadog/src/exporter/model/mod.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,21 @@ static DD_MEASURED_KEY: &str = "_dd.measured";
4444
///
4545
/// For example,
4646
/// ```no_run
47+
/// use opentelemetry::global;
4748
/// use opentelemetry_datadog::{ApiVersion, new_pipeline};
49+
///
4850
/// fn main() -> Result<(), opentelemetry::trace::TraceError> {
49-
/// let tracer = new_pipeline()
50-
/// .with_service_name("my_app")
51-
/// .with_api_version(ApiVersion::Version05)
52-
/// // the custom mapping below will change the all spans' name to datadog spans
53-
/// .with_name_mapping(|span, model_config|{
54-
/// "datadog spans"
55-
/// })
56-
/// .with_agent_endpoint("http://localhost:8126")
57-
/// .install_batch(opentelemetry_sdk::runtime::Tokio)?;
51+
/// let provider = new_pipeline()
52+
/// .with_service_name("my_app")
53+
/// .with_api_version(ApiVersion::Version05)
54+
/// // the custom mapping below will change the all spans' name to datadog spans
55+
/// .with_name_mapping(|span, model_config|{"datadog spans"})
56+
/// .with_agent_endpoint("http://localhost:8126")
57+
/// .install_batch(opentelemetry_sdk::runtime::Tokio)?;
58+
/// global::set_tracer_provider(provider.clone());
59+
/// let tracer = global::tracer("opentelemetry-datadog-demo");
5860
///
59-
/// Ok(())
61+
/// Ok(())
6062
/// }
6163
/// ```
6264
pub type FieldMappingFn = dyn for<'a> Fn(&'a SpanData, &'a ModelConfig) -> &'a str + Send + Sync;

opentelemetry-datadog/src/lib.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
//!
4949
//! ```no_run
5050
//! # fn main() -> Result<(), opentelemetry::trace::TraceError> {
51-
//! let tracer = opentelemetry_datadog::new_pipeline()
51+
//! let provider = opentelemetry_datadog::new_pipeline()
5252
//! .install_batch(opentelemetry_sdk::runtime::Tokio)?;
5353
//! # Ok(())
5454
//! # }
@@ -80,11 +80,12 @@
8080
//! [`DatadogPipelineBuilder`]: struct.DatadogPipelineBuilder.html
8181
//!
8282
//! ```no_run
83-
//! use opentelemetry::{KeyValue, trace::Tracer};
83+
//! use opentelemetry::{global, KeyValue, trace::{Tracer, TracerProvider}, InstrumentationScope};
8484
//! use opentelemetry_sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource};
8585
//! use opentelemetry_sdk::export::trace::ExportResult;
8686
//! use opentelemetry_datadog::{new_pipeline, ApiVersion, Error};
8787
//! use opentelemetry_http::{HttpClient, HttpError};
88+
//! use opentelemetry_semantic_conventions as semcov;
8889
//! use async_trait::async_trait;
8990
//! use bytes::Bytes;
9091
//! use futures_util::io::AsyncReadExt as _;
@@ -115,7 +116,7 @@
115116
//!
116117
//! fn main() -> Result<(), opentelemetry::trace::TraceError> {
117118
//! #[allow(deprecated)]
118-
//! let (tracer, provider) = new_pipeline()
119+
//! let provider = new_pipeline()
119120
//! .with_service_name("my_app")
120121
//! .with_api_version(ApiVersion::Version05)
121122
//! .with_agent_endpoint("http://localhost:8126")
@@ -125,6 +126,14 @@
125126
//! .with_id_generator(RandomIdGenerator::default())
126127
//! )
127128
//! .install_batch(opentelemetry_sdk::runtime::Tokio)?;
129+
//! global::set_tracer_provider(provider.clone());
130+
//!
131+
//! let scope = InstrumentationScope::builder("opentelemetry-datadog")
132+
//! .with_version(env!("CARGO_PKG_VERSION"))
133+
//! .with_schema_url(semcov::SCHEMA_URL)
134+
//! .with_attributes(None)
135+
//! .build();
136+
//! let tracer = provider.tracer_with_scope(scope);
128137
//!
129138
//! tracer.in_span("doing_work", |cx| {
130139
//! // Traced app logic here...

0 commit comments

Comments
 (0)