Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Monitoring OSA 2017 NYC

Avatar for h3nk3 h3nk3
April 05, 2017

Monitoring OSA 2017 NYC

Avatar for h3nk3

h3nk3

April 05, 2017
Tweet

More Decks by h3nk3

Other Decks in Programming

Transcript

  1. • “TRADITIONAL” AND REACTIVE APPLICATIONS • MICROSERVICES • MONITORING (DIFFERENT

    TYPES OF) APPLICATIONS • CHALLENGES IN MONITORING AND MITIGATIONS • PEEKING INTO THE FUTURE • PRODUCTION MONITORING • LIGHTBEND MONITORING AGENDA
  2. IT IS 2017 AND WE STILL USE • Synchronous local

    and remote calls • Single machine apps - scaling is an afterthought • Non resilient approaches Result: brittle, non-scaling applications
  3. REACTIVE MANIFESTO http://www.reactivemanifesto.org/ • Created in September 2014, +18k signatures

    • Consists of four traits • Responsive • Resilient • Elastic • Message Driven
  4. RECIPES FOR MICROSERVICES • Isolate everything • Act autonomously •

    Do one thing and do it well • Own your state • Embrace asynchronous message passing
  5. SYNCHRONOUS APPS • Metrics based on entry/exit points • Context

    packed stack traces are available • Logs are (more) descriptive • Thread locals can be used to transfer contexts
  6. ASYNCH STACK TRACE [info] at cinnamon.sample.failure.B$$anonfun$receive$2.applyOrElse(FailureDemo.scala:102) [info] at akka.actor.Actor$class.aroundReceive(Actor.scala:467) [info]

    at cinnamon.sample.failure.B.aroundReceive(FailureDemo.scala:86) [info] at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) [info] at akka.actor.ActorCell.invoke(ActorCell.scala) [info] at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) [info] at akka.dispatch.Mailbox.run$$original(Mailbox.scala:220) [info] at akka.dispatch.Mailbox.run(Mailbox.scala:29) [info] at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [info] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [info] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [info] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [info] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
  7. EXAMPLE SPI abstract class ActorInstrumentation { def systemStarted(system: ActorSystem): Unit

    def systemShutdown(system: ActorSystem): Unit def actorStarted(actorRef: ActorRef): Unit def actorStopped(actorRef: ActorRef): Unit def actorTold(actorRef: ActorRef, message: Any, sender: ActorRef): AnyRef def actorReceived(actorRef: ActorRef, message: Any, sender: ActorRef, context: AnyRef): Unit def actorCompleted(actorRef: ActorRef, message: Any, sender: ActorRef, context: AnyRef): Unit // … }
  8. INSIDE THE SAUSAGE FACTORY // ActorCell.scala final def invoke(messageHandle: Envelope):

    Unit = try { //… systemImpl.instrumentation.actorReceived( self, messageHandle.message, messageHandle.sender, context) messageHandle.message match { // … } systemImpl.instrumentation.actorCompleted( self, messageHandle.message, messageHandle.sender, context) } catch handleNonFatalOrInterruptedException { e 㱺 handleInvokeFailure(Nil, e) // …
  9. DISTRIBUTED TRACING In a nutshell: • Create event for each

    “occurrence” • Persist these events • Deduct information based on the events • Transfer contexts at remote boundaries
  10. PAPER NOTE EXPERIMENT Henrik Received: 4.22.23 Sent: 4.22.29 Peter Received:

    4.22.32 Sent: 4.22.40 Björn Received: 4.22.40 Sent: 4.22.50 Duncan Received: 4.22.51 Sent: 4.22.58
  11. WHAT IS WRONG WITH THIS? TIME Henrik Received: 4.22.23 Sent:

    4.22.29 Peter Received: 4.22.32 Sent: 4.22.40 Björn Received: 4.22.40 Sent: 4.22.50 Duncan Received: 4.22.51 Sent: 4.22.58
  12. PAPER NOTE EXPERIMENT Trace Id: 123 Parent Id: - Id:

    Peter Received: 4.22.32 Sent: 4.22.40 Trace Id: 123 Parent Id: Peter Id: Henrik Received: 4.22.23 Sent: 4.22.29 Trace Id: 123 Parent Id: Henrik Id: Björn Received: 4.22.40 Sent: 4.22.50 Trace Id: 123 Parent Id: Björn Id: Duncan Received: 4.22.51 Sent: 4.22.58
  13. CORRECT ORDER TRUE TIME Trace Id: 123 Parent Id: -

    Id: Peter Received: 4.22.32 Sent: 4.22.40 Trace Id: 123 Parent Id: Peter Id: Henrik Received: 4.22.23 Sent: 4.22.29 Trace Id: 123 Parent Id: Henrik Id: Björn Received: 4.22.40 Sent: 4.22.50 Trace Id: 123 Parent Id: Björn Id: Duncan Received: 4.22.51 Sent: 4.22.58
  14. EXAMINING DEPLOYMENT TRENDS • 1970s: Mainframes • 1980s: Minicomputers •

    1990s: Unix servers • 2000s: Windows on x86, Linux on x86 • 2010s: Cloud computing, Serverless/FaaS
  15. FaaS/Serverless/NoOps AWS Lambda: • Short lived functions • Triggered by

    events • Stateless • Auto scaling • Pay per 100ms of invocation
  16. ACTORS object ActorA { def props: Props = Props[ActorA] }

    class ActorA extends Actor { def receive: Receive = { case x => println(s"Got: $x") } } // … in main class … val system: ActorSystem = ActorSystem("MicroserviceA") system.actorOf(ActorA.props) ! "Hey there!"
  17. FUTURES import scala.util.{Success, Failure} val f: Future[List[String]] = Future {

    session.getRecentPosts } f onComplete { case Success(posts) => for (post <- posts) println(post) case Failure(t) => println("An error has occured: " + t.getMessage) }
  18. SO, IT’S NOT REALLY NEW! Actors are location transparent Futures

    are anonymous blocks of code executed some time Serverless/FaaS just highlights a monitoring need that already exists!
  19. FEATURE LIST (2017-04) • Akka Actors • Akka remoting and

    clustering • Dispatchers/Thread Pools • MDC Propagation • Various backend integration (ES, StatsD, …) • Sandbox environment (EKG) for easy exploration
  20. UPCOMING FEATURES - Q2 2017 • More Akka cluster stuff!

    • Akka HTTP metrics • Expanded distributed tracing capabilities - OpenTracing • Integration enhancements
  21. HOW TO GET IT • Free to use during development

    • Requires subscription to use in production Create, free, account to get started: https://www.lightbend.com/account/register Demo: https://demo.lightbend.com