zeroclaw_runtime/observability/
runtime_trace.rs1use std::path::Path;
10
11use zeroclaw_log::LogEvent;
12
13pub use zeroclaw_log::{LogEvent as RuntimeTraceEvent, LogFilter, LogPage};
14
15fn to_log_config(config: &zeroclaw_config::schema::ObservabilityConfig) -> zeroclaw_log::LogConfig {
16 zeroclaw_log::LogConfig {
17 log_persistence: config.log_persistence.clone(),
18 log_persistence_path: config.log_persistence_path.clone(),
19 log_persistence_max_entries: config.log_persistence_max_entries,
20 log_tool_io: config.log_tool_io.clone(),
21 log_tool_io_truncate_bytes: config.log_tool_io_truncate_bytes,
22 log_tool_io_denylist: config.log_tool_io_denylist.clone(),
23 }
24}
25
26pub fn init_from_config(
28 config: &zeroclaw_config::schema::ObservabilityConfig,
29 workspace_dir: &Path,
30) {
31 zeroclaw_log::init_from_config(&to_log_config(config), workspace_dir);
32}
33
34pub fn resolve_trace_path(
36 config: &zeroclaw_config::schema::ObservabilityConfig,
37 workspace_dir: &Path,
38) -> std::path::PathBuf {
39 let policy = zeroclaw_log::ResolvedPolicy::from_config(&to_log_config(config), workspace_dir);
40 policy.path
41}
42
43pub fn load_events(
48 path: &Path,
49 limit: usize,
50 event_filter: Option<&str>,
51 contains: Option<&str>,
52) -> anyhow::Result<Vec<LogEvent>> {
53 let filter = LogFilter {
54 action: event_filter.map(str::to_string),
55 q: contains.map(str::to_string),
56 ..LogFilter::default()
57 };
58 let page = zeroclaw_log::load_page(path, &filter, limit)?;
59 Ok(page.events)
60}
61
62pub fn find_event_by_id(path: &Path, id: &str) -> anyhow::Result<Option<LogEvent>> {
64 zeroclaw_log::find_event_by_id(path, id)
65}