#[non_exhaustive]pub struct HostView<'a> { /* private fields */ }Expand description
Borrowed view over the per-sample per-CPU PerCpuTimeStats data
that the host capture pipeline populates into each
FailureDumpReport::per_cpu_time. Returned by
SampleSeries::host; exposes a per-CPU timeline (rows sorted
ascending by elapsed-ms, stable on ties) plus a closure-based
projector that emits a SeriesField<u64> compatible with the
temporal-assertion patterns in crate::assert::temporal.
Orthogonal to super::MonitorView: this view is the per-sample
per-CPU TIMELINE source; MonitorView exposes the per-VM-run
cross-CPU AGGREGATE. The two draw from different fields on the
captured reports (FailureDumpReport::per_cpu_time here vs
MonitorReport.summary for the monitor view) and never overlap.
Placeholder samples (the freeze rendezvous timed out, the
capture pipeline otherwise failed) carry an empty per_cpu_time
slice and naturally drop out of every per-CPU timeline without
an explicit filter — temporal-assertion patterns see the
surrounding non-placeholder samples in order.
Implementations§
Source§impl<'a> HostView<'a>
impl<'a> HostView<'a>
Sourcepub fn cpus(&self) -> Vec<u32>
pub fn cpus(&self) -> Vec<u32>
Discover every CPU id that appears in at least one sample’s
per_cpu_time slice. Returned in ascending order, deduped.
Useful for “fan-out over every captured CPU” assertion
loops: for cpu in host.cpus() { ... }.
Sourcepub fn per_cpu_time_timeline(&self, cpu: u32) -> Vec<(u64, &'a PerCpuTimeStats)>
pub fn per_cpu_time_timeline(&self, cpu: u32) -> Vec<(u64, &'a PerCpuTimeStats)>
Per-CPU timeline: every sample that captured cpu, sorted
ascending by elapsed_ms. Ties retain insertion order
(stable sort). Samples whose per_cpu_time slice didn’t
include cpu (placeholder reports, or a kernel without
per-CPU stats) are absent from the returned timeline rather
than producing a default-zero row that would silently advance
counter-style assertions.
Returns an empty Vec when cpu was not captured in any
sample. Test authors that need explicit per-sample
coverage discrimination iterate via
SampleSeries::iter_samples and consult
crate::scenario::snapshot::Snapshot::per_cpu_time_at per
sample.
Inherits the first-match-wins contract for duplicate-cpu
entries from
crate::scenario::snapshot::Snapshot::per_cpu_time_at:
production walker (collect_per_cpu_time) enforces one
entry per cpu per sample, but the lookup leaves the contract
first-match for graceful degradation on a malformed report.
Samples whose elapsed_ms is None (the bridge recorded no
timestamp) are EXCLUDED: a timestamp-less sample has
no position on a time-ordered axis, and placing it at a
fabricated 0 would corrupt the ascending-by-time contract.
Sourcepub fn per_cpu_field_u64(
&self,
cpu: u32,
label: impl Into<String>,
project: impl Fn(&PerCpuTimeStats) -> u64,
) -> SeriesField<u64>
pub fn per_cpu_field_u64( &self, cpu: u32, label: impl Into<String>, project: impl Fn(&PerCpuTimeStats) -> u64, ) -> SeriesField<u64>
Project a single u64 field out of each per-sample
PerCpuTimeStats row for cpu into a SeriesField<u64>
suitable for the temporal-assertion patterns
(nondecreasing, rate_within, steady_within,
converges_to, etc.) in crate::assert::temporal. Mirrors
the shape of SampleSeries::bpf so identical assertion
pipelines compose against either axis.
Samples whose per_cpu_time slice didn’t include cpu
surface as a per-sample
SnapshotError::HostFieldUnavailable
slot — gap-tolerant temporal patterns skip with a rendered
Note, strict patterns fail the assertion so coverage gaps
can never silently slip past the call site.
Trait Implementations§
impl<'a> Copy for HostView<'a>
Auto Trait Implementations§
impl<'a> Freeze for HostView<'a>
impl<'a> RefUnwindSafe for HostView<'a>
impl<'a> Send for HostView<'a>
impl<'a> Sync for HostView<'a>
impl<'a> Unpin for HostView<'a>
impl<'a> UnwindSafe for HostView<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more