Статьи

Мониторинг Акка

В этом посте я покажу вам, как контролировать приложение Akka в  Datadog . Код теперь доступен в последнем снимке нашего проекта мониторинга; Вы можете включить его в свои приложения Akka и попробовать все сами.

Мониторинг, который предоставляет этот инструмент, не находится   на том же уровне, что и понимание вашего приложения Akka, которое вы получаете с консоли Typesafe. Используйте  консоль Typesafe  в разработке, когда вам действительно нужно снять капот актерской системы. Используйте наш монитор, чтобы следить за отлаженной, настроенной системой Akka, работающей в производстве. Представьте себе, что вы видите диаграмму вот так:

несчастный

В процессе работы вы можете отслеживать очереди участников, количество обрабатываемых ими сообщений, производительность receive функции и частоту появления  ошибок. В этом кратком введении я покажу вам, как контролировать простое приложение Akka из командной строки.

object Main extends App {
  val longSleep = 10
  val shortSleep = 1

  class FooActor(bar: ActorRef) extends Actor {
    def receive: Receive = {
      case i: Int if i > 0  =>
        println(s"Counting down... Now $i")
        Thread.sleep(longSleep)
        if (i % 10 == 0) bar ! i
        self ! (i - 1)
      case i: Int if i == 0 =>
        println("Foo done.")
    }
  }

  class BarActor extends Actor {
    def receive: Receive = {
      case i: Int if i > 0  =>
        Thread.sleep(shortSleep)
        self ! (i - 1)
      case i: Int if i == 0 =>
        println("Bar done.")
    }
  }

  val system = ActorSystem()
  val bar = system.actorOf(Props[BarActor].
  	withRouter(RoundRobinRouter(nrOfInstances = 10)), "bar")
  val foo = system.actorOf(Props(new FooActor(bar)), "foo")
  val CountPattern = "(\\d+)".r

  def commandLoop(): Unit = {
    Console.readLine() match {
      case "quit"          => return
      case "go"            => (0 to 20).foreach(_ => foo ! 400)
      case CountPattern(i) => foo ! (i.toInt * 10)
      case _               => println("WTF?")
    }

    commandLoop()
  }

  commandLoop()
  system.shutdown()

}

Когда вы запустите это приложение и выполните несколько  go команд; и несколько целых чисел, чтобы быть уверенным, его  fooи  bar актеры будут продолжать передавать сообщения между собой. По сути, это тривиальное приложение для обратного отсчета. Затем мы хотим следить за размером очереди обоих актеров; и мы хотели бы посмотреть общее количество  Int сообщений, передаваемых вокруг.

Если вы не хотите писать код самостоятельно, все, что вам нужно сделать, это добавить libraryDependencies

"org.eigengo.monitor" % "agent-akka" % "0.1-SNAPSHOT"
"org.eigengo.monitor" % "output-statsd" % "0.1-SNAPSHOT"

Как только вы добавите зависимости в свой модуль, добавьте файлы  /META-INF/aop.xml и  /META-INF/monitor/agent.conf, запустите JVM  -javaagent:$PATH-TO/aspectjweaver-1.7.3.jar, запустите   агент Datadog , и вы все будете готовы следить за вашим кодом Akka.

Структура монитора

Проект монитора выпущен в  Sonatype Snapshots ; исходный код находится в обычном месте на  GitHub . На данный момент единственным рабочим агентом является агент Akka, а единственным рабочим модулем вывода является модуль statsd / Datadog. Как видно из структуры, я собираюсь добавить мониторинг  Spray , Play и более подробную информацию в Akka IO. Точно так же, по многочисленным просьбам, я буду добавлять больше модулей вывода.

Агенты используют  AspectJ ткачество  во время загрузки (другими словами, мы не катим нашу собственную Akka!). Советы изменяют байт-код Акки, когда он загружается  ClassLoader. Это объясняет необходимость неясного  -javaagent:.../aspectjweaver-1.7.3.jar параметра JVM. Ткач содержит Java-агент, который регистрирует ткач AspectJ, который обрабатывает классы по мере их загрузки. Чтобы узнать, что делать, ткач читает  /META-INF/aop.xml файл. В нашем случае он содержит:

<aspectj>

    <aspects>
        <aspect 
           name="org.eigengo.monitor.agent.akka.ActorCellMonitoringAspect"/>
    </aspects>

    <weaver options="-verbose -XnoInline -showWeaveInfo">
        <include within="akka.actor.*"/>
    </weaver>

</aspectj>

Вы можете видеть, что ткач применяет советы в  ActorCellMonitoringAspect классах akka.actor. Затем  ActorCellMonitoringAspect он отправляет сообщения мониторинга в настроенный модуль вывода.

Чтобы узнать, какой модуль использовать, и другие сведения о конфигурации, агент читает  /META-INF/monitor/agent.conf файл. Он определяет модуль вывода и, при необходимости, специфические для агента настройки. Пример  agent.conf файла:

org.eigengo.monitor.agent {
    output {
        class: "org.eigengo.monitor.output.statsd.StatsdCounterInterface"
    }

    akka {
        included: [ "akka://default/user/foo", "akka://default/user/bar" ]
    }
}

Как видите, он указывает имя класса, который будет отвечать за доставку сообщений мониторинга в инструмент мониторинга (в нашем случае это statsd in  StatsdCounterInterface); агент также может получить конфигурацию, которая указывает, каких участников включить, а каких исключить. В нашем небольшом приложении мы хотим только отслеживать  foo и  bar актеров. (Мы могли бы опустить весь  akka узел, что подразумевало бы  мониторинг каждого актера .)

Datadog

Datadog can receive the statsd messages; and so it is perfectly suited to monitor our Akka application. To get started, head over to http://www.datadoghq.com/, and download the agent for your OS. Then start the agent on your machine. This connects the Datadog web application to the system being monitored. Once you’re done, you can start creating dashboards that summarize the information that the monitoring tool sends.

Gallery

Let me complete the article by showing you a few simple charts you can construct using this monitoring tool and Datadog

несчастный

Overloaded actor bar

продолжительность

Performance of the receive function

Delivered-ИНТ

Configuration of the delivered messages chart

Очередь-Foo

Configuration of the queue size for foo chart

Trying it out

In place of the usual summary, I encourage you to head over to https://github.com/eigengo/monitor, clone the repository and try running the application by simply typing sbt run, with the Datadog agent configured & running. Then you will be able to re-create the same charts I showed you. I also encourage you to submit feature requests. Of course, I will be delighted to accept your pull requests!