One producing session, three Observer clients, three different sinks. None of them ever issue a command.
Most teams sidecar the agent with a tee: agent emits to stdout, a shipper tails the log, a second tail re-parses for metrics, a third process writes to SQLite for replay. Three pipelines diverge over time, none know about each other, and adding a fourth consumer means another sidecar.
let client: Client = todo!(); // observer client
let sub_id = subscribe(&client, target, Some(&["metric"])).await?;
// for await env in client.events() {
// if let Some(inner) = unwrap_event(&env) { sink.handle(inner).await }
// }Three observers. One transport each. Filters declared inline. The producing session never knows they exist.
- Subscriptions, filters, Observer role — RFC §13, §5.
since.after_message_idbackfill + the syntheticsubscription.backfill_completemarker — §13.3.- Standard metrics + trace spans — §17.
- Stream-kind filtering for
kind: thoughtredaction — §11.4.
main.rs— boots three clients in parallel viatokio::join!.sinks.rs—StdoutSink,SqliteSink(usesarcp::store::eventlog),OtlpSink(metric / trace.span exporter).
- Replace SQLite with ClickHouse for fleet-wide replay.
- Tee stdout into Slack via a
min_priority: criticalfilter. - A fourth subscriber on
kind: thoughtonly, gated by stricter access control.