Статьи

Мониторинг Акки с Камоном

Мне очень нравится 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
git clone git@github.com:muuki88/activator-akka-kamon.git

Приложение содержит два генератора сообщений: один для пиков и один для постоянной нагрузки. Два типа актеров обрабатывают эти сообщения. Каждый создает случайные числа, и дочерние акторы вычисляют главные факторы.

Камон Зависимости и 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 .