use std::collections::HashMap;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[repr(u8)]
#[serde(rename_all = "snake_case")]
pub(crate) enum SchedulingDelayKind {
Spawn = 0,
Wake = 1,
WakeDuringPoll = 2,
}
impl SchedulingDelayKind {
pub(crate) fn from_u8(value: u8) -> Option<Self> {
match value {
0 => Some(Self::Spawn),
1 => Some(Self::Wake),
2 => Some(Self::WakeDuringPoll),
_ => None,
}
}
}
#[derive(Debug, Clone)]
pub(crate) struct ResolvedSample {
pub(crate) timestamp_ns: u64,
pub(crate) stack_id: [u8; 16],
pub(crate) worker_id: Option<u32>,
pub(crate) source: u8,
pub(crate) source_key: String,
pub(crate) host: String,
pub(crate) service: String,
pub(crate) date: String,
pub(crate) poll_duration_ns: Option<u64>,
pub(crate) spawn_location: Option<String>,
pub(crate) enclosing_spans: Vec<EnclosingSpanSummary>,
}
#[derive(Debug, Clone)]
pub(crate) struct ResolvedPoll {
pub(crate) start_ns: u64,
pub(crate) end_ns: u64,
pub(crate) duration_ns: u64,
pub(crate) worker_id: u32,
pub(crate) task_id: u64,
pub(crate) spawn_loc: Option<String>,
pub(crate) cpu_sample_count: u32,
pub(crate) sched_sample_count: u32,
pub(crate) host: String,
pub(crate) service: String,
pub(crate) date: String,
pub(crate) ready_at_ns: Option<u64>,
pub(crate) scheduling_delay_ns: Option<u64>,
pub(crate) scheduling_delay_kind: Option<SchedulingDelayKind>,
pub(crate) waker_task_id: Option<u64>,
pub(crate) task_instrumented: Option<bool>,
}
#[derive(Debug, Clone)]
pub(crate) struct ResolvedSpan {
pub(crate) span_uid: [u8; 16],
pub(crate) span_type_uid: [u8; 16],
pub(crate) kind: &'static str,
pub(crate) name: String,
pub(crate) target: String,
pub(crate) callsite_file: Option<String>,
pub(crate) callsite_line: Option<u32>,
pub(crate) start_ns: u64,
pub(crate) end_ns: u64,
pub(crate) elapsed_ns: u64,
pub(crate) active_ns: Option<u64>,
pub(crate) observed_active_wall_ns: u64,
pub(crate) detail_coverage_ns: u64,
pub(crate) details_complete: bool,
pub(crate) concurrent: bool,
pub(crate) parent_span_uid: Option<[u8; 16]>,
pub(crate) attributes: Vec<(String, String)>,
pub(crate) on_cpu_ns_est: Option<u64>,
pub(crate) blocked_ns_est: Option<u64>,
pub(crate) async_wait_ns: Option<u64>,
pub(crate) scheduler_delay_ns: Option<u64>,
pub(crate) unknown_ns: u64,
pub(crate) cpu_sample_count: u32,
pub(crate) sched_sample_count: u32,
pub(crate) attribution_version: u16,
pub(crate) attribution_flags: u32,
pub(crate) unbalanced_exits: u32,
pub(crate) unbalanced_enters: u32,
pub(crate) identity_quality: &'static str,
pub(crate) source_key: String,
pub(crate) host: String,
pub(crate) service: String,
pub(crate) date: String,
}
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct EnclosingSpanSummary {
pub(crate) span_uid: [u8; 16],
pub(crate) span_type_uid: [u8; 16],
pub(crate) elapsed_ns: u64,
pub(crate) details_complete: bool,
}
pub(crate) type DecodeResult = (
Vec<ResolvedSample>,
HashMap<[u8; 16], Vec<String>>,
Vec<ResolvedPoll>,
Vec<ResolvedSpan>,
);
#[derive(Debug, Clone, Default)]
pub struct DecodeStats {
pub events_decoded: u64,
pub span_events_decoded: u64,
pub wire_decode: std::time::Duration,
pub sort_events: std::time::Duration,
pub poll_reconstruct: std::time::Duration,
pub sample_resolve: std::time::Duration,
pub span_resolve: std::time::Duration,
pub sample_attribution: std::time::Duration,
}