2015-04-22 2 views
5

Come verificare akka per quanto tempo un messaggio era in arrivo? Voglio fare un messaggio di log se il messaggio era in arrivo per troppo tempo. Qualcosa del tipo:Akka - come verificare per quanto tempo un messaggio era in arrivo?

override def receive: Receive = { 
    case Message => 
     val timeInInbox = ... 
     if (timeInInbox > treshold) log.warn("bla bla bla the doom is coming") 
+1

una soluzione può essere quella di timestamp in modo esplicito i messaggi, ad esempio: 'caso classe messaggio (ts: Long)' – kosii

+2

facciamo qualcosa di molto simile, tranne che invece di registrazione, stiamo aggiornando metriche timer per i messaggi come lunghi rimani nella casella di posta. Facciamo ciò che @kosii suggerisce e stampiamo tutti i nostri messaggi che vanno ai nostri attori con un timestamp e poi abbiamo un impl di cassetta postale personalizzato che sovrascrive 'dequeue' per vedere quanto tempo è trascorso da quando i messaggi sono stati creati e quando è stato rimosso dalla casella di posta. – cmbaxter

+0

È un grande sovraccarico se creo una casella di posta personalizzata, con overriden 'enqueue' che mette il messaggio originale in tuple' (msg, timestamp) 'e sovrascritto' dequeue' con la registrazione? – mpr

risposta

2

Sono disponibili metriche/librerie di telemetria in grado di fornire queste informazioni. Uno è kamon.io (open source), che vi dà un "tempo-in-cassetta della posta" metrica, vedere http://kamon.io/documentation/kamon-akka/0.6.6/actor-router-and-dispatcher-metrics/

un altro (non libero, chiuso source) è "Lightbend Telemetry", che lo definisce "il tempo delle cassette postali" , vedi http://developer.lightbend.com/docs/monitoring/latest/instrumentations/akka/akka.html#actor-metrics

0

Attualmente Akka non dispone di alcun elemento che faccia questo.

È possibile creare un'implementazione personalizzata della cassetta postale che registra l'ora di arrivo di ciascun messaggio su enqueue e registra la durata della coda su dequeue. Vedi "Creating your own Mailbox type" nei documenti di Akka.

Attenzione che chiamare getCurrentTimeMillis o simili non è economico, quindi è possibile che una casella di posta elettronica di questo tipo abbia un costo significativo delle prestazioni. Mi aspetto che sia per questo che Akka non offre questo fuori dagli schemi.