Upload
shuya-tsukamoto
View
1.558
Download
1
Embed Size (px)
Citation preview
とりあえず動かしたい人向け
• ミニマムなサンプルを用意しました# 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とは
• 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
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
拡張機能による自動データ収集
• 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
CA ProFit-X 配信サーバの例
• 運用・監視している配信サーバの例
• 各Metricsなどの割合(体感)
• Counter 60%
• Histogram 10%
• Tracer 30%
• Gauge 0% (どこで使うんだろう・・)
• Counter以外は使いどころが難しい。(どなたか教えて下さい)
21
障害の検知 Actorを見る (mailboxのたまり具合を可視化)• (良い例がなくてごめんなさい)
• 何かまずいプログラムをリリースすると特定のActorが詰まる
• e.g. 非同期を意識してないコード
• e.g. DynamoDBのキャパシティーが不足した24
接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム• X社のAPIは117ms
ProFit-X配信サーバでは100msでタイムアウト
• A, B, C, …社は7~30msで高速
• Z社はスパイクしている・・・(理由は不明)
• 各接続先のサーバに障害があるとこのグラフも変化する
27
データの消化具合を計測
• 「Impressionとかの値が乖離してるよね」 「Kinesisの値の消化が間に合ってないかも?」
• 「現在扱ってるKinesisレコードの日付と現在時刻を比較してみよう」
28
構成要素
• 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
定期的に値を転送
• SubscriptionsDispatcher 1. processTick 2. dispatch 3. dispatchSelections 4. subscriber ! tickMetrics
• subscriberlog-reporterやdatadog-metrics-sender
42
MetricsSenderって?
• その名の通り。いろいろある。
• DatadogMetricsSender
• SimpleStatsDMetricsSender
• FluentdMetricsSender
• etc
43
MetricsSenderって?
• SubscriptionDispatcherがTickMetricSnapshotを作成し、各MetricsSenderへ送信
• 各MetricsSenderは転送先に合った形にデータを整形・送信
44
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