use serde::{Deserialize, Serialize};
use crate::{CaptureMode, EffectiveCoreConfig};
pub const SCHEMA_VERSION: u64 = 1;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Outcome {
Ok,
Error,
Timeout,
Cancelled,
Rejected,
Other(String),
}
impl Outcome {
#[must_use]
pub fn as_str(&self) -> &str {
match self {
Self::Ok => "ok",
Self::Error => "error",
Self::Timeout => "timeout",
Self::Cancelled => "cancelled",
Self::Rejected => "rejected",
Self::Other(value) => value.as_str(),
}
}
#[must_use]
pub fn into_string(self) -> String {
match self {
Self::Ok => "ok".to_string(),
Self::Error => "error".to_string(),
Self::Timeout => "timeout".to_string(),
Self::Cancelled => "cancelled".to_string(),
Self::Rejected => "rejected".to_string(),
Self::Other(value) => value,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Run {
pub schema_version: u64,
pub metadata: RunMetadata,
pub requests: Vec<RequestEvent>,
pub stages: Vec<StageEvent>,
pub queues: Vec<QueueEvent>,
pub inflight: Vec<InFlightSnapshot>,
pub runtime_snapshots: Vec<RuntimeSnapshot>,
#[serde(default)]
pub truncation: TruncationSummary,
}
impl Run {
#[must_use]
pub fn new(metadata: RunMetadata) -> Self {
Self {
schema_version: SCHEMA_VERSION,
metadata,
requests: Vec::new(),
stages: Vec::new(),
queues: Vec::new(),
inflight: Vec::new(),
runtime_snapshots: Vec::new(),
truncation: TruncationSummary::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct TruncationSummary {
#[serde(default)]
pub limits_hit: bool,
pub dropped_requests: u64,
pub dropped_stages: u64,
pub dropped_queues: u64,
pub dropped_inflight_snapshots: u64,
pub dropped_runtime_snapshots: u64,
}
impl TruncationSummary {
#[must_use]
pub const fn is_truncated(&self) -> bool {
self.limits_hit
|| self.dropped_requests > 0
|| self.dropped_stages > 0
|| self.dropped_queues > 0
|| self.dropped_inflight_snapshots > 0
|| self.dropped_runtime_snapshots > 0
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RunMetadata {
pub run_id: String,
pub service_name: String,
pub service_version: Option<String>,
pub started_at_unix_ms: u64,
pub finished_at_unix_ms: u64,
#[serde(default)]
pub finalized_at_unix_ms: Option<u64>,
pub mode: CaptureMode,
#[serde(default)]
pub effective_core_config: Option<EffectiveCoreConfig>,
#[serde(default)]
pub effective_tokio_sampler_config: Option<EffectiveTokioSamplerConfig>,
pub host: Option<String>,
pub pid: Option<u32>,
#[serde(default)]
pub lifecycle_warnings: Vec<String>,
#[serde(default)]
pub unfinished_requests: UnfinishedRequests,
#[serde(default)]
pub run_end_reason: Option<RunEndReason>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RunEndReason {
ManualDisarm,
Shutdown,
AutoSealOnLimitsHit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct EffectiveTokioSamplerConfig {
pub inherited_mode: CaptureMode,
pub explicit_mode_override: Option<CaptureMode>,
pub resolved_mode: CaptureMode,
pub resolved_sampler_cadence_ms: u64,
pub resolved_runtime_snapshot_retention: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct UnfinishedRequests {
pub count: u64,
pub sample: Vec<UnfinishedRequestSample>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UnfinishedRequestSample {
pub request_id: String,
pub route: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RequestEvent {
pub request_id: String,
pub route: String,
pub kind: Option<String>,
pub started_at_unix_ms: u64,
pub finished_at_unix_ms: u64,
pub latency_us: u64,
pub outcome: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StageEvent {
pub request_id: String,
pub stage: String,
pub started_at_unix_ms: u64,
pub finished_at_unix_ms: u64,
pub latency_us: u64,
pub success: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct QueueEvent {
pub request_id: String,
pub queue: String,
pub waited_from_unix_ms: u64,
pub waited_until_unix_ms: u64,
pub wait_us: u64,
pub depth_at_start: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct InFlightSnapshot {
pub gauge: String,
pub at_unix_ms: u64,
pub count: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RuntimeSnapshot {
pub at_unix_ms: u64,
pub alive_tasks: Option<u64>,
pub global_queue_depth: Option<u64>,
pub local_queue_depth: Option<u64>,
pub blocking_queue_depth: Option<u64>,
pub remote_schedule_count: Option<u64>,
}