Actix ActorFuture instrumentation for use with [tracing
]
Example
use actix::prelude::*;
use actix::fut::{ready, ActorFuture};
use tracing::{span, event, Level};
use tracing_actix::ActorInstrument;
#
# # type OriginalActorResponse = ();
# # type MessageError = ();
# # # type DeferredWorkResult = Result<OriginalActorResponse, MessageError>;
#
# struct ActorState {}
#
# impl ActorState {
# fn update_from(&mut self, _result: ()) {}
# }
#
# struct OtherActor {}
#
# impl Actor for OtherActor {
# type Context = Context<Self>;
# }
#
# impl Handler<OtherMessage> for OtherActor {
# type Result = ();
#
# fn handle(&mut self, _msg: OtherMessage, _ctx: &mut Context<Self>) -> Self::Result {
# }
# }
#
# struct OriginalActor{
# other_actor: Addr<OtherActor>,
# inner_state: ActorState
# }
#
# impl Actor for OriginalActor{
# type Context = Context<Self>;
# }
#
# #[derive(Message)]
# #[rtype(result = "Result<(), MessageError>")]
# struct DeferredWork{}
#
# #[derive(Message)]
# #[rtype(result = "()")]
# struct OtherMessage{}
impl Handler<DeferredWork> for OriginalActor {
type Result = ResponseActFuture<Self, Result<OriginalActorResponse, MessageError>>;
fn handle(
&mut self,
_msg: DeferredWork,
_ctx: &mut Context<Self>,
) -> Self::Result {
let span = span!(Level::INFO, "deferred work context");
Box::pin(
self.other_actor
.send(OtherMessage {})
.into_actor(self)
.actor_instrument(span)
.map(|result, actor, _ctx| {
match result {
Ok(v) => {
event!(Level::INFO, "I'm within deferred work context");
actor.inner_state.update_from(v);
Ok(())
}
Err(e) => {
event!(Level::ERROR, "Error from deferred work: {:?}", e);
Err(())
}
}
}),
)
}
}
#
# #[derive(Message)]
# #[rtype(result = "Pong")]
# struct Ping;
#
# struct Pong;
impl Handler<Ping> for OriginalActor {
type Result = ResponseActFuture<Self, Pong>;
fn handle(
&mut self,
_msg: Ping,
_ctx: &mut Context<Self>,
) -> Self::Result {
let span = span!(Level::INFO, "ping");
Box::pin(
ready::<Pong>(Pong {})
.actor_instrument(span)
.map(|pong, _this, _ctx| {
event!(Level::INFO, "pong");
pong
}),
)
}
}