Skip to main content

oxicode_sdk/observability/
mod.rs

1//! Observability layer — tracing, audit, cost tracking, and event sourcing.
2
3mod audit;
4pub mod audit_trail;
5mod cost;
6mod decorator;
7mod event_store;
8mod trace;
9
10// Re-exports
11pub use audit::{AuditEntry, AuditFilter, AuditLog};
12pub use audit_trail::{
13    AuditAction, AuditError, AuditPersistence, AuditTrail, HashDigest, TrailEntry,
14};
15pub use cost::{
16    CostBreakdown, CostSnapshot, CostTracker, CostTrackerConfig, GlobalCostSnapshot, TokenUsage,
17};
18pub use decorator::{AgentDecorator, ObservabilityDecorator};
19pub use event_store::{EventQuery, EventStore, EventStoreConfig, StoredEvent};
20pub use trace::{Span, SpanContext, SpanGuard, SpanId, SpanKind, SpanStatus, TraceId, Tracer};
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25
26    #[test]
27    fn smoke() {
28        // Tracer smoke test
29        let tracer = std::sync::Arc::new(Tracer::new());
30        let _guard = tracer.start("test", SpanKind::Agent);
31        drop(_guard);
32        // AuditLog smoke test
33        let log = AuditLog::new(64);
34        log.log(AuditEntry::lifecycle("test".into(), "smoke".into()));
35        // CostTracker smoke test
36        let registry = std::sync::Arc::new(oxicode_ai::ModelRegistry::new());
37        let tracker = CostTracker::new(registry, CostTrackerConfig::default());
38        let model = oxicode_ai::Model::new(
39            "dummy/model",
40            "Dummy",
41            oxicode_ai::Api::AnthropicMessages,
42            "dummy",
43            "https://dummy.com",
44        );
45        tracker.record("agent-1", &model, TokenUsage::default());
46        let snap = tracker.snapshot("agent-1");
47        assert!(snap.is_some());
48        // EventStore smoke test
49        let store = EventStore::default();
50        let seq = store.append("s1", "test", serde_json::json!({"x": 1}));
51        assert_eq!(seq, 1);
52    }
53}