52
Kamonを理解する CA ProFit-X 塚本 修也 @s_tsuka 2015/11/20 AdTech Scala Meetup 1

Kamonを理解する

Embed Size (px)

Citation preview

Kamonを理解するCA ProFit-X 塚本 修也 @s_tsuka

2015/11/20 AdTech Scala Meetup

1

目次

• Kamonとは

• Kamonの使い方

• 実際にシステムを監視してみる

• Kamonの内部構造

2

はじめる前に

3

とりあえず動かしたい人向け

• ミニマムなサンプルを用意しました# DL git clone https://github.com/tsukaby/kamon-spray-example.git cd kamon-spray-example

# 実行(errorが出ますがとりあえず無視してください) sbt run (またはsbt run | grep uuid-count)

# browser, curl, ab, wrkなどで以下にアクセス # http://localhost:8080/uuid # sbt runしたコンソールに監視結果が出ます

4

Kamonとは

5

Kamonとは

• JVM上で動くアプリケーションの監視ツール(ライブラリ)

• 多くの拡張・連携機能Akka Actor, JDBC, JMX, Play2, Spray, Datadog, NewRelic …

• Web site http://kamon.io/

• GitHubhttps://github.com/kamon-io/Kamon

6

ツールというよりライブラリ

• ScalaのライブラリMaven centralから使える

• Scalaアプリケーション内から呼び出す感じ

7

何ができるの?拡張機能って?

• JVMアプリの監視(値の定期取得)

• CPU, Memory, NW I/O, Load average, etc

• Actorの処理時間、溜まっているメッセージ数

• 任意の処理block(method)の処理時間

• 独自に値を収集可能

• Kamonが収集した値の外部出力 Datadog, NewRelic, 標準出力, StatsD, fluentd

8

できないこと

• (GUIによる)可視化※外部ツールにデータを転送することは可能

• 別途可視化環境を用意しましょう

• kamon-statsd + Graphite

• kamon-spm + SPM

• kamon-datadog + Datadog

• kamon-newrelic + Newrelic

9

Kamonの使い方

10

Get Started

• 公式http://kamon.io/introduction/get-started/

• AdTech Scala blogKamonとDatadogを使ってAkka actorのパフォーマンスを可視化する

• サンプルコード https://github.com/kamon-io/Kamon/tree/master/kamon-exampleshttps://github.com/tsukaby/kamon-spray-example

11

導入4ステップ

1. アプリ作成

2. libraryDependencies追加

3. conf追加

4. Kamon用のコード追加

12

拡張機能による自動データ収集

• libraryDependenciesに追加するだけlibraryDependencies ++= Seq( "io.kamon" %% "kamon-core" % "0.5.2", "io.kamon" %% "kamon-system-metrics" % "0.5.2", "io.kamon" %% "kamon-scala" % "0.5.2", "io.kamon" %% "kamon-akka" % "0.5.2", "io.kamon" %% "kamon-spray" % "0.5.2", "io.kamon" %% "kamon-datadog" % "0.5.2", "io.kamon" %% "kamon-log-reporter" % "0.5.2" )

13

一部aspectjが必要

• http://kamon.io/introduction/overview/

• アプリを動かすときは以下のような感じで

java -javaagent:~/.aspectj/aspectj-weaver.jar your-app.jar

14

kamon-system-metricsを使う人はSigarも必要• http://kamon.io/integrations/system-metrics/system-

and-jvm-metrics/

• Sigar

• システムの情報(CPU, Memoryなど)を取得するC言語で書かれたライブラリ

• Java実装もあるっぽい・・けどただのラッパー?実行時には共有ライブラリ(.so, .dylib)が必要みたい

15

Sigarをどうやって入れれば良いの?• http://kamon.io/integrations/system-metrics/

system-and-jvm-metrics/

• sigar-loaderを使う

• カレントdirのnative dir以下に自動でDL

• 後は

java -Djava.library.path=native -jar …

16

独自に値を収集する• コードを書くだけ

import kamon.Kamon import kamon.trace.Tracer

val counter = Kamon.metrics.counter("foo") val histogram = Kamon.metrics.histogram("bar")

counter.increment() histogram.record(currentMillis % 1000)

Tracer.withNewContext("uuid-generate", autoFinish = true) { println("do something") } 17

動作確認

• まずはlog-reporterで確認

• 以下のサンプルをsbt runすれば確認できますhttps://github.com/tsukaby/kamon-spray-example

"io.kamon" %% "kamon-log-reporter" % "0.5.2"

18

データの転送

• log-reporterで見てもあまり意味ない(debug用)

• Datadogに送りたいなら"io.kamon" %% "kamon-datadog" % "0.5.2"

19

実際にシステムを 監視してみる

20

CA ProFit-X 配信サーバの例

• 運用・監視している配信サーバの例

• 各Metricsなどの割合(体感)

• Counter 60%

• Histogram 10%

• Tracer 30%

• Gauge 0% (どこで使うんだろう・・)

• Counter以外は使いどころが難しい。(どなたか教えて下さい)

21

障害の検知 Actorを見る

• 「リリースしたら何か調子悪いね?」

• 「配信サーバのレスポンスが悪化してない?」

22

障害の検知 Actorを見る (mailboxのたまり具合を可視化)

23

障害の検知 Actorを見る (mailboxのたまり具合を可視化)• (良い例がなくてごめんなさい)

• 何かまずいプログラムをリリースすると特定のActorが詰まる

• e.g. 非同期を意識してないコード

• e.g. DynamoDBのキャパシティーが不足した24

接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム• 「X社からImpressionが少ないって問い合わせが来てるんだけど?」

25

接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム

26

接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム• X社のAPIは117ms

ProFit-X配信サーバでは100msでタイムアウト

• A, B, C, …社は7~30msで高速

• Z社はスパイクしている・・・(理由は不明)

• 各接続先のサーバに障害があるとこのグラフも変化する

27

データの消化具合を計測

• 「Impressionとかの値が乖離してるよね」 「Kinesisの値の消化が間に合ってないかも?」

• 「現在扱ってるKinesisレコードの日付と現在時刻を比較してみよう」

28

データの消化具合を計測

29

データの消化具合を計測

• 消化が間に合ってない

• 最大86K秒(約24h)前のデータを消化している

30

データの消化具合を計測(その後)• 同僚がチューニングしてくれて改善

31

Kamonの内部構造

32

Kamonの内部構造 (基本)

33

Kamonの疑問

• どういう仕組みで動いているの?

• libraryDependenciesを追加するだけでどうして動くの?

34

構成要素

• Akka Actor

• Akka Extensions

• AspectJ

• Sigar

• 出版-購読型モデル(Publisher, Subscriber)

(Observerパターン)

• LongAdder

• HdrHistogram

35

KamonもActorSystem

• Kamon.start()で専用のActorSystemを作成https://github.com/kamon-io/Kamon/blob/master/kamon-core/src/main/scala/kamon/Kamon.scala#L51

36

拡張機能は自動でONに

• ModuleLoaderがロード(Akka Extensions)

https://github.com/kamon-io/Kamon/blob/master/kamon-core/src/main/scala/kamon/ModuleLoader.scala#L92-L111

37

Akka Extensionって?

• http://doc.akka.io/docs/akka/snapshot/scala/extending-akka.html

• Akka ActorのExtensionを少し調べてみた

• ActorSystem内に1つだけ存在できるActorの拡張(拡張というよりただのLogic, Stateの集合?)

38

KamonにおけるExtensions

• 複数jarがあるがほぼ全てAkka Extensions

• ModuleLoaderが自動でロード

• 特に有効化など追加のコード必要なし

39

Kamonの内部構造 (データの転送)

40

Kamonの疑問その2

• どうやって値を転送しているの?

41

定期的に値を転送

• SubscriptionsDispatcher 1. processTick 2. dispatch 3. dispatchSelections 4. subscriber ! tickMetrics

• subscriberlog-reporterやdatadog-metrics-sender

42

MetricsSenderって?

• SubscriptionDispatcherがTickMetricSnapshotを作成し、各MetricsSenderへ送信

• 各MetricsSenderは転送先に合った形にデータを整形・送信

44

Kamonの内部構造 (値のカウント)

45

Kamonの疑問その3

• metricsはどう作られているの?

• tracerはどう作られているの?

• どうしてカウントした値が転送されるの?

46

Metricsの作成

• MetricsModule#registerCounter

• 単にCounterを作成して返しているだけ

• Counter = 内部的にはLongAdder

• _trackedEntitiesに既にあればそれを返す

val counter = Kamon.metrics.counter("foo")

47

Snapshotを作成

• MetricsModule#collectSnapshots

• _trackedEntitiesを全てなめる

• 現時点の値を取得し、Snapshotを作成

48

Tracer

• tracer = 内部的にはhistogram

• metricsとほぼ同じ仕組み

• histogram = 内部的にはHdrHistogram

49

Tracerの作成

• TraceModule#withNewContext

• 内部的にMetricsOnlyContextなどが作られる

• 自動または手動で#finishを実行

• finishするとhistogramのデータ作成(後はmetricsと同じ)

Tracer.withNewContext("foo", autoFinish = true) { println("Hello") }

50

まとめ

51

まとめ

• Kamonの概要

• Kamonの使い方、サンプルコード

• ProFitXの例

• Kamonの内部構造について

52