Skip to content

Commit 98eccc6

Browse files
authored
Merge branch 'main' into cijothomas/addscott-approver
2 parents 289a41f + c072629 commit 98eccc6

File tree

30 files changed

+352
-253
lines changed

30 files changed

+352
-253
lines changed

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-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: 4 additions & 4 deletions
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,
@@ -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,
@@ -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/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: 2 additions & 2 deletions
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,
@@ -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");

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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use std::fmt::Debug;
66

77
use opentelemetry_sdk::error::OTelSdkResult;
8-
use opentelemetry_sdk::trace::SpanData;
8+
use opentelemetry_sdk::trace::{SpanData, TraceError};
99

1010
#[cfg(feature = "grpc-tonic")]
1111
use crate::{
@@ -62,7 +62,7 @@ impl SpanExporterBuilder<NoExporterBuilderSet> {
6262

6363
#[cfg(feature = "grpc-tonic")]
6464
impl SpanExporterBuilder<TonicExporterBuilderSet> {
65-
pub fn build(self) -> Result<SpanExporter, opentelemetry::trace::TraceError> {
65+
pub fn build(self) -> Result<SpanExporter, TraceError> {
6666
let span_exporter = self.client.0.build_span_exporter()?;
6767
opentelemetry::otel_debug!(name: "SpanExporterBuilt");
6868
Ok(span_exporter)
@@ -71,7 +71,7 @@ impl SpanExporterBuilder<TonicExporterBuilderSet> {
7171

7272
#[cfg(any(feature = "http-proto", feature = "http-json"))]
7373
impl SpanExporterBuilder<HttpExporterBuilderSet> {
74-
pub fn build(self) -> Result<SpanExporter, opentelemetry::trace::TraceError> {
74+
pub fn build(self) -> Result<SpanExporter, TraceError> {
7575
let span_exporter = self.client.0.build_span_exporter()?;
7676
Ok(span_exporter)
7777
}

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: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,37 @@
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+
- Moved `ExportError` trait from `opentelemetry::trace::ExportError` to `opentelemetry_sdk::export::ExportError`
8+
- Moved `TraceError` enum from `opentelemetry::trace::TraceError` to `opentelemetry_sdk::trace::TraceError`
9+
- 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+
```
25+
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+
```
636

737
## 0.28.0
838

0 commit comments

Comments
 (0)