#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Version {
pub major: u16,
pub minor: u16,
pub patch: u16,
}
impl Version {
#[must_use]
pub const fn new(major: u16, minor: u16, patch: u16) -> Self {
Self { major, minor, patch }
}
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct Estimate {
pub value: u64,
pub lower_bound: u64,
pub upper_bound: u64,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct EstimateFields {
pub value: u64,
pub lower_bound: u64,
pub upper_bound: u64,
}
impl Estimate {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: EstimateFields) -> Self {
let EstimateFields {
value,
lower_bound,
upper_bound,
} = fields;
Self {
value,
lower_bound,
upper_bound,
}
}
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct Stats {
pub allocated_bytes: u64,
pub deallocated_bytes: u64,
pub live_bytes: u64,
pub peak_live_bytes: u64,
pub mapped_bytes: u64,
pub os_mappings: u64,
pub os_unmappings: u64,
pub allocations: u64,
pub deallocations: u64,
pub remote_frees: u64,
pub pending_remote_blocks: u64,
pub remote_pushes_in_progress: u64,
pub drained_remote_blocks: u64,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct StatsFields {
pub allocated_bytes: u64,
pub deallocated_bytes: u64,
pub live_bytes: u64,
pub peak_live_bytes: u64,
pub mapped_bytes: u64,
pub os_mappings: u64,
pub os_unmappings: u64,
pub allocations: u64,
pub deallocations: u64,
pub remote_frees: u64,
pub pending_remote_blocks: u64,
pub remote_pushes_in_progress: u64,
pub drained_remote_blocks: u64,
}
impl Stats {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: StatsFields) -> Self {
let StatsFields {
allocated_bytes,
deallocated_bytes,
live_bytes,
peak_live_bytes,
mapped_bytes,
os_mappings,
os_unmappings,
allocations,
deallocations,
remote_frees,
pending_remote_blocks,
remote_pushes_in_progress,
drained_remote_blocks,
} = fields;
Self {
allocated_bytes,
deallocated_bytes,
live_bytes,
peak_live_bytes,
mapped_bytes,
os_mappings,
os_unmappings,
allocations,
deallocations,
remote_frees,
pending_remote_blocks,
remote_pushes_in_progress,
drained_remote_blocks,
}
}
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct SizeClass {
pub class_index: u32,
pub block_bytes: u64,
pub live_allocations: Estimate,
pub requested_bytes: Estimate,
pub usable_bytes: Estimate,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct SizeClassFields {
pub class_index: u32,
pub block_bytes: u64,
pub live_allocations: Estimate,
pub requested_bytes: Estimate,
pub usable_bytes: Estimate,
}
impl SizeClass {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: SizeClassFields) -> Self {
let SizeClassFields {
class_index,
block_bytes,
live_allocations,
requested_bytes,
usable_bytes,
} = fields;
Self {
class_index,
block_bytes,
live_allocations,
requested_bytes,
usable_bytes,
}
}
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct Region {
pub region_index: u32,
pub reserved_bytes: u64,
pub used_slices: u64,
pub free_slices: u64,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct RegionFields {
pub region_index: u32,
pub reserved_bytes: u64,
pub used_slices: u64,
pub free_slices: u64,
}
impl Region {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: RegionFields) -> Self {
let RegionFields {
region_index,
reserved_bytes,
used_slices,
free_slices,
} = fields;
Self {
region_index,
reserved_bytes,
used_slices,
free_slices,
}
}
}
#[non_exhaustive]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Domain {
pub domain_id: u64,
pub is_default: bool,
pub region_count: u64,
pub reserved_bytes: u64,
pub used_slices: u64,
pub free_slices: u64,
pub small_slices: u64,
pub medium_slices: u64,
pub bump_slices: u64,
pub unknown_slices: u64,
pub region_indices: Vec<u32>,
}
#[doc(hidden)]
#[derive(Debug)]
pub struct DomainFields {
pub domain_id: u64,
pub is_default: bool,
pub region_count: u64,
pub reserved_bytes: u64,
pub used_slices: u64,
pub free_slices: u64,
pub small_slices: u64,
pub medium_slices: u64,
pub bump_slices: u64,
pub unknown_slices: u64,
pub region_indices: Vec<u32>,
}
impl Domain {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: DomainFields) -> Self {
let DomainFields {
domain_id,
is_default,
region_count,
reserved_bytes,
used_slices,
free_slices,
small_slices,
medium_slices,
bump_slices,
unknown_slices,
region_indices,
} = fields;
Self {
domain_id,
is_default,
region_count,
reserved_bytes,
used_slices,
free_slices,
small_slices,
medium_slices,
bump_slices,
unknown_slices,
region_indices,
}
}
}
#[non_exhaustive]
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Histograms {
pub allocated: Vec<u64>,
pub live: Vec<u64>,
}
#[doc(hidden)]
#[derive(Debug)]
pub struct HistogramsFields {
pub allocated: Vec<u64>,
pub live: Vec<u64>,
}
impl Histograms {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: HistogramsFields) -> Self {
let HistogramsFields { allocated, live } = fields;
Self { allocated, live }
}
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Metadata {
pub wire_format_version: u16,
pub telemetry_schema_version: u16,
pub producer_version: Version,
pub capture_duration_nanos: u64,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct SkippedSection {
pub id: u16,
pub version: u16,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct SkippedSectionFields {
pub id: u16,
pub version: u16,
}
impl SkippedSection {
#[doc(hidden)]
#[must_use]
pub fn from_fields(fields: SkippedSectionFields) -> Self {
let SkippedSectionFields { id, version } = fields;
Self { id, version }
}
}
#[non_exhaustive]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Snapshot {
pub metadata: Metadata,
pub stats: Stats,
pub size_classes: Vec<SizeClass>,
pub regions: Vec<Region>,
pub topology: Vec<crate::topology::TopologyRegion>,
pub domains: Vec<Domain>,
pub callers: Option<crate::callers::Callers>,
pub runtime_events: Option<seismograph::recorder::event::Events>,
pub histograms: Histograms,
pub addresses: Vec<crate::callers::AddressLookup>,
pub skipped_sections: Vec<SkippedSection>,
}
impl Snapshot {
#[must_use]
pub fn new(producer_version: Version) -> Self {
Self {
metadata: Metadata {
wire_format_version: crate::wire::format::Header::new(1, producer_version).wire_format(),
telemetry_schema_version: crate::TELEMETRY_SCHEMA_VERSION,
producer_version,
capture_duration_nanos: 0,
},
stats: Stats::default(),
size_classes: Vec::new(),
regions: Vec::new(),
topology: Vec::new(),
domains: Vec::new(),
callers: None,
runtime_events: None,
histograms: Histograms::default(),
addresses: Vec::new(),
skipped_sections: Vec::new(),
}
}
}