Skip to content

Commit 1ef6d0f

Browse files
authored
Merge branch 'main' into cijothomas/periodicreader-tests
2 parents 87e19b6 + 967dc93 commit 1ef6d0f

File tree

9 files changed

+128
-86
lines changed

9 files changed

+128
-86
lines changed

Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ tonic = { version = "0.12.3", default-features = false }
4444
tonic-build = "0.12"
4545
tokio = { version = "1", default-features = false }
4646
tokio-stream = "0.1"
47-
tracing = { version = "0.1", default-features = false }
48-
tracing-core = { version = "0.1", default-features = false }
47+
# Using `tracing 0.1.40` because 0.1.39 (which is yanked) introduces the ability to set event names in macros,
48+
# required for OpenTelemetry's internal logging macros.
49+
tracing = { version = ">=0.1.40", default-features = false }
50+
# `tracing-core >=0.1.33` is required for compatibility with `tracing >=0.1.40`.
51+
tracing-core = { version = ">=0.1.33", default-features = false }
4952
tracing-subscriber = { version = "0.3", default-features = false }
5053
url = { version = "2.5", default-features = false }

opentelemetry-appender-log/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -846,11 +846,11 @@ mod tests {
846846

847847
assert_eq!(logs.len(), 5);
848848
for log in logs {
849-
let body: String = match log.record.body.as_ref().unwrap() {
849+
let body: String = match log.record.body().unwrap() {
850850
super::AnyValue::String(s) => s.to_string(),
851851
_ => panic!("AnyValue::String expected"),
852852
};
853-
assert_eq!(body, log.record.severity_text.unwrap());
853+
assert_eq!(body, log.record.severity_text().unwrap());
854854
}
855855
}
856856

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,10 @@ mod tests {
334334

335335
// Validate common fields
336336
assert_eq!(log.instrumentation.name(), "opentelemetry-appender-tracing");
337-
assert_eq!(log.record.severity_number, Some(Severity::Error));
337+
assert_eq!(log.record.severity_number(), Some(Severity::Error));
338338

339339
// Validate trace context is none.
340-
assert!(log.record.trace_context.is_none());
340+
assert!(log.record.trace_context().is_none());
341341

342342
// Validate attributes
343343
#[cfg(not(feature = "experimental_metadata_attributes"))]
@@ -428,25 +428,20 @@ mod tests {
428428

429429
// validate common fields.
430430
assert_eq!(log.instrumentation.name(), "opentelemetry-appender-tracing");
431-
assert_eq!(log.record.severity_number, Some(Severity::Error));
431+
assert_eq!(log.record.severity_number(), Some(Severity::Error));
432432

433433
// validate trace context.
434-
assert!(log.record.trace_context.is_some());
434+
assert!(log.record.trace_context().is_some());
435435
assert_eq!(
436-
log.record.trace_context.as_ref().unwrap().trace_id,
436+
log.record.trace_context().unwrap().trace_id,
437437
trace_id_expected
438438
);
439439
assert_eq!(
440-
log.record.trace_context.as_ref().unwrap().span_id,
440+
log.record.trace_context().unwrap().span_id,
441441
span_id_expected
442442
);
443443
assert_eq!(
444-
log.record
445-
.trace_context
446-
.as_ref()
447-
.unwrap()
448-
.trace_flags
449-
.unwrap(),
444+
log.record.trace_context().unwrap().trace_flags.unwrap(),
450445
TraceFlags::SAMPLED
451446
);
452447

@@ -526,10 +521,10 @@ mod tests {
526521

527522
// Validate common fields
528523
assert_eq!(log.instrumentation.name(), "opentelemetry-appender-tracing");
529-
assert_eq!(log.record.severity_number, Some(Severity::Error));
524+
assert_eq!(log.record.severity_number(), Some(Severity::Error));
530525

531526
// Validate trace context is none.
532-
assert!(log.record.trace_context.is_none());
527+
assert!(log.record.trace_context().is_none());
533528

534529
// Attributes can be polluted when we don't use this feature.
535530
#[cfg(feature = "experimental_metadata_attributes")]
@@ -605,25 +600,20 @@ mod tests {
605600

606601
// validate common fields.
607602
assert_eq!(log.instrumentation.name(), "opentelemetry-appender-tracing");
608-
assert_eq!(log.record.severity_number, Some(Severity::Error));
603+
assert_eq!(log.record.severity_number(), Some(Severity::Error));
609604

610605
// validate trace context.
611-
assert!(log.record.trace_context.is_some());
606+
assert!(log.record.trace_context().is_some());
612607
assert_eq!(
613-
log.record.trace_context.as_ref().unwrap().trace_id,
608+
log.record.trace_context().unwrap().trace_id,
614609
trace_id_expected
615610
);
616611
assert_eq!(
617-
log.record.trace_context.as_ref().unwrap().span_id,
612+
log.record.trace_context().unwrap().span_id,
618613
span_id_expected
619614
);
620615
assert_eq!(
621-
log.record
622-
.trace_context
623-
.as_ref()
624-
.unwrap()
625-
.trace_flags
626-
.unwrap(),
616+
log.record.trace_context().unwrap().trace_flags.unwrap(),
627617
TraceFlags::SAMPLED
628618
);
629619

opentelemetry-proto/src/transform/logs.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ pub mod tonic {
5858

5959
impl From<&opentelemetry_sdk::logs::LogRecord> for LogRecord {
6060
fn from(log_record: &opentelemetry_sdk::logs::LogRecord) -> Self {
61-
let trace_context = log_record.trace_context.as_ref();
62-
let severity_number = match log_record.severity_number {
61+
let trace_context = log_record.trace_context();
62+
let severity_number = match log_record.severity_number() {
6363
Some(Severity::Trace) => SeverityNumber::Trace,
6464
Some(Severity::Trace2) => SeverityNumber::Trace2,
6565
Some(Severity::Trace3) => SeverityNumber::Trace3,
@@ -88,8 +88,8 @@ pub mod tonic {
8888
};
8989

9090
LogRecord {
91-
time_unix_nano: log_record.timestamp.map(to_nanos).unwrap_or_default(),
92-
observed_time_unix_nano: to_nanos(log_record.observed_timestamp.unwrap()),
91+
time_unix_nano: log_record.timestamp().map(to_nanos).unwrap_or_default(),
92+
observed_time_unix_nano: to_nanos(log_record.observed_timestamp().unwrap()),
9393
attributes: {
9494
let attributes: Vec<KeyValue> = log_record
9595
.attributes_iter()
@@ -102,7 +102,7 @@ pub mod tonic {
102102
.collect();
103103
#[cfg(feature = "populate-logs-event-name")]
104104
{
105-
if let Some(event_name) = &log_record.event_name {
105+
if let Some(event_name) = &log_record.event_name() {
106106
let mut attributes_with_name = attributes;
107107
attributes_with_name.push(KeyValue {
108108
key: "event.name".into(),
@@ -119,8 +119,11 @@ pub mod tonic {
119119
attributes
120120
},
121121
severity_number: severity_number.into(),
122-
severity_text: log_record.severity_text.map(Into::into).unwrap_or_default(),
123-
body: log_record.body.clone().map(Into::into),
122+
severity_text: log_record
123+
.severity_text()
124+
.map(Into::into)
125+
.unwrap_or_default(),
126+
body: log_record.body().cloned().map(Into::into),
124127
dropped_attributes_count: 0,
125128
flags: trace_context
126129
.map(|ctx| {
@@ -170,7 +173,7 @@ pub mod tonic {
170173
.schema_url()
171174
.map(ToOwned::to_owned)
172175
.unwrap_or_default(),
173-
scope: Some((instrumentation, log_record.target.clone()).into()),
176+
scope: Some((instrumentation, log_record.target().cloned()).into()),
174177
log_records: vec![log_record.into()],
175178
}],
176179
}
@@ -193,8 +196,8 @@ pub mod tonic {
193196
>,
194197
(log_record, instrumentation)| {
195198
let key = log_record
196-
.target
197-
.clone()
199+
.target()
200+
.cloned()
198201
.unwrap_or_else(|| Cow::Owned(instrumentation.name().to_owned()));
199202
scope_map
200203
.entry(key)

opentelemetry-sdk/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@
9696
- Bump msrv to 1.75.0.
9797

9898

99+
- *Breaking* : [#2314](https://github.com/open-telemetry/opentelemetry-rust/pull/2314)
100+
- The LogRecord struct has been updated:
101+
- All fields are now pub(crate) instead of pub.
102+
- Getter methods have been introduced to access field values.
103+
This change impacts custom exporter and processor developers by requiring updates to code that directly accessed LogRecord fields. They must now use the provided getter methods (e.g., `log_record.event_name()` instead of `log_record.event_name`).
104+
105+
- Upgrade the tracing crate used for internal logging to version 0.1.40 or later. This is necessary because the internal logging macros utilize the name field as
106+
metadata, a feature introduced in version 0.1.40. [#2418](https://github.com/open-telemetry/opentelemetry-rust/pull/2418)
107+
99108
## 0.27.1
100109

101110
Released 2024-Nov-27

opentelemetry-sdk/src/logs/record.rs

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,28 @@ pub(crate) type LogRecordAttributes =
2424
/// is provided to `LogExporter`s as input.
2525
pub struct LogRecord {
2626
/// Event name. Optional as not all the logging API support it.
27-
pub event_name: Option<&'static str>,
27+
pub(crate) event_name: Option<&'static str>,
2828

2929
/// Target of the log record
30-
pub target: Option<Cow<'static, str>>,
30+
pub(crate) target: Option<Cow<'static, str>>,
3131

3232
/// Record timestamp
33-
pub timestamp: Option<SystemTime>,
33+
pub(crate) timestamp: Option<SystemTime>,
3434

3535
/// Timestamp for when the record was observed by OpenTelemetry
36-
pub observed_timestamp: Option<SystemTime>,
36+
pub(crate) observed_timestamp: Option<SystemTime>,
3737

3838
/// Trace context for logs associated with spans
39-
pub trace_context: Option<TraceContext>,
39+
pub(crate) trace_context: Option<TraceContext>,
4040

4141
/// The original severity string from the source
42-
pub severity_text: Option<&'static str>,
42+
pub(crate) severity_text: Option<&'static str>,
4343

4444
/// The corresponding severity value, normalized
45-
pub severity_number: Option<Severity>,
45+
pub(crate) severity_number: Option<Severity>,
4646

4747
/// Record body
48-
pub body: Option<AnyValue>,
48+
pub(crate) body: Option<AnyValue>,
4949

5050
/// Additional attributes associated with this record
5151
pub(crate) attributes: LogRecordAttributes,
@@ -118,7 +118,56 @@ impl opentelemetry::logs::LogRecord for LogRecord {
118118
}
119119

120120
impl LogRecord {
121+
/// Returns the event name
122+
#[inline]
123+
pub fn event_name(&self) -> Option<&'static str> {
124+
self.event_name
125+
}
126+
127+
/// Returns the target
128+
#[inline]
129+
pub fn target(&self) -> Option<&Cow<'static, str>> {
130+
self.target.as_ref()
131+
}
132+
133+
/// Returns the timestamp
134+
#[inline]
135+
pub fn timestamp(&self) -> Option<SystemTime> {
136+
self.timestamp
137+
}
138+
139+
/// Returns the observed timestamp
140+
#[inline]
141+
pub fn observed_timestamp(&self) -> Option<SystemTime> {
142+
self.observed_timestamp
143+
}
144+
145+
/// Returns the trace context
146+
#[inline]
147+
pub fn trace_context(&self) -> Option<&TraceContext> {
148+
self.trace_context.as_ref()
149+
}
150+
151+
/// Returns the severity text
152+
#[inline]
153+
pub fn severity_text(&self) -> Option<&'static str> {
154+
self.severity_text
155+
}
156+
157+
/// Returns the severity number
158+
#[inline]
159+
pub fn severity_number(&self) -> Option<Severity> {
160+
self.severity_number
161+
}
162+
163+
/// Returns the body
164+
#[inline]
165+
pub fn body(&self) -> Option<&AnyValue> {
166+
self.body.as_ref()
167+
}
168+
121169
/// Provides an iterator over the attributes.
170+
#[inline]
122171
pub fn attributes_iter(&self) -> impl Iterator<Item = &(Key, AnyValue)> {
123172
self.attributes.iter().filter_map(|opt| opt.as_ref())
124173
}

opentelemetry-sdk/src/metrics/meter_provider.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub struct SdkMeterProvider {
3838
struct SdkMeterProviderInner {
3939
pipes: Arc<Pipelines>,
4040
meters: Mutex<HashMap<InstrumentationScope, Arc<SdkMeter>>>,
41-
is_shutdown: AtomicBool,
41+
shutdown_invoked: AtomicBool,
4242
}
4343

4444
impl Default for SdkMeterProvider {
@@ -119,20 +119,29 @@ impl SdkMeterProvider {
119119

120120
impl SdkMeterProviderInner {
121121
fn force_flush(&self) -> MetricResult<()> {
122-
self.pipes.force_flush()
122+
if self
123+
.shutdown_invoked
124+
.load(std::sync::atomic::Ordering::Relaxed)
125+
{
126+
Err(MetricError::Other(
127+
"Cannot perform flush as MeterProvider shutdown already invoked.".into(),
128+
))
129+
} else {
130+
self.pipes.force_flush()
131+
}
123132
}
124133

125134
fn shutdown(&self) -> MetricResult<()> {
126135
if self
127-
.is_shutdown
128-
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
129-
.is_ok()
136+
.shutdown_invoked
137+
.swap(true, std::sync::atomic::Ordering::SeqCst)
130138
{
131-
self.pipes.shutdown()
132-
} else {
139+
// If the previous value was true, shutdown was already invoked.
133140
Err(MetricError::Other(
134-
"metrics provider already shut down".into(),
141+
"MeterProvider shutdown already invoked.".into(),
135142
))
143+
} else {
144+
self.pipes.shutdown()
136145
}
137146
}
138147
}
@@ -141,7 +150,7 @@ impl Drop for SdkMeterProviderInner {
141150
fn drop(&mut self) {
142151
// If user has already shutdown the provider manually by calling
143152
// shutdown(), then we don't need to call shutdown again.
144-
if self.is_shutdown.load(Ordering::Relaxed) {
153+
if self.shutdown_invoked.load(Ordering::Relaxed) {
145154
otel_debug!(
146155
name: "MeterProvider.Drop.AlreadyShutdown",
147156
message = "MeterProvider was already shut down; drop will not attempt shutdown again."
@@ -173,7 +182,7 @@ impl MeterProvider for SdkMeterProvider {
173182
}
174183

175184
fn meter_with_scope(&self, scope: InstrumentationScope) -> Meter {
176-
if self.inner.is_shutdown.load(Ordering::Relaxed) {
185+
if self.inner.shutdown_invoked.load(Ordering::Relaxed) {
177186
otel_debug!(
178187
name: "MeterProvider.NoOpMeterReturned",
179188
meter_name = scope.name(),
@@ -270,7 +279,7 @@ impl MeterProviderBuilder {
270279
self.views,
271280
)),
272281
meters: Default::default(),
273-
is_shutdown: AtomicBool::new(false),
282+
shutdown_invoked: AtomicBool::new(false),
274283
}),
275284
};
276285

0 commit comments

Comments
 (0)