2021-07-08 22:04:11 +00:00
|
|
|
use crate::actor::*;
|
|
|
|
|
2021-07-22 14:53:56 +00:00
|
|
|
use std::fmt::Debug;
|
2021-07-08 22:04:11 +00:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
struct Tracer(tracing::Span);
|
|
|
|
|
2021-07-22 14:53:56 +00:00
|
|
|
fn set_name_oid<M>(t: &mut Tracer, r: &Arc<Ref<M>>) {
|
|
|
|
t.0.record("oid", &tracing::field::display(&r.oid()));
|
2021-07-08 22:04:11 +00:00
|
|
|
}
|
|
|
|
|
2021-07-24 21:22:01 +00:00
|
|
|
pub fn tracer<M: Debug>(ac: &mut RunningActor, name: tracing::Span) -> Arc<Ref<M>> {
|
2021-07-22 14:53:56 +00:00
|
|
|
let mut e = Tracer(name);
|
|
|
|
let r = ac.create_inert();
|
|
|
|
set_name_oid(&mut e, &r);
|
|
|
|
r.become_entity(e);
|
|
|
|
r
|
2021-07-08 22:04:11 +00:00
|
|
|
}
|
|
|
|
|
2021-07-22 14:53:56 +00:00
|
|
|
pub fn tracer_top<M: Debug>(name: tracing::Span) -> Arc<Ref<M>> {
|
|
|
|
let mut e = Tracer(name);
|
|
|
|
let r = Actor::create_and_start_inert(crate::name!(parent: None, "tracer"));
|
|
|
|
set_name_oid(&mut e, &r);
|
|
|
|
r.become_entity(e);
|
|
|
|
r
|
2021-07-08 22:04:11 +00:00
|
|
|
}
|
|
|
|
|
2021-07-22 14:53:56 +00:00
|
|
|
impl<M: Debug> Entity<M> for Tracer {
|
|
|
|
fn assert(&mut self, _t: &mut Activation, a: M, h: Handle) -> ActorResult {
|
2021-07-08 22:04:11 +00:00
|
|
|
let _guard = self.0.enter();
|
|
|
|
tracing::trace!(a = debug(&a), h = debug(&h), "assert");
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
fn retract(&mut self, _t: &mut Activation, h: Handle) -> ActorResult {
|
|
|
|
let _guard = self.0.enter();
|
|
|
|
tracing::trace!(h = debug(&h), "retract");
|
|
|
|
Ok(())
|
|
|
|
}
|
2021-07-22 14:53:56 +00:00
|
|
|
fn message(&mut self, _t: &mut Activation, m: M) -> ActorResult {
|
2021-07-08 22:04:11 +00:00
|
|
|
let _guard = self.0.enter();
|
|
|
|
tracing::trace!(m = debug(&m), "message");
|
|
|
|
Ok(())
|
|
|
|
}
|
2021-07-22 14:53:56 +00:00
|
|
|
fn sync(&mut self, t: &mut Activation, peer: Arc<Ref<Synced>>) -> ActorResult {
|
2021-07-08 22:04:11 +00:00
|
|
|
let _guard = self.0.enter();
|
|
|
|
tracing::trace!(peer = debug(&peer), "sync");
|
2021-07-22 14:53:56 +00:00
|
|
|
t.message(&peer, Synced);
|
2021-07-08 22:04:11 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
2021-07-15 07:13:31 +00:00
|
|
|
|
2021-08-14 01:28:23 +00:00
|
|
|
/// Sets up [`tracing`] logging in a reasonable way.
|
|
|
|
///
|
|
|
|
/// Useful at the top of `main` functions.
|
2021-07-15 07:13:31 +00:00
|
|
|
pub fn convenient_logging() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
|
let filter = match std::env::var(tracing_subscriber::filter::EnvFilter::DEFAULT_ENV) {
|
|
|
|
Err(std::env::VarError::NotPresent) =>
|
|
|
|
tracing_subscriber::filter::EnvFilter::default()
|
|
|
|
.add_directive(tracing_subscriber::filter::LevelFilter::INFO.into()),
|
|
|
|
_ =>
|
|
|
|
tracing_subscriber::filter::EnvFilter::try_from_default_env()?,
|
|
|
|
};
|
|
|
|
let subscriber = tracing_subscriber::FmtSubscriber::builder()
|
|
|
|
.with_ansi(true)
|
|
|
|
.with_max_level(tracing::Level::TRACE)
|
|
|
|
.with_env_filter(filter)
|
|
|
|
.finish();
|
|
|
|
tracing::subscriber::set_global_default(subscriber)
|
|
|
|
.expect("Could not set tracing global subscriber");
|
|
|
|
Ok(())
|
|
|
|
}
|