use crate::bus::StreamEvent;
use crate::{MediaFrame, StreamKey};
pub trait Observer: Send + Sync + 'static {
fn on_event(&self, _event: &StreamEvent) {}
fn on_publish_started(&self, _app: &str) {}
fn on_publish_ended(&self, _app: &str) {}
fn on_frame(&self, _key: &StreamKey, _frame: &MediaFrame) {}
fn on_subscriber_lagged(&self, _key: &StreamKey, _skipped: u64) {}
fn on_subscriber_evicted(&self, _key: &StreamKey) {}
fn on_rate_limited(&self, _key: &StreamKey) {}
fn on_stream_reaped(&self, _key: &StreamKey) {}
fn on_gop_truncated(&self, _key: &StreamKey, _capacity: usize) {}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoopObserver;
impl Observer for NoopObserver {}
#[derive(Debug, Default, Clone, Copy)]
pub struct StandardTelemetry;
impl StandardTelemetry {
pub fn new() -> Self {
Self
}
}
impl Observer for StandardTelemetry {
fn on_event(&self, event: &StreamEvent) {
tracing::info!(
target: "arcly_stream::telemetry",
app = %event.app,
stream = %event.stream_id,
kind = ?event.kind,
"stream event",
);
}
fn on_publish_started(&self, app: &str) {
tracing::info!(target: "arcly_stream::telemetry", app, "publish started");
}
fn on_publish_ended(&self, app: &str) {
tracing::info!(target: "arcly_stream::telemetry", app, "publish ended");
}
fn on_subscriber_lagged(&self, key: &StreamKey, skipped: u64) {
tracing::warn!(
target: "arcly_stream::telemetry",
app = %key.app, stream = %key.stream_id, skipped,
"subscriber lagged",
);
}
fn on_subscriber_evicted(&self, key: &StreamKey) {
tracing::warn!(
target: "arcly_stream::telemetry",
app = %key.app, stream = %key.stream_id,
"subscriber evicted",
);
}
fn on_rate_limited(&self, key: &StreamKey) {
tracing::warn!(
target: "arcly_stream::telemetry",
app = %key.app, stream = %key.stream_id,
"ingress rate limited",
);
}
fn on_stream_reaped(&self, key: &StreamKey) {
tracing::warn!(
target: "arcly_stream::telemetry",
app = %key.app, stream = %key.stream_id,
"stream reaped (idle)",
);
}
fn on_gop_truncated(&self, key: &StreamKey, capacity: usize) {
tracing::warn!(
target: "arcly_stream::telemetry",
app = %key.app, stream = %key.stream_id, capacity,
"gop replay buffer truncated (cache too small for this stream)",
);
}
}