Skip to content

Commit 723ad20

Browse files
committed
perf: Suppress telemetry using ContextFlags(u32) instead of bool
The code seems to be highly sensitive to alignment, so use a bitfield instead of a boolean.
1 parent 24b92cb commit 723ad20

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

opentelemetry/src/context.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ pub struct Context {
9797
#[cfg(feature = "trace")]
9898
pub(crate) span: Option<Arc<SynchronizedSpan>>,
9999
entries: Option<Arc<EntryMap>>,
100-
suppress_telemetry: bool,
100+
flags: ContextFlags,
101101
}
102102

103103
type EntryMap = HashMap<TypeId, Arc<dyn Any + Sync + Send>, BuildHasherDefault<IdHasher>>;
@@ -245,7 +245,7 @@ impl Context {
245245
entries,
246246
#[cfg(feature = "trace")]
247247
span: self.span.clone(),
248-
suppress_telemetry: self.suppress_telemetry,
248+
flags: self.flags,
249249
}
250250
}
251251

@@ -335,7 +335,7 @@ impl Context {
335335
/// Returns whether telemetry is suppressed in this context.
336336
#[inline]
337337
pub fn is_telemetry_suppressed(&self) -> bool {
338-
self.suppress_telemetry
338+
self.flags.is_telemetry_suppressed()
339339
}
340340

341341
/// Returns a new context with telemetry suppression enabled.
@@ -344,7 +344,7 @@ impl Context {
344344
entries: self.entries.clone(),
345345
#[cfg(feature = "trace")]
346346
span: self.span.clone(),
347-
suppress_telemetry: true,
347+
flags: self.flags.with_telemetry_suppressed(),
348348
}
349349
}
350350

@@ -413,7 +413,7 @@ impl Context {
413413
Self::map_current(|cx| Context {
414414
span: Some(Arc::new(value)),
415415
entries: cx.entries.clone(),
416-
suppress_telemetry: cx.suppress_telemetry,
416+
flags: cx.flags,
417417
})
418418
}
419419

@@ -422,7 +422,7 @@ impl Context {
422422
Context {
423423
span: Some(Arc::new(value)),
424424
entries: self.entries.clone(),
425-
suppress_telemetry: self.suppress_telemetry,
425+
flags: self.flags,
426426
}
427427
}
428428
}
@@ -446,7 +446,7 @@ impl fmt::Debug for Context {
446446
let entries = self.entries.as_ref().map_or(0, |e| e.len());
447447

448448
dbg.field("entries count", &entries)
449-
.field("suppress_telemetry", &self.suppress_telemetry)
449+
.field("suppress_telemetry", &self.flags.is_telemetry_suppressed())
450450
.finish()
451451
}
452452
}
@@ -605,6 +605,23 @@ impl Default for ContextStack {
605605
}
606606
}
607607

608+
#[derive(Clone, Copy, Default)]
609+
struct ContextFlags(u32);
610+
611+
impl ContextFlags {
612+
const TELEMETRY_SUPPRESSED: u32 = 1;
613+
614+
#[inline(always)]
615+
fn is_telemetry_suppressed(&self) -> bool {
616+
self.0 & Self::TELEMETRY_SUPPRESSED != 0
617+
}
618+
619+
#[inline(always)]
620+
fn with_telemetry_suppressed(&self) -> Self {
621+
Self(self.0 | Self::TELEMETRY_SUPPRESSED)
622+
}
623+
}
624+
608625
#[cfg(test)]
609626
mod tests {
610627
use super::*;

0 commit comments

Comments
 (0)