use crate::event::observability::families::ObservationFamily;
use crate::event::observability::{CaptureScope, ObservabilityContext};
use crate::journal::JournalError;
use crate::WriterId;
use async_trait::async_trait;
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub struct ObservationKey {
pub capture_scope: CaptureScope,
pub observer: WriterId,
pub kind: ObservationFamily,
}
#[derive(Debug, Clone)]
pub struct LocatedObservation {
pub position: u64,
pub observation: ObservabilityContext,
}
#[derive(Debug, Clone)]
pub enum ObservationLookup<T = Option<LocatedObservation>> {
Ready {
committed_len: u64,
observation: T,
},
Rebuilding {
examined_through: u64,
committed_len: Option<u64>,
},
}
#[async_trait]
pub trait JournalObservationReader: Send + Sync {
async fn latest_observation(
&self,
key: &ObservationKey,
) -> Result<ObservationLookup, JournalError>;
async fn latest_observations(
&self,
observer: WriterId,
) -> Result<ObservationLookup<Vec<LocatedObservation>>, JournalError>;
}