use crate::event::journal_record::JournalRecord;
use crate::event::{ChainPayload, SystemPayload};
pub trait MetricsObserver: Send + Sync {
fn on_chain_event(&self, envelope: &JournalRecord<ChainPayload>);
fn on_system_event(&self, envelope: &JournalRecord<SystemPayload>);
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: &JournalRecord<ChainPayload>) {
}
fn on_system_event(&self, _envelope: &JournalRecord<SystemPayload>) {
}
fn on_tick(&self) {
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::event::{ChainEventFactory, JournalWriterId, 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 = JournalRecord::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 = JournalRecord::new(journal_writer, event);
observer.on_chain_event(&envelope);
observer.on_tick();
}
#[test]
fn test_system_event_observation() {
use crate::event::{StageLifecycleEvent, SystemEvent, SystemPayload};
use crate::id::{StageId, SystemId};
let observer = NoOpMetricsObserver::new();
let system_id = SystemId::new();
let system_event = SystemEvent::new(
WriterId::from(system_id),
SystemPayload::StageLifecycle {
stage_id: StageId::new(),
event: StageLifecycleEvent::Running,
},
);
let journal_writer = JournalWriterId::new();
let envelope = JournalRecord::new(journal_writer, system_event);
observer.on_system_event(&envelope);
}
}