Skip to content

Commit b1f51d9

Browse files
Merge branch 'main' into modify-batchProcessor-test-use-flush-instead-of-sleeptime
2 parents dbf3f5f + 37efb88 commit b1f51d9

File tree

49 files changed

+487
-365
lines changed

Some content is hidden

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

49 files changed

+487
-365
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"

examples/tracing-jaeger/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use opentelemetry::{
22
global,
3-
trace::{TraceContextExt, TraceError, Tracer},
3+
trace::{TraceContextExt, Tracer},
44
KeyValue,
55
};
6-
use opentelemetry_sdk::trace::SdkTracerProvider;
6+
use opentelemetry_sdk::trace::{SdkTracerProvider, TraceError};
77
use opentelemetry_sdk::Resource;
88

99
use std::error::Error;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ impl HttpExporterBuilder {
210210
#[cfg(feature = "trace")]
211211
pub fn build_span_exporter(
212212
mut self,
213-
) -> Result<crate::SpanExporter, opentelemetry::trace::TraceError> {
213+
) -> Result<crate::SpanExporter, opentelemetry_sdk::trace::TraceError> {
214214
use crate::{
215215
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_HEADERS,
216216
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
@@ -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
@@ -301,7 +301,7 @@ impl OtlpHttpClient {
301301
fn build_trace_export_body(
302302
&self,
303303
spans: Vec<SpanData>,
304-
) -> opentelemetry::trace::TraceResult<(Vec<u8>, &'static str)> {
304+
) -> opentelemetry_sdk::trace::TraceResult<(Vec<u8>, &'static str)> {
305305
use opentelemetry_proto::tonic::collector::trace::v1::ExportTraceServiceRequest;
306306
let resource_spans = group_spans_by_resource_and_scope(spans, &self.resource);
307307

@@ -310,7 +310,7 @@ impl OtlpHttpClient {
310310
#[cfg(feature = "http-json")]
311311
Protocol::HttpJson => match serde_json::to_string_pretty(&req) {
312312
Ok(json) => Ok((json.into(), "application/json")),
313-
Err(e) => Err(opentelemetry::trace::TraceError::from(e.to_string())),
313+
Err(e) => Err(opentelemetry_sdk::trace::TraceError::from(e.to_string())),
314314
},
315315
_ => Ok((req.encode_to_vec(), "application/x-protobuf")),
316316
}

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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ impl TonicExporterBuilder {
303303
#[cfg(feature = "trace")]
304304
pub(crate) fn build_span_exporter(
305305
self,
306-
) -> Result<crate::SpanExporter, opentelemetry::trace::TraceError> {
306+
) -> Result<crate::SpanExporter, opentelemetry_sdk::trace::TraceError> {
307307
use crate::exporter::tonic::trace::TonicTracesClient;
308308

309309
otel_debug!(name: "TracesTonicChannelBuilding");
@@ -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/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -384,12 +384,6 @@ impl ExportError for Error {
384384
}
385385
}
386386

387-
impl opentelemetry::trace::ExportError for Error {
388-
fn exporter_name(&self) -> &'static str {
389-
"otlp"
390-
}
391-
}
392-
393387
/// The communication protocol to use when exporting data.
394388
#[cfg_attr(feature = "serialize", derive(Deserialize, Serialize))]
395389
#[derive(Clone, Copy, Debug, Eq, PartialEq)]

opentelemetry-otlp/src/span.rs

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
55
use std::fmt::Debug;
66

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

1110
#[cfg(feature = "grpc-tonic")]
1211
use crate::{
@@ -63,18 +62,18 @@ impl SpanExporterBuilder<NoExporterBuilderSet> {
6362

6463
#[cfg(feature = "grpc-tonic")]
6564
impl SpanExporterBuilder<TonicExporterBuilderSet> {
66-
pub fn build(self) -> Result<SpanExporter, opentelemetry::trace::TraceError> {
65+
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> {
75-
pub fn build(self) -> Result<SpanExporter, opentelemetry::trace::TraceError> {
74+
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-otlp/tests/integration_test/tests/traces.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
use std::{fs::File, os::unix::fs::MetadataExt};
44

55
use integration_test_runner::trace_asserter::{read_spans_from_json, TraceAsserter};
6-
use opentelemetry::trace::TraceError;
76
use opentelemetry_otlp::SpanExporter;
87

98
use anyhow::Result;
109
use ctor::dtor;
1110
use integration_test_runner::test_utils;
1211
use opentelemetry_sdk::{trace as sdktrace, Resource};
1312

14-
fn init_tracer_provider() -> Result<sdktrace::SdkTracerProvider, TraceError> {
13+
fn init_tracer_provider() -> Result<sdktrace::SdkTracerProvider, sdktrace::TraceError> {
1514
let exporter_builder = SpanExporter::builder();
1615
#[cfg(feature = "tonic-client")]
1716
let exporter_builder = exporter_builder.with_tonic();

opentelemetry-sdk/CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
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
8+
- Moved `ExportError` trait from `opentelemetry::trace::ExportError` to `opentelemetry_sdk::export::ExportError`
9+
- Moved `TraceError` enum from `opentelemetry::trace::TraceError` to `opentelemetry_sdk::trace::TraceError`
10+
- Moved `TraceResult` type alias from `opentelemetry::trace::TraceResult` to `opentelemetry_sdk::trace::TraceResult`
611

712
## 0.28.0
813

0 commit comments

Comments
 (0)