Skip to content

Commit 8a19adc

Browse files
authored
Merge branch 'main' into main
2 parents e69b763 + a442d62 commit 8a19adc

File tree

41 files changed

+743
-248
lines changed

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

+743
-248
lines changed

.github/ISSUE_TEMPLATE/BUG-REPORT.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ body:
2828
- type: textarea
2929
id: sdk-version
3030
attributes:
31-
label: label: OpenTelemetry SDK Version (i.e version of `opentelemetry_sdk` crate)
31+
label: OpenTelemetry SDK Version (i.e version of `opentelemetry_sdk` crate)
3232
description: What version of the `opentelemetry_sdk` crate are you using?
3333
placeholder: 0.x, 1.x, etc.
3434
validations:

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ documentation.
3030

3131
| Signal/Component | Overall Status |
3232
| -------------------- | ------------------ |
33+
| Context | Beta |
34+
| Baggage | Beta |
35+
| Propagators | Beta |
3336
| Logs-API | Stable* |
3437
| Logs-SDK | RC |
3538
| Logs-OTLP Exporter | RC |

examples/tracing-jaeger/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ publish = false
88
[dependencies]
99
opentelemetry = { path = "../../opentelemetry" }
1010
opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio"] }
11-
opentelemetry-otlp = { workspace = true, features = ["tonic"] }
11+
opentelemetry-otlp = { workspace = true, features = ["grpc-tonic"] }
1212
tokio = { workspace = true, features = ["full"] }

examples/tracing-jaeger/src/main.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ use opentelemetry::{
33
trace::{TraceContextExt, Tracer},
44
KeyValue,
55
};
6-
use opentelemetry_sdk::trace::{SdkTracerProvider, TraceError};
6+
use opentelemetry_otlp::ExporterBuildError;
7+
use opentelemetry_sdk::trace::SdkTracerProvider;
78
use opentelemetry_sdk::Resource;
89

910
use std::error::Error;
1011

11-
fn init_tracer_provider() -> Result<opentelemetry_sdk::trace::SdkTracerProvider, TraceError> {
12+
fn init_tracer_provider() -> Result<opentelemetry_sdk::trace::SdkTracerProvider, ExporterBuildError>
13+
{
1214
let exporter = opentelemetry_otlp::SpanExporter::builder()
1315
.with_tonic()
1416
.build()?;

opentelemetry-appender-log/CHANGELOG.md

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

33
## vNext
44

5+
- Similar to the `opentelemetry-appender-tracing` fix [2658](https://github.com/open-telemetry/opentelemetry-rust/issues/2658)
6+
InstrumentationScope(Logger) used by the appender now uses an empty ("") named Logger.
7+
Previously, a Logger with name and version of the crate was used.
8+
Receivers (processors, exporters) are expected to use `LogRecord.target()` as scope name.
9+
This is already done in OTLP Exporters, so this change should be transparent to most users.
10+
511
## 0.28.0
612

713
Released 2025-Feb-10

opentelemetry-appender-log/src/lib.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113
use log::{Level, Metadata, Record};
114114
use opentelemetry::{
115115
logs::{AnyValue, LogRecord, Logger, LoggerProvider, Severity},
116-
InstrumentationScope, Key,
116+
Key,
117117
};
118118
#[cfg(feature = "experimental_metadata_attributes")]
119119
use opentelemetry_semantic_conventions::attribute::{
@@ -189,12 +189,13 @@ where
189189
L: Logger + Send + Sync,
190190
{
191191
pub fn new(provider: &P) -> Self {
192-
let scope = InstrumentationScope::builder("opentelemetry-log-appender")
193-
.with_version(env!("CARGO_PKG_VERSION"))
194-
.build();
195-
196-
OpenTelemetryLogBridge {
197-
logger: provider.logger_with_scope(scope),
192+
Self {
193+
// Using empty scope name.
194+
// The name/version of this library itself can be added
195+
// as a Scope attribute once a semantic convention is
196+
// defined for the same.
197+
// See https://github.com/open-telemetry/semantic-conventions/issues/1550
198+
logger: provider.logger(""),
198199
_phantom: Default::default(),
199200
}
200201
}
@@ -985,9 +986,13 @@ mod tests {
985986
);
986987

987988
let logs = exporter.get_emitted_logs().unwrap();
989+
assert_eq!(logs.len(), 1);
990+
991+
let log = logs.first().unwrap();
992+
assert_eq!(log.instrumentation.name(), "");
988993

989994
let get = |needle: &str| -> Option<AnyValue> {
990-
logs[0].record.attributes_iter().find_map(|(k, v)| {
995+
log.record.attributes_iter().find_map(|(k, v)| {
991996
if k.as_str() == needle {
992997
Some(v.clone())
993998
} else {
@@ -1197,9 +1202,13 @@ mod tests {
11971202
);
11981203

11991204
let logs = exporter.get_emitted_logs().unwrap();
1205+
assert_eq!(logs.len(), 1);
1206+
1207+
let log = logs.first().unwrap();
1208+
assert_eq!(log.instrumentation.name(), "");
12001209

12011210
let get = |needle: &str| -> Option<AnyValue> {
1202-
logs[0].record.attributes_iter().find_map(|(k, v)| {
1211+
log.record.attributes_iter().find_map(|(k, v)| {
12031212
if k.as_str() == needle {
12041213
Some(v.clone())
12051214
} else {

opentelemetry-appender-tracing/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ transparent to most users.
4242
implementations (SDK, processor, exporters) to leverage this additional
4343
information to determine if an event is enabled.
4444

45+
- `u64` and `usize` values are stored as `opentelemetry::logs::AnyValue::Int`
46+
when conversion is feasible. Otherwise stored as
47+
`opentelemetry::logs::AnyValue::String`. This avoids unnecessary string
48+
allocation when values can be represented in their original types.
49+
- Byte arrays are stored as `opentelemetry::logs::AnyValue::Bytes` instead
50+
of string.
51+
- perf - small perf improvement by avoiding string allocation of `target`
52+
4553
## 0.28.1
4654

4755
Released 2025-Feb-12

opentelemetry-appender-tracing/benches/logs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
| noop_layer_disabled | 12 ns |
1111
| noop_layer_enabled | 25 ns |
1212
| ot_layer_disabled | 19 ns |
13-
| ot_layer_enabled | 167 ns |
13+
| ot_layer_enabled | 155 ns |
1414
1515
Hardware: Apple M4 Pro
1616
Total Number of Cores: 14 (10 performance and 4 efficiency)
@@ -20,7 +20,7 @@
2020
| noop_layer_disabled | 8 ns |
2121
| noop_layer_enabled | 14 ns |
2222
| ot_layer_disabled | 12 ns |
23-
| ot_layer_enabled | 186 ns |
23+
| ot_layer_enabled | 130 ns |
2424
*/
2525

2626
use criterion::{criterion_group, criterion_main, Criterion};

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ impl<LR: LogRecord> tracing::field::Visit for EventVisitor<'_, LR> {
8080
}
8181
}
8282

83+
fn record_bytes(&mut self, field: &tracing_core::Field, value: &[u8]) {
84+
self.log_record
85+
.add_attribute(Key::new(field.name()), AnyValue::from(value));
86+
}
87+
8388
fn record_str(&mut self, field: &tracing_core::Field, value: &str) {
8489
#[cfg(feature = "experimental_metadata_attributes")]
8590
if is_duplicated_metadata(field.name()) {
@@ -114,6 +119,22 @@ impl<LR: LogRecord> tracing::field::Visit for EventVisitor<'_, LR> {
114119
.add_attribute(Key::new(field.name()), AnyValue::from(value));
115120
}
116121

122+
// TODO: We might need to do similar for record_i128,record_u128 too
123+
// to avoid stringification, unless needed.
124+
fn record_u64(&mut self, field: &tracing::field::Field, value: u64) {
125+
#[cfg(feature = "experimental_metadata_attributes")]
126+
if is_duplicated_metadata(field.name()) {
127+
return;
128+
}
129+
if let Ok(signed) = i64::try_from(value) {
130+
self.log_record
131+
.add_attribute(Key::new(field.name()), AnyValue::from(signed));
132+
} else {
133+
self.log_record
134+
.add_attribute(Key::new(field.name()), AnyValue::from(format!("{value:?}")));
135+
}
136+
}
137+
117138
// TODO: Remaining field types from AnyValue : Bytes, ListAny, Boolean
118139
}
119140

@@ -173,8 +194,7 @@ where
173194

174195
let mut log_record = self.logger.create_log_record();
175196

176-
// TODO: Fix heap allocation
177-
log_record.set_target(target.to_string());
197+
log_record.set_target(target);
178198
log_record.set_event_name(name);
179199
log_record.set_severity_number(severity);
180200
log_record.set_severity_text(metadata.level().as_str());
@@ -331,7 +351,11 @@ mod tests {
331351
let _guard = tracing::subscriber::set_default(subscriber);
332352

333353
// Act
334-
error!(name: "my-event-name", target: "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]");
354+
let small_u64value: u64 = 42;
355+
let big_u64value: u64 = u64::MAX;
356+
let small_usizevalue: usize = 42;
357+
let big_usizevalue: usize = usize::MAX;
358+
error!(name: "my-event-name", target: "my-system", event_id = 20, bytes = &b"abc"[..], small_u64value, big_u64value, small_usizevalue, big_usizevalue, user_name = "otel", user_email = "[email protected]");
335359
assert!(logger_provider.force_flush().is_ok());
336360

337361
// Assert TODO: move to helper methods
@@ -362,9 +386,9 @@ mod tests {
362386

363387
// Validate attributes
364388
#[cfg(not(feature = "experimental_metadata_attributes"))]
365-
assert_eq!(log.record.attributes_iter().count(), 3);
389+
assert_eq!(log.record.attributes_iter().count(), 8);
366390
#[cfg(feature = "experimental_metadata_attributes")]
367-
assert_eq!(log.record.attributes_iter().count(), 7);
391+
assert_eq!(log.record.attributes_iter().count(), 12);
368392
assert!(attributes_contains(
369393
&log.record,
370394
&Key::new("event_id"),
@@ -380,6 +404,31 @@ mod tests {
380404
&Key::new("user_email"),
381405
&AnyValue::String("[email protected]".into())
382406
));
407+
assert!(attributes_contains(
408+
&log.record,
409+
&Key::new("small_u64value"),
410+
&AnyValue::Int(42.into())
411+
));
412+
assert!(attributes_contains(
413+
&log.record,
414+
&Key::new("big_u64value"),
415+
&AnyValue::String(format!("{}", u64::MAX).into())
416+
));
417+
assert!(attributes_contains(
418+
&log.record,
419+
&Key::new("small_usizevalue"),
420+
&AnyValue::Int(42.into())
421+
));
422+
assert!(attributes_contains(
423+
&log.record,
424+
&Key::new("big_usizevalue"),
425+
&AnyValue::String(format!("{}", u64::MAX).into())
426+
));
427+
assert!(attributes_contains(
428+
&log.record,
429+
&Key::new("bytes"),
430+
&AnyValue::Bytes(Box::new(b"abc".to_vec()))
431+
));
383432
#[cfg(feature = "experimental_metadata_attributes")]
384433
{
385434
assert!(attributes_contains(
@@ -753,6 +802,10 @@ mod tests {
753802
TraceFlags::SAMPLED
754803
);
755804

805+
for attribute in log.record.attributes_iter() {
806+
println!("key: {:?}, value: {:?}", attribute.0, attribute.1);
807+
}
808+
756809
// Attributes can be polluted when we don't use this feature.
757810
#[cfg(feature = "experimental_metadata_attributes")]
758811
assert_eq!(log.record.attributes_iter().count(), 4);

opentelemetry-otlp/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
[#2770](https://github.com/open-telemetry/opentelemetry-rust/issues/2770)
99
partially to properly handle `shutdown()` when using `http`. (`tonic` still
1010
does not do proper shutdown)
11+
- *Breaking*
12+
ExporterBuilder's build() method now Result with `ExporterBuildError` being the
13+
Error variant. Previously it returned signal specific errors like `LogError`
14+
from the `opentelemetry_sdk`, which are no longer part of the sdk. No changes
15+
required if you were using unwrap/expect. If you were matching on the returning
16+
Error enum, replace with the enum `ExporterBuildError`. Unlike the previous
17+
`Error` which contained many variants unrelated to building an exporter, the
18+
new one returns specific variants applicable to building an exporter. Some
19+
variants might be applicable only on select features.
1120

1221
## 0.28.0
1322

0 commit comments

Comments
 (0)