use crate::event::event_envelope::EventEnvelope;
use crate::event::{ChainEvent, SystemEvent};
pub trait MetricsObserver: Send + Sync {
fn on_chain_event(&self, envelope: &EventEnvelope<ChainEvent>);
fn on_system_event(&self, envelope: &EventEnvelope<SystemEvent>);
fn on_tick(&self);
}
#[derive(Debug, Default)]
pub struct NoOpMetricsObserver;
impl NoOpMetricsObserver {
pub fn new() -> Self {
Self
}
}
impl MetricsObserver for NoOpMetricsObserver {
fn on_chain_event(&self, _envelope: &EventEnvelope<ChainEvent>) {
}
fn on_system_event(&self, _envelope: &EventEnvelope<SystemEvent>) {
}
fn on_tick(&self) {
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::event::ChainEventFactory;
use crate::event::JournalWriterId;
use crate::event::WriterId;
use crate::id::StageId;
use std::sync::Arc;
#[test]
fn test_noop_observer_does_nothing() {
let observer = NoOpMetricsObserver::new();
let event_writer = WriterId::from(StageId::new());
let event =
ChainEventFactory::data_event(event_writer, "test.event", serde_json::json!({}));
let journal_writer = JournalWriterId::new();
let envelope = EventEnvelope::new(journal_writer, event);
observer.on_chain_event(&envelope);
observer.on_tick();
}
#[test]
fn test_observer_trait_is_object_safe() {
let observer: Arc<dyn MetricsObserver> = Arc::new(NoOpMetricsObserver::new());
let event_writer = WriterId::from(StageId::new());
let event =
ChainEventFactory::data_event(event_writer, "test.event", serde_json::json!({}));
let journal_writer = JournalWriterId::new();
let envelope = EventEnvelope::new(journal_writer, event);
observer.on_chain_event(&envelope);
observer.on_tick();
}
#[test]
fn test_system_event_observation() {
use crate::event::{StageLifecycleEvent, SystemEvent, SystemEventType};
use crate::id::{StageId, SystemId};
let observer = NoOpMetricsObserver::new();
let system_id = SystemId::new();
let system_event = SystemEvent::new(
WriterId::from(system_id),
SystemEventType::StageLifecycle {
stage_id: StageId::new(),
event: StageLifecycleEvent::Running,
},
);
let journal_writer = JournalWriterId::new();
let envelope = EventEnvelope::new(journal_writer, system_event);
observer.on_system_event(&envelope);
}
}