langsmith_rust/observability/
observable.rs

1use crate::observability::observer::Observer;
2use serde_json::Value;
3use std::sync::{Arc, Mutex};
4
5/// Trait for nodes that can be observed
6pub trait Observable: Send + Sync {
7    /// Add an observer to this observable
8    fn add_observer(&mut self, observer: Arc<dyn Observer>);
9    
10    /// Notify observers that a node has started
11    fn notify_start(&self, node_name: &str, inputs: &Value);
12    
13    /// Notify observers that a node has completed
14    fn notify_end(&self, node_name: &str, outputs: &Value);
15    
16    /// Notify observers that a node encountered an error
17    fn notify_error(&self, node_name: &str, error: &str);
18}
19
20/// Default implementation of Observable
21pub struct ObservableNode {
22    observers: Arc<Mutex<Vec<Arc<dyn Observer>>>>,
23}
24
25impl ObservableNode {
26    pub fn new() -> Self {
27        Self {
28            observers: Arc::new(Mutex::new(Vec::new())),
29        }
30    }
31}
32
33impl Default for ObservableNode {
34    fn default() -> Self {
35        Self::new()
36    }
37}
38
39impl Observable for ObservableNode {
40    fn add_observer(&mut self, observer: Arc<dyn Observer>) {
41        self.observers.lock().unwrap().push(observer);
42    }
43
44    fn notify_start(&self, node_name: &str, inputs: &Value) {
45        let observers = self.observers.lock().unwrap();
46        for observer in observers.iter() {
47            observer.on_node_start(node_name, inputs);
48        }
49    }
50
51    fn notify_end(&self, node_name: &str, outputs: &Value) {
52        let observers = self.observers.lock().unwrap();
53        for observer in observers.iter() {
54            observer.on_node_end(node_name, outputs);
55        }
56    }
57
58    fn notify_error(&self, node_name: &str, error: &str) {
59        let observers = self.observers.lock().unwrap();
60        for observer in observers.iter() {
61            observer.on_node_error(node_name, error);
62        }
63    }
64}
65