Skip to content

Commit 01874de

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

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

opentelemetry/src/context.rs

+26-7
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,13 @@ thread_local! {
9393
/// assert_eq!(current.get::<ValueB>(), None);
9494
/// ```
9595
#[derive(Clone, Default)]
96+
// 16-byte alignment for performance, which should be ok on 32-bit systems too
97+
#[repr(align(16))]
9698
pub struct Context {
9799
#[cfg(feature = "trace")]
98100
pub(crate) span: Option<Arc<SynchronizedSpan>>,
99101
entries: Option<Arc<EntryMap>>,
100-
suppress_telemetry: bool,
102+
flags: ContextFlags,
101103
}
102104

103105
type EntryMap = HashMap<TypeId, Arc<dyn Any + Sync + Send>, BuildHasherDefault<IdHasher>>;
@@ -245,7 +247,7 @@ impl Context {
245247
entries,
246248
#[cfg(feature = "trace")]
247249
span: self.span.clone(),
248-
suppress_telemetry: self.suppress_telemetry,
250+
flags: self.flags,
249251
}
250252
}
251253

@@ -335,7 +337,7 @@ impl Context {
335337
/// Returns whether telemetry is suppressed in this context.
336338
#[inline]
337339
pub fn is_telemetry_suppressed(&self) -> bool {
338-
self.suppress_telemetry
340+
self.flags.is_telemetry_suppressed()
339341
}
340342

341343
/// Returns a new context with telemetry suppression enabled.
@@ -344,7 +346,7 @@ impl Context {
344346
entries: self.entries.clone(),
345347
#[cfg(feature = "trace")]
346348
span: self.span.clone(),
347-
suppress_telemetry: true,
349+
flags: self.flags.with_telemetry_suppressed(),
348350
}
349351
}
350352

@@ -413,7 +415,7 @@ impl Context {
413415
Self::map_current(|cx| Context {
414416
span: Some(Arc::new(value)),
415417
entries: cx.entries.clone(),
416-
suppress_telemetry: cx.suppress_telemetry,
418+
flags: cx.flags,
417419
})
418420
}
419421

@@ -422,7 +424,7 @@ impl Context {
422424
Context {
423425
span: Some(Arc::new(value)),
424426
entries: self.entries.clone(),
425-
suppress_telemetry: self.suppress_telemetry,
427+
flags: self.flags,
426428
}
427429
}
428430
}
@@ -446,7 +448,7 @@ impl fmt::Debug for Context {
446448
let entries = self.entries.as_ref().map_or(0, |e| e.len());
447449

448450
dbg.field("entries count", &entries)
449-
.field("suppress_telemetry", &self.suppress_telemetry)
451+
.field("suppress_telemetry", &self.flags.is_telemetry_suppressed())
450452
.finish()
451453
}
452454
}
@@ -605,6 +607,23 @@ impl Default for ContextStack {
605607
}
606608
}
607609

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

0 commit comments

Comments
 (0)