use crate::{DiagnosticSubmission, EmergencyDiagnosticHandle, Observer};
use saddle_admission::pressure::{PressureState, PressureWindow};
use serde::Serialize;
pub struct ExecutionPressureFacts {
pub os_error: Option<i32>,
pub window: PressureWindow,
pub decision_at: std::time::Duration,
pub source: &'static str,
pub state: PressureState,
pub workers: usize,
pub global_queue_depth: usize,
pub invalid_reason: Option<&'static str>,
}
impl Observer {
pub fn record_execution_pressure(
&self,
output: Option<&EmergencyDiagnosticHandle>,
facts: ExecutionPressureFacts,
) -> DiagnosticSubmission {
#[derive(Serialize)]
struct Record {
schema_version: u8,
event: &'static str,
context: Option<()>,
source: &'static str,
scope: &'static str,
observed_monotonic_ms: u128,
decision_monotonic_ms: u128,
window_age_ms: u128,
runtime_identity: u64,
process_cpu_ratio: f64,
worker_busy_ratio: f64,
scheduling_delay_ms: u128,
window_valid: bool,
valid: bool,
state: &'static str,
workers: usize,
global_queue_depth: usize,
original_os_error: Option<i32>,
original_error: Option<&'static str>,
}
let Some(output) = output else {
return DiagnosticSubmission::OutputUnavailable;
};
output.submit_fixed_record(&Record {
schema_version: 1,
event: "framework.execution_pressure",
context: None,
source: facts.source,
scope: "process_and_runtime",
observed_monotonic_ms: facts.window.observed_at.as_millis(),
decision_monotonic_ms: facts.decision_at.as_millis(),
window_age_ms: facts.decision_at.saturating_sub(facts.window.observed_at).as_millis(),
runtime_identity: facts.window.runtime_identity,
process_cpu_ratio: facts.window.process_cpu_ratio,
worker_busy_ratio: facts.window.worker_busy_ratio,
scheduling_delay_ms: facts.window.scheduling_delay.as_millis(),
window_valid: facts.window.valid,
valid: facts.window.valid && facts.state != PressureState::Invalid,
state: match facts.state {
PressureState::Cold => "cold",
PressureState::Open => "open",
PressureState::Pressured => "pressured",
PressureState::Invalid => "invalid",
},
workers: facts.workers,
global_queue_depth: facts.global_queue_depth,
original_error: facts.invalid_reason,
original_os_error: facts.os_error,
})
}
}