Skip to content

Commit baf241a

Browse files
authored
Merge branch 'main' into cijothomas/design-internalog
2 parents fbba592 + a70affd commit baf241a

File tree

23 files changed

+145
-135
lines changed

23 files changed

+145
-135
lines changed

opentelemetry-appender-tracing/CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,32 @@
55
Fixes [1682](https://github.com/open-telemetry/opentelemetry-rust/issues/1682).
66
"spec_unstable_logs_enabled" feature now do not suppress logs for other layers.
77

8+
The special treatment of the "message" field has been extended when recording
9+
string values. With this change, when a log is emitted with a field named
10+
"message" (and string value), its value is directly assigned to the LogRecord’s
11+
body rather than being stored as an attribute named "message". This offers a
12+
slight performance improvement over previous.
13+
14+
For example, the below will now produce LogRecord with the message value
15+
populated as LogRecord's body:
16+
17+
```rust
18+
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]", message = "This is an example message");
19+
```
20+
21+
Previously, Body was only populated when the below style was used.
22+
23+
```rust
24+
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]", "This is an example message");
25+
```
26+
27+
This style, while slightly slower, should still be used when the value is not a
28+
simple string, but require format arguments as in the below example.
29+
30+
```rust
31+
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]", "This is an example message with format arguments {} and {}", "foo", "bar");
32+
```
33+
834
## 0.28.1
935

1036
Released 2025-Feb-12

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,14 @@ impl<LR: LogRecord> tracing::field::Visit for EventVisitor<'_, LR> {
8888
if is_duplicated_metadata(field.name()) {
8989
return;
9090
}
91-
//TODO: Consider special casing "message" to populate body and document
92-
// to users to use message field for log message, to avoid going to the
93-
// record_debug, which has dyn dispatch, string allocation and
94-
// formatting cost.
95-
9691
//TODO: Fix heap allocation. Check if lifetime of &str can be used
9792
// to optimize sync exporter scenario.
98-
self.log_record
99-
.add_attribute(Key::new(field.name()), AnyValue::from(value.to_owned()));
93+
if field.name() == "message" {
94+
self.log_record.set_body(AnyValue::from(value.to_owned()));
95+
} else {
96+
self.log_record
97+
.add_attribute(Key::new(field.name()), AnyValue::from(value.to_owned()));
98+
}
10099
}
101100

102101
fn record_bool(&mut self, field: &tracing_core::Field, value: bool) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ impl HttpExporterBuilder {
120120
.or(env::var(OTEL_EXPORTER_OTLP_TIMEOUT).ok())
121121
{
122122
Some(val) => match val.parse() {
123-
Ok(seconds) => Duration::from_millis(seconds),
123+
Ok(milli_seconds) => Duration::from_millis(milli_seconds),
124124
Err(_) => self.exporter_config.timeout,
125125
},
126126
None => self.exporter_config.timeout,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use opentelemetry_sdk::{
99
};
1010

1111
impl SpanExporter for OtlpHttpClient {
12-
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult {
12+
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResult {
1313
let client = match self
1414
.client
1515
.lock()

opentelemetry-otlp/src/exporter/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const OTEL_EXPORTER_OTLP_PROTOCOL_HTTP_JSON: &str = "http/json";
5252
/// Max waiting time for the backend to process each signal batch, defaults to 10 seconds.
5353
pub const OTEL_EXPORTER_OTLP_TIMEOUT: &str = "OTEL_EXPORTER_OTLP_TIMEOUT";
5454
/// Default max waiting time for the backend to process each signal batch.
55-
pub const OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT: u64 = 10000;
55+
pub const OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT: Duration = Duration::from_millis(10000);
5656

5757
// Endpoints per protocol https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md
5858
#[cfg(feature = "grpc-tonic")]
@@ -87,7 +87,7 @@ impl Default for ExportConfig {
8787
// don't use default_endpoint(protocol) here otherwise we
8888
// won't know if user provided a value
8989
protocol,
90-
timeout: Duration::from_millis(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT),
90+
timeout: OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT,
9191
}
9292
}
9393
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl TonicExporterBuilder {
200200
.or(env::var(OTEL_EXPORTER_OTLP_TIMEOUT).ok())
201201
{
202202
Some(val) => match val.parse() {
203-
Ok(seconds) => Duration::from_millis(seconds),
203+
Ok(milli_seconds) => Duration::from_millis(milli_seconds),
204204
Err(_) => config.timeout,
205205
},
206206
None => config.timeout,

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use core::fmt;
2+
use tokio::sync::Mutex;
23

34
use opentelemetry::otel_debug;
45
use opentelemetry_proto::tonic::collector::trace::v1::{
@@ -23,7 +24,7 @@ pub(crate) struct TonicTracesClient {
2324

2425
struct ClientInner {
2526
client: TraceServiceClient<Channel>,
26-
interceptor: BoxInterceptor,
27+
interceptor: Mutex<BoxInterceptor>,
2728
}
2829

2930
impl fmt::Debug for TonicTracesClient {
@@ -50,26 +51,27 @@ impl TonicTracesClient {
5051
TonicTracesClient {
5152
inner: Some(ClientInner {
5253
client,
53-
interceptor,
54+
interceptor: Mutex::new(interceptor),
5455
}),
5556
resource: Default::default(),
5657
}
5758
}
5859
}
5960

6061
impl SpanExporter for TonicTracesClient {
61-
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult {
62-
let (mut client, metadata, extensions) = match &mut self.inner {
62+
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResult {
63+
let (mut client, metadata, extensions) = match &self.inner {
6364
Some(inner) => {
64-
let (m, e, _) = match inner.interceptor.call(Request::new(())) {
65-
Ok(res) => res.into_parts(),
66-
Err(e) => return Err(OTelSdkError::InternalFailure(e.to_string())),
67-
};
65+
let (m, e, _) = inner
66+
.interceptor
67+
.lock()
68+
.await // tokio::sync::Mutex doesn't return a poisoned error, so we can safely use the interceptor here
69+
.call(Request::new(()))
70+
.map_err(|e| OTelSdkError::InternalFailure(format!("error: {:?}", e)))?
71+
.into_parts();
6872
(inner.client.clone(), m, e)
6973
}
70-
None => {
71-
return Err(OTelSdkError::AlreadyShutdown);
72-
}
74+
None => return Err(OTelSdkError::AlreadyShutdown),
7375
};
7476

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

opentelemetry-otlp/src/span.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ impl SpanExporter {
141141
}
142142

143143
impl opentelemetry_sdk::trace::SpanExporter for SpanExporter {
144-
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult {
145-
match &mut self.client {
144+
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResult {
145+
match &self.client {
146146
#[cfg(feature = "grpc-tonic")]
147147
SupportedTransportClient::Tonic(client) => client.export(batch).await,
148148
#[cfg(any(feature = "http-proto", feature = "http-json"))]

opentelemetry-sdk/CHANGELOG.md

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,48 @@
22

33
## vNext
44

5-
- Calls to `MeterProviderBuilder::with_resource`, `TracerProviderBuilder::with_resource`,
5+
- Calls to `MeterProviderBuilder::with_resource`, `TracerProviderBuilder::with_resource`,
66
`LoggerProviderBuilder::with_resource` are now additive ([#2677](https://github.com/open-telemetry/opentelemetry-rust/pull/2677)).
7-
- *Breaking*: Make `force_flush()` in `PushMetricExporter` synchronous
87
- Moved `ExportError` trait from `opentelemetry::trace::ExportError` to `opentelemetry_sdk::export::ExportError`
98
- Moved `TraceError` enum from `opentelemetry::trace::TraceError` to `opentelemetry_sdk::trace::TraceError`
109
- Moved `TraceResult` type alias from `opentelemetry::trace::TraceResult` to `opentelemetry_sdk::trace::TraceResult`
10+
- *Breaking*: Make `force_flush()` in `PushMetricExporter` synchronous
11+
- **Breaking Change:** Updated the `SpanExporter` trait method signature:
12+
13+
```rust
14+
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult>;
15+
```
16+
17+
to
18+
19+
```rust
20+
fn export(
21+
&mut self,
22+
batch: Vec<SpanData>,
23+
) -> impl std::future::Future<Output = OTelSdkResult> + Send;
24+
```
1125

26+
This affects anyone who writes custom exporters, as custom implementations of SpanExporter
27+
should now define export as an `async fn`:
28+
29+
```rust
30+
impl trace::SpanExporter for CustomExporter {
31+
async fn export(&mut self, batch: Vec<trace::SpanData>) -> OTelSdkResult {
32+
// Implementation here
33+
}
34+
}
35+
```
36+
- **Breaking** The SpanExporter::export() method no longer requires a mutable reference to self.
37+
Before:
38+
```rust
39+
async fn export(&mut self, batch: Vec<SpanData>) -> OTelSdkResult
40+
```
41+
After:
42+
```rust
43+
async fn export(&self, batch: Vec<SpanData>) -> OTelSdkResult
44+
```
45+
Custom exporters will need to internally synchronize any mutable state, if applicable.
46+
1247
## 0.28.0
1348

1449
Released 2025-Feb-10

opentelemetry-sdk/benches/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ fn parent_sampled_tracer(inner_sampler: Sampler) -> (SdkTracerProvider, BoxedTra
136136
struct NoopExporter;
137137

138138
impl SpanExporter for NoopExporter {
139-
async fn export(&mut self, _spans: Vec<SpanData>) -> OTelSdkResult {
139+
async fn export(&self, _spans: Vec<SpanData>) -> OTelSdkResult {
140140
Ok(())
141141
}
142142
}

0 commit comments

Comments
 (0)