saddle-observability 0.3.28

Saddle structured logging and trace correlation
Documentation
//! Fixed, bounded records of process-scoped execution pressure.
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,
        })
    }
}