diagnostic_source/
diagnostic_source.rs1use saddle_core::{
3 CaptureSite, Diagnostic, DiagnosticCategory, DiagnosticCause, DiagnosticCode, DiagnosticObject,
4 DiagnosticObjectKind, DiagnosticStage, ErrorKind, SaddleError,
5};
6use saddle_observability::{DiagnosticShutdown, EmergencyDiagnostics, FileLoggingConfig};
7
8fn source_failure(error: &std::io::Error) -> SaddleError {
9 let cause = DiagnosticCause::new(
10 DiagnosticStage::StartupConfig,
11 DiagnosticCode::new("config.read_failed").expect("static code"),
12 )
13 .with_object(
14 DiagnosticObject::new(DiagnosticObjectKind::ConfigKey, "framework.database")
15 .expect("schema key"),
16 )
17 .with_io(error);
18 SaddleError::new(
19 ErrorKind::Infrastructure,
20 "config.read_failed",
21 "configuration unavailable",
22 )
23 .with_diagnostic(Diagnostic::capture(
24 DiagnosticCategory::UnexpectedError,
25 CaptureSite::FirstObserved,
26 cause,
27 ))
28}
29fn main() {
30 let mut output =
32 EmergencyDiagnostics::start(&FileLoggingConfig::default()).expect("emergency worker");
33 let error = source_failure(&std::io::Error::from_raw_os_error(2));
34 if let Some(diagnostic) = error.diagnostic() {
35 let _admission_only = output.handle().submit(diagnostic);
36 }
37 let deadline = std::time::Instant::now() + std::time::Duration::from_secs(1);
39 while output.shutdown() == DiagnosticShutdown::Pending && std::time::Instant::now() < deadline {
40 std::thread::sleep(std::time::Duration::from_millis(1));
41 }
42 let _status = output.snapshot();
44}