Мне очень нравится JVM, потому что есть много инструментов, доступных для проверки работающего экземпляра JVM во время выполнения. Java Mission Control (jmc) — один из моих любимых инструментов, когда дело доходит до мониторинга потоков, горячих методов и распределения памяти.
Однако эти инструменты имеют ограниченное применение при мониторинге управляемой событиями системы, основанной на сообщениях, такой как Akka . Поток почти не имеет смысла, так как он мог обработать любое сообщение. К счастью, есть некоторые инструменты, чтобы заполнить этот пробел. Несмотря на то, что документы Akka действительно обширны и полезны, о мониторинге не так уж много.
Я скорее разработчик, чем парень по операциям, поэтому я дам только краткое и «я думаю, что это так» введение в мониторинг, хранение, сбор, отображение и прочее .
Большая картина
Прежде всего, когда мы закончим, у нас будет запущена эта инфраструктура.
Благодаря докеру, нам не нужно ничего настраивать с правой стороны, чтобы начать.
Камон
Начиная слева на картинке. Kamon — это библиотека, которая использует AspectJ для подключения к вызовам методов, сделанным ActorSystem, и записи событий различных типов. В документах Kamon есть большие пробелы, но вы можете почувствовать, что это возможно. Я не буду вносить какие-либо специальные настройки, а просто использую значения по умолчанию, чтобы начать работу как можно быстрее.
StatsD — Графит
Сетевой демон, который работает на платформе Node.js и прослушивает статистику, такую как счетчики и таймеры, отправляемую по UDP, и отправляет агрегаты одной или нескольким подключаемым внутренним службам.
Kamon предоставляет также другие бэкэнды (datadog, newrelic) для отчета. Для этого урока мы используем бесплатный сервер StatsD и Graphite в качестве Backend Service.
графана
Grafana — это интерфейс для отображения вашей статистики, зарегистрированной в Graphite. У вас есть хорошая демоверсия, с которой вы можете поиграть. Однако я дам подробную инструкцию о том, как добавить ваши метрики в нашу панель Grafana.
Начиная
Сначала нам нужно приложение, которое мы можем отслеживать. Я использую свой акка-камон-активатор. Оформить заказ код:
1
|
|
Приложение содержит два генератора сообщений: один для пиков и один для постоянной нагрузки. Два типа актеров обрабатывают эти сообщения. Каждый создает случайные числа, и дочерние акторы вычисляют главные факторы.
Камон Зависимости и SBT-аспект
Сначала мы добавляем камоновские зависимости через
01
02
03
04
05
06
07
08
09
10
|
val kamonVersion = "0.3.4" libraryDependencies ++ = Seq( "com.typesafe.akka" %% "akka-actor" % "2.3.5" , "io.kamon" %% "kamon-core" % kamonVersion, "io.kamon" %% "kamon-statsd" % kamonVersion, "io.kamon" %% "kamon-log-reporter" % kamonVersion, "io.kamon" %% "kamon-system-metrics" % kamonVersion, "org.aspectj" % "aspectjweaver" % "1.8.1" ) |
Затем мы конфигурируем плагин sbt-aspectj-plugin для создания нашего кода во время компиляции. Сначала добавьте плагин в ваш plugins.sbt
1
|
addSbtPlugin( "com.typesafe.sbt" % "sbt-aspectj" % "0.9.4" ) |
И теперь мы настраиваем это
1
2
3
4
5
6
|
aspectjSettings javaOptions <++ = AspectjKeys.weaverOptions in Aspectj // when you call "sbt run" aspectj weaving kicks in fork in run := true |
Последний шаг — настроить то, что должно быть записано. Откройте ваш application.conf, где находится ваша конфигурация akka. Kamon использует ключ конфигурации kamon .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
kamon { # What should be recorder metrics { filters = [ { # actors we should be monitored actor { includes = [ "user/*" , "user/worker-*" ] # a list of what should be included excludes = [ "system/*" ] # a list of what should be excluded } }, # not sure about this yet. Looks important { trace { includes = [ "*" ] excludes = [] } } ] } # ~~~~~~ StatsD configuration ~~~~~~~~~~~~~~~~~~~~~~~~ statsd { # Hostname and port in which your StatsD is running. Remember that StatsD packets are sent using UDP and # setting unreachable hosts and/or not open ports wont be warned by the Kamon, your data wont go anywhere. hostname = "127.0.0.1" port = 8125 # Interval between metrics data flushes to StatsD. It's value must be equal or greater than the # kamon.metrics.tick-interval setting. flush-interval = 1 second # Max packet size for UDP metrics data sent to StatsD. max-packet-size = 1024 bytes # Subscription patterns used to select which metrics will be pushed to StatsD. Note that first, metrics # collection for your desired entities must be activated under the kamon.metrics.filters settings. includes { actor = [ "*" ] trace = [ "*" ] dispatcher = [ "*" ] } simple-metric-key-generator { # Application prefix for all metrics pushed to StatsD. The default namespacing scheme for metrics follows # this pattern: # application.host.entity.entity-name.metric-name application = "yourapp" } } } |
Наше приложение готово к запуску. Но сначала мы развернем наш бэкэнд мониторинга.
Бэкэнд мониторинга
Как мы видели на первом рисунке, нам нужно много чего запустить, чтобы сохранить события нашего журнала. Используемые библиотеки и компоненты, скорее всего, разумны, и вам (или больше Ops, чем Dev разработчик) придется его настроить. Но на данный момент мы просто запускаем их сразу в простой контейнер докера. Я не ставлю их в автономном режиме, поэтому я вижу, что происходит.
1
|
docker run - v /etc/localtime : /etc/localtime :ro -p 80:80 -p 8125:8125 /udp -p 8126:8126 -p 8083:8083 -p 8086:8086 -p 8084:8084 --name kamon-grafana-dashboard muuki88 /grafana_graphite :latest |
Мое изображение основано на разветвлении исходного изображения докера от kamon.
Запустите и создайте панель инструментов
Теперь перейдите к запущенному экземпляру Grafana на localhost . Вы видите значение по умолчанию, которое мы будем использовать для отображения среднего времени в почтовом ящике. Нажмите на заголовок графика ( Первый график (нажмите на заголовок, чтобы изменить его ). Теперь выберите метрики следующим образом:
Вот и все!
Ссылка: | Мониторинг Akka с Kamon от нашего партнера JCG Непомука Сайлера в блоге mukis.de . |