Skip to content

Commit 5768d92

Browse files
committed
Merge remote-tracking branch 'origin/main' into move-trace-error-v2
# Conflicts: # opentelemetry-sdk/CHANGELOG.md # opentelemetry-sdk/src/trace/in_memory_exporter.rs # opentelemetry/CHANGELOG.md
2 parents 0d5c35f + f01e8f4 commit 5768d92

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+385
-254
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pin-project-lite = "0.2"
3636
prost = "0.13"
3737
prost-build = "0.13"
3838
prost-types = "0.13"
39-
rand = { version = "0.8", default-features = false }
39+
rand = { version = "0.9", default-features = false }
4040
reqwest = { version = "0.12", default-features = false }
4141
serde = { version = "1.0", default-features = false }
4242
serde_json = "1.0"

opentelemetry-otlp/src/exporter/http/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ impl HttpExporterBuilder {
223223
OTEL_EXPORTER_OTLP_TRACES_HEADERS,
224224
)?;
225225

226-
Ok(crate::SpanExporter::new(client))
226+
Ok(crate::SpanExporter::from_http(client))
227227
}
228228

229229
/// Create a log exporter with the current configuration

opentelemetry-otlp/src/exporter/http/trace.rs

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::sync::Arc;
22

33
use super::OtlpHttpClient;
4-
use futures_core::future::BoxFuture;
54
use http::{header::CONTENT_TYPE, Method};
65
use opentelemetry::otel_debug;
76
use opentelemetry_sdk::{
@@ -10,7 +9,7 @@ use opentelemetry_sdk::{
109
};
1110

1211
impl SpanExporter for OtlpHttpClient {
13-
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
12+
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult {
1413
let client = match self
1514
.client
1615
.lock()
@@ -20,16 +19,12 @@ impl SpanExporter for OtlpHttpClient {
2019
_ => Err(OTelSdkError::AlreadyShutdown),
2120
}) {
2221
Ok(client) => client,
23-
Err(err) => return Box::pin(std::future::ready(Err(err))),
22+
Err(err) => return Err(err),
2423
};
2524

2625
let (body, content_type) = match self.build_trace_export_body(batch) {
2726
Ok(body) => body,
28-
Err(e) => {
29-
return Box::pin(std::future::ready(Err(OTelSdkError::InternalFailure(
30-
e.to_string(),
31-
))))
32-
}
27+
Err(e) => return Err(OTelSdkError::InternalFailure(e.to_string())),
3328
};
3429

3530
let mut request = match http::Request::builder()
@@ -39,37 +34,31 @@ impl SpanExporter for OtlpHttpClient {
3934
.body(body.into())
4035
{
4136
Ok(req) => req,
42-
Err(e) => {
43-
return Box::pin(std::future::ready(Err(OTelSdkError::InternalFailure(
44-
e.to_string(),
45-
))))
46-
}
37+
Err(e) => return Err(OTelSdkError::InternalFailure(e.to_string())),
4738
};
4839

4940
for (k, v) in &self.headers {
5041
request.headers_mut().insert(k.clone(), v.clone());
5142
}
5243

53-
Box::pin(async move {
54-
let request_uri = request.uri().to_string();
55-
otel_debug!(name: "HttpTracesClient.CallingExport");
56-
let response = client
57-
.send_bytes(request)
58-
.await
59-
.map_err(|e| OTelSdkError::InternalFailure(format!("{e:?}")))?;
44+
let request_uri = request.uri().to_string();
45+
otel_debug!(name: "HttpTracesClient.CallingExport");
46+
let response = client
47+
.send_bytes(request)
48+
.await
49+
.map_err(|e| OTelSdkError::InternalFailure(format!("{e:?}")))?;
6050

61-
if !response.status().is_success() {
62-
let error = format!(
63-
"OpenTelemetry trace export failed. Url: {}, Status Code: {}, Response: {:?}",
64-
response.status().as_u16(),
65-
request_uri,
66-
response.body()
67-
);
68-
return Err(OTelSdkError::InternalFailure(error));
69-
}
51+
if !response.status().is_success() {
52+
let error = format!(
53+
"OpenTelemetry trace export failed. Url: {}, Status Code: {}, Response: {:?}",
54+
response.status().as_u16(),
55+
request_uri,
56+
response.body()
57+
);
58+
return Err(OTelSdkError::InternalFailure(error));
59+
}
7060

71-
Ok(())
72-
})
61+
Ok(())
7362
}
7463

7564
fn shutdown(&mut self) -> OTelSdkResult {

opentelemetry-otlp/src/exporter/tonic/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ impl TonicExporterBuilder {
317317

318318
let client = TonicTracesClient::new(channel, interceptor, compression);
319319

320-
Ok(crate::SpanExporter::new(client))
320+
Ok(crate::SpanExporter::from_tonic(client))
321321
}
322322
}
323323

opentelemetry-otlp/src/exporter/tonic/trace.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use core::fmt;
22

3-
use futures_core::future::BoxFuture;
43
use opentelemetry::otel_debug;
54
use opentelemetry_proto::tonic::collector::trace::v1::{
65
trace_service_client::TraceServiceClient, ExportTraceServiceRequest,
@@ -59,39 +58,33 @@ impl TonicTracesClient {
5958
}
6059

6160
impl SpanExporter for TonicTracesClient {
62-
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
61+
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult {
6362
let (mut client, metadata, extensions) = match &mut self.inner {
6463
Some(inner) => {
6564
let (m, e, _) = match inner.interceptor.call(Request::new(())) {
6665
Ok(res) => res.into_parts(),
67-
Err(e) => {
68-
return Box::pin(std::future::ready(Err(OTelSdkError::InternalFailure(
69-
e.to_string(),
70-
))))
71-
}
66+
Err(e) => return Err(OTelSdkError::InternalFailure(e.to_string())),
7267
};
7368
(inner.client.clone(), m, e)
7469
}
7570
None => {
76-
return Box::pin(std::future::ready(Err(OTelSdkError::AlreadyShutdown)));
71+
return Err(OTelSdkError::AlreadyShutdown);
7772
}
7873
};
7974

8075
let resource_spans = group_spans_by_resource_and_scope(batch, &self.resource);
8176

8277
otel_debug!(name: "TonicsTracesClient.CallingExport");
8378

84-
Box::pin(async move {
85-
client
86-
.export(Request::from_parts(
87-
metadata,
88-
extensions,
89-
ExportTraceServiceRequest { resource_spans },
90-
))
91-
.await
92-
.map_err(|e| OTelSdkError::InternalFailure(e.to_string()))?;
93-
Ok(())
94-
})
79+
client
80+
.export(Request::from_parts(
81+
metadata,
82+
extensions,
83+
ExportTraceServiceRequest { resource_spans },
84+
))
85+
.await
86+
.map_err(|e| OTelSdkError::InternalFailure(e.to_string()))?;
87+
Ok(())
9588
}
9689

9790
fn shutdown(&mut self) -> OTelSdkResult {

opentelemetry-otlp/src/span.rs

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
55
use std::fmt::Debug;
66

7-
use futures_core::future::BoxFuture;
87
use opentelemetry_sdk::error::OTelSdkResult;
98
use opentelemetry_sdk::trace::{SpanData, TraceError};
109

@@ -66,15 +65,15 @@ impl SpanExporterBuilder<TonicExporterBuilderSet> {
6665
pub fn build(self) -> Result<SpanExporter, TraceError> {
6766
let span_exporter = self.client.0.build_span_exporter()?;
6867
opentelemetry::otel_debug!(name: "SpanExporterBuilt");
69-
Ok(SpanExporter::new(span_exporter))
68+
Ok(span_exporter)
7069
}
7170
}
7271

7372
#[cfg(any(feature = "http-proto", feature = "http-json"))]
7473
impl SpanExporterBuilder<HttpExporterBuilderSet> {
7574
pub fn build(self) -> Result<SpanExporter, TraceError> {
7675
let span_exporter = self.client.0.build_span_exporter()?;
77-
Ok(SpanExporter::new(span_exporter))
76+
Ok(span_exporter)
7877
}
7978
}
8079

@@ -106,28 +105,57 @@ impl HasHttpConfig for SpanExporterBuilder<HttpExporterBuilderSet> {
106105
}
107106
}
108107

109-
/// OTLP exporter that sends tracing information
108+
/// OTLP exporter that sends tracing data
110109
#[derive(Debug)]
111-
pub struct SpanExporter(Box<dyn opentelemetry_sdk::trace::SpanExporter>);
110+
pub struct SpanExporter {
111+
client: SupportedTransportClient,
112+
}
113+
114+
#[derive(Debug)]
115+
enum SupportedTransportClient {
116+
#[cfg(feature = "grpc-tonic")]
117+
Tonic(crate::exporter::tonic::trace::TonicTracesClient),
118+
#[cfg(any(feature = "http-proto", feature = "http-json"))]
119+
Http(crate::exporter::http::OtlpHttpClient),
120+
}
112121

113122
impl SpanExporter {
114123
/// Obtain a builder to configure a [SpanExporter].
115124
pub fn builder() -> SpanExporterBuilder<NoExporterBuilderSet> {
116125
SpanExporterBuilder::default()
117126
}
118127

119-
/// Build a new span exporter from a client
120-
pub fn new(client: impl opentelemetry_sdk::trace::SpanExporter + 'static) -> Self {
121-
SpanExporter(Box::new(client))
128+
#[cfg(any(feature = "http-proto", feature = "http-json"))]
129+
pub(crate) fn from_http(client: crate::exporter::http::OtlpHttpClient) -> Self {
130+
SpanExporter {
131+
client: SupportedTransportClient::Http(client),
132+
}
133+
}
134+
135+
#[cfg(feature = "grpc-tonic")]
136+
pub(crate) fn from_tonic(client: crate::exporter::tonic::trace::TonicTracesClient) -> Self {
137+
SpanExporter {
138+
client: SupportedTransportClient::Tonic(client),
139+
}
122140
}
123141
}
124142

125143
impl opentelemetry_sdk::trace::SpanExporter for SpanExporter {
126-
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
127-
self.0.export(batch)
144+
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult {
145+
match &mut self.client {
146+
#[cfg(feature = "grpc-tonic")]
147+
SupportedTransportClient::Tonic(client) => client.export(batch).await,
148+
#[cfg(any(feature = "http-proto", feature = "http-json"))]
149+
SupportedTransportClient::Http(client) => client.export(batch).await,
150+
}
128151
}
129152

130153
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
131-
self.0.set_resource(resource);
154+
match &mut self.client {
155+
#[cfg(feature = "grpc-tonic")]
156+
SupportedTransportClient::Tonic(client) => client.set_resource(resource),
157+
#[cfg(any(feature = "http-proto", feature = "http-json"))]
158+
SupportedTransportClient::Http(client) => client.set_resource(resource),
159+
}
132160
}
133161
}

opentelemetry-sdk/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
## vNext
44

5-
- *Breaking* Make `force_flush()` in `PushMetricExporter` synchronous
5+
- Calls to `MeterProviderBuilder::with_resource`, `TracerProviderBuilder::with_resource`,
6+
`LoggerProviderBuilder::with_resource` are now additive ([#2677](https://github.com/open-telemetry/opentelemetry-rust/pull/2677)).
7+
- *Breaking*: Make `force_flush()` in `PushMetricExporter` synchronous
68
- Moved `ExportError` trait from `opentelemetry::trace::ExportError` to `opentelemetry_sdk::export::ExportError`
79
- Moved `TraceError` enum from `opentelemetry::trace::TraceError` to `opentelemetry_sdk::trace::TraceError`
810
- Moved `TraceResult` type alias from `opentelemetry::trace::TraceResult` to `opentelemetry_sdk::trace::TraceResult`

opentelemetry-sdk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ futures-channel = "0.3"
1717
futures-executor = { workspace = true }
1818
futures-util = { workspace = true, features = ["std", "sink", "async-await-macro"] }
1919
percent-encoding = { version = "2.0", optional = true }
20-
rand = { workspace = true, features = ["std", "std_rng","small_rng"], optional = true }
20+
rand = { workspace = true, features = ["std", "std_rng", "small_rng", "os_rng", "thread_rng"], optional = true }
2121
glob = { version = "0.3.1", optional =true}
2222
serde = { workspace = true, features = ["derive", "rc"], optional = true }
2323
serde_json = { workspace = true, optional = true }

opentelemetry-sdk/benches/context.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
2-
use futures_util::future::BoxFuture;
32
use opentelemetry::{
43
global::BoxedTracer,
54
trace::{
@@ -137,8 +136,8 @@ fn parent_sampled_tracer(inner_sampler: Sampler) -> (SdkTracerProvider, BoxedTra
137136
struct NoopExporter;
138137

139138
impl SpanExporter for NoopExporter {
140-
fn export(&mut self, _spans: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
141-
Box::pin(futures_util::future::ready(Ok(())))
139+
async fn export(&mut self, _spans: Vec<SpanData>) -> OTelSdkResult {
140+
Ok(())
142141
}
143142
}
144143

opentelemetry-sdk/benches/metric.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ fn bench_histogram(bound_count: usize) -> (SharedReader, Histogram<u64>) {
301301

302302
fn histograms(c: &mut Criterion) {
303303
let mut group = c.benchmark_group("Histogram");
304-
let mut rng = rand::thread_rng();
304+
let mut rng = rand::rng();
305305

306306
for bound_size in [10, 49, 50, 1000].iter() {
307307
let (_, hist) = bench_histogram(*bound_size);
@@ -313,7 +313,7 @@ fn histograms(c: &mut Criterion) {
313313
format!("V,{},{},{}", bound_size, attr_size, i),
314314
))
315315
}
316-
let value: u64 = rng.gen_range(0..MAX_BOUND).try_into().unwrap();
316+
let value: u64 = rng.random_range(0..MAX_BOUND).try_into().unwrap();
317317
group.bench_function(
318318
format!("Record{}Attrs{}bounds", attr_size, bound_size),
319319
|b| b.iter(|| hist.record(value, &attributes)),

0 commit comments

Comments
 (0)