langsmith_rust/observability/
observable.rs1use crate::observability::observer::Observer;
2use serde_json::Value;
3use std::sync::{Arc, Mutex};
4
5pub trait Observable: Send + Sync {
7 fn add_observer(&mut self, observer: Arc<dyn Observer>);
9
10 fn notify_start(&self, node_name: &str, inputs: &Value);
12
13 fn notify_end(&self, node_name: &str, outputs: &Value);
15
16 fn notify_error(&self, node_name: &str, error: &str);
18}
19
20pub 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