В этом посте я покажу вам, как контролировать приложение 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
Configuration of the delivered messages chart
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!