use crate::model::{Class, Name, Rcode, RecordType, UpstreamGroupId};
pub trait ObservabilitySink: Send + Sync {
fn record(&self, event: &ObserveEvent);
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ObserveEvent {
QueryReceived {
correlation_id: u64,
name: Option<Name>,
rtype: Option<RecordType>,
class: Option<Class>,
},
FakeIpTerminal {
correlation_id: u64,
},
StaticRoute {
correlation_id: u64,
group: Option<UpstreamGroupId>,
},
HookDecision {
correlation_id: u64,
decision: HookObserveDecision,
},
CacheHit {
correlation_id: u64,
group: UpstreamGroupId,
},
CacheMiss {
correlation_id: u64,
group: UpstreamGroupId,
},
UpstreamAttempt {
correlation_id: u64,
group: UpstreamGroupId,
backend_index: usize,
},
UpstreamOutcome {
correlation_id: u64,
group: UpstreamGroupId,
backend_index: usize,
outcome: UpstreamObserveOutcome,
},
Completed {
correlation_id: u64,
rcode: Rcode,
},
Failed {
correlation_id: u64,
failure: ObserveFailure,
},
Cancelled {
correlation_id: u64,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HookObserveDecision {
Abstain,
Use(UpstreamGroupId),
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UpstreamObserveOutcome {
Success,
RetryableFailure,
Failure,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ObserveFailure {
NoRoute,
Hook,
Timeout,
Transport,
Tls,
Other,
}