saddle-observability 0.3.22

Saddle structured logging and trace correlation
Documentation
//! Source-owner example, not DB or Runtime authority generation.
use saddle_core::{
    CaptureSite, Diagnostic, DiagnosticCategory, DiagnosticCause, DiagnosticCode, DiagnosticObject,
    DiagnosticObjectKind, DiagnosticStage, ErrorKind, SaddleError,
};
use saddle_observability::{DiagnosticShutdown, EmergencyDiagnostics, FileLoggingConfig};

fn source_failure(error: &std::io::Error) -> SaddleError {
    let cause = DiagnosticCause::new(
        DiagnosticStage::StartupConfig,
        DiagnosticCode::new("config.read_failed").expect("static code"),
    )
    .with_object(
        DiagnosticObject::new(DiagnosticObjectKind::ConfigKey, "framework.database")
            .expect("schema key"),
    )
    .with_io(error);
    SaddleError::new(
        ErrorKind::Infrastructure,
        "config.read_failed",
        "configuration unavailable",
    )
    .with_diagnostic(Diagnostic::capture(
        DiagnosticCategory::UnexpectedError,
        CaptureSite::FirstObserved,
        cause,
    ))
}
fn main() {
    // The application must pass its already resolved logging.directory here.
    let mut output =
        EmergencyDiagnostics::start(&FileLoggingConfig::default()).expect("emergency worker");
    let error = source_failure(&std::io::Error::from_raw_os_error(2));
    if let Some(diagnostic) = error.diagnostic() {
        let _admission_only = output.handle().submit(diagnostic);
    }
    // Illustrative bounded host wait; Runtime must use its EXISTING deadline.
    let deadline = std::time::Instant::now() + std::time::Duration::from_secs(1);
    while output.shutdown() == DiagnosticShutdown::Pending && std::time::Instant::now() < deadline {
        std::thread::sleep(std::time::Duration::from_millis(1));
    }
    // Inspect written/first_failure + target; Enqueued alone never proves delivery.
    let _status = output.snapshot();
}