Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Kamonを理解する

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Hier ansehen

1 von 52 Anzeige
Anzeige

Weitere Verwandte Inhalte

Ähnlich wie Kamonを理解する (20)

Anzeige

Aktuellste (20)

Anzeige

Kamonを理解する

  1. 1. Kamonを理解する CA ProFit-X 塚本 修也 @s_tsuka 2015/11/20 AdTech Scala Meetup 1
  2. 2. 目次 • Kamonとは • Kamonの使い方 • 実際にシステムを監視してみる • Kamonの内部構造 2
  3. 3. はじめる前に 3
  4. 4. とりあえず動かしたい人向け • ミニマムなサンプルを用意しました # 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
  5. 5. Kamonとは 5
  6. 6. Kamonとは • JVM上で動くアプリケーションの監視ツール(ライブラリ) • 多くの拡張・連携機能
 Akka Actor, JDBC, JMX, Play2, Spray, Datadog, NewRelic … • Web site
 http://kamon.io/ • GitHub
 https://github.com/kamon-io/Kamon 6
  7. 7. ツールというよりライブラリ • Scalaのライブラリ
 Maven centralから使える • Scalaアプリケーション内から呼び出す感じ 7
  8. 8. 何ができるの?拡張機能って? • JVMアプリの監視(値の定期取得) • CPU, Memory, NW I/O, Load average, etc • Actorの処理時間、溜まっているメッセージ数 • 任意の処理block(method)の処理時間 • 独自に値を収集可能 • Kamonが収集した値の外部出力
 Datadog, NewRelic, 標準出力, StatsD, fluentd 8
  9. 9. できないこと • (GUIによる)可視化
 ※外部ツールにデータを転送することは可能 • 別途可視化環境を用意しましょう • kamon-statsd + Graphite • kamon-spm + SPM • kamon-datadog + Datadog • kamon-newrelic + Newrelic 9
  10. 10. Kamonの使い方 10
  11. 11. Get Started • 公式
 http://kamon.io/introduction/get-started/ • AdTech Scala blog
 KamonとDatadogを使ってAkka actorのパフォーマンスを可視化 する • サンプルコード
 https://github.com/kamon-io/Kamon/tree/master/kamon- examples
 https://github.com/tsukaby/kamon-spray-example 11
  12. 12. 導入4ステップ 1. アプリ作成 2. libraryDependencies追加 3. conf追加 4. Kamon用のコード追加 12
  13. 13. 拡張機能による自動データ収集 • 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
  14. 14. 一部aspectjが必要 • http://kamon.io/introduction/overview/ • アプリを動かすときは以下のような感じで java -javaagent:~/.aspectj/aspectj-weaver.jar your- app.jar 14
  15. 15. kamon-system-metricsを使う人は Sigarも必要 • http://kamon.io/integrations/system-metrics/system- and-jvm-metrics/ • Sigar • システムの情報(CPU, Memoryなど)を取得するC言語 で書かれたライブラリ • Java実装もあるっぽい・・けどただのラッパー?実行 時には共有ライブラリ(.so, .dylib)が必要みたい 15
  16. 16. Sigarをどうやって入れれば良 いの? • http://kamon.io/integrations/system-metrics/ system-and-jvm-metrics/ • sigar-loaderを使う • カレントdirのnative dir以下に自動でDL • 後は java -Djava.library.path=native -jar … 16
  17. 17. 独自に値を収集する • コードを書くだけ 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
  18. 18. 動作確認 • まずはlog-reporterで確認 • 以下のサンプルをsbt runすれば確認できます https://github.com/tsukaby/kamon-spray- example
 "io.kamon" %% "kamon-log-reporter" % "0.5.2" 18
  19. 19. データの転送 • log-reporterで見てもあまり意味ない
 (debug用) • Datadogに送りたいなら
 "io.kamon" %% "kamon-datadog" % "0.5.2" 19
  20. 20. 実際にシステムを 監視してみる 20
  21. 21. CA ProFit-X 配信サーバの例 • 運用・監視している配信サーバの例 • 各Metricsなどの割合(体感) • Counter 60% • Histogram 10% • Tracer 30% • Gauge 0% (どこで使うんだろう・・) • Counter以外は使いどころが難しい。(どなたか教えて下さい) 21
  22. 22. 障害の検知 Actorを見る • 「リリースしたら何か調子悪いね?」 • 「配信サーバのレスポンスが悪化してな い?」 22
  23. 23. 障害の検知 Actorを見る (mailboxのたまり具合を可視化) 23
  24. 24. 障害の検知 Actorを見る (mailboxのたまり具合を可視化) • (良い例がなくてごめんなさい) • 何かまずいプログラムをリリースすると特定の Actorが詰まる • e.g. 非同期を意識してないコード • e.g. DynamoDBのキャパシティーが不足した 24
  25. 25. 接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム • 「X社からImpressionが少ないって問い合わせ が来てるんだけど?」 25
  26. 26. 接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム 26
  27. 27. 接続先サーバ(AdNetwork, DSP)の APIのレスポンスタイム • X社のAPIは117ms
 ProFit-X配信サーバでは100msでタイムアウト • A, B, C, …社は7∼30msで高速 • Z社はスパイクしている・・・
 (理由は不明) • 各接続先のサーバに障害があるとこのグラフも変化する 27
  28. 28. データの消化具合を計測 • 「Impressionとかの値が乖離してるよね」
 「Kinesisの値の消化が間に合ってないか も?」 • 「現在扱ってるKinesisレコードの日付と現在 時刻を比較してみよう」 28
  29. 29. データの消化具合を計測 29
  30. 30. データの消化具合を計測 • 消化が間に合ってない • 最大86K秒(約24h)前のデータを消化している 30
  31. 31. データの消化具合を計測(その後) • 同僚がチューニングしてくれて改善 31
  32. 32. Kamonの内部構造 32
  33. 33. Kamonの内部構造 (基本) 33
  34. 34. Kamonの疑問 • どういう仕組みで動いているの? • libraryDependenciesを追加するだけでどうし て動くの? 34
  35. 35. 構成要素 • Akka Actor • Akka Extensions • AspectJ • Sigar • 出版-購読型モデル(Publisher, Subscriber)
 (Observerパターン) • LongAdder • HdrHistogram 35
  36. 36. KamonもActorSystem • Kamon.start()で専用のActorSystemを作成
 https://github.com/kamon-io/Kamon/blob/ master/kamon-core/src/main/scala/kamon/ Kamon.scala#L51 36
  37. 37. 拡張機能は自動でONに • ModuleLoaderがロード(Akka Extensions)
 https://github.com/kamon-io/Kamon/blob/ master/kamon-core/src/main/scala/kamon/ ModuleLoader.scala#L92-L111 37
  38. 38. Akka Extensionって? • http://doc.akka.io/docs/akka/snapshot/scala/ extending-akka.html • Akka ActorのExtensionを少し調べてみた • ActorSystem内に1つだけ存在できるActorの拡 張(拡張というよりただのLogic, Stateの集合?) 38
  39. 39. KamonにおけるExtensions • 複数jarがあるがほぼ全てAkka Extensions • ModuleLoaderが自動でロード • 特に有効化など追加のコード必要なし 39
  40. 40. Kamonの内部構造 (データの転送) 40
  41. 41. Kamonの疑問その2 • どうやって値を転送しているの? 41
  42. 42. 定期的に値を転送 • SubscriptionsDispatcher 1. processTick 2. dispatch 3. dispatchSelections 4. subscriber ! tickMetrics • subscriber
 log-reporterやdatadog-metrics-sender 42
  43. 43. MetricsSenderって? • その名の通り。いろいろある。 • DatadogMetricsSender • SimpleStatsDMetricsSender • FluentdMetricsSender • etc 43
  44. 44. MetricsSenderって? • SubscriptionDispatcherが TickMetricSnapshotを作成し、
 各MetricsSenderへ送信 • 各MetricsSenderは転送先に合った形にデータ を整形・送信 44
  45. 45. Kamonの内部構造 (値のカウント) 45
  46. 46. Kamonの疑問その3 • metricsはどう作られているの? • tracerはどう作られているの? • どうしてカウントした値が転送されるの? 46
  47. 47. Metricsの作成 • MetricsModule#registerCounter • 単にCounterを作成して返しているだけ • Counter = 内部的にはLongAdder • _trackedEntitiesに既にあればそれを返す val counter = Kamon.metrics.counter("foo") 47
  48. 48. Snapshotを作成 • MetricsModule#collectSnapshots • _trackedEntitiesを全てなめる • 現時点の値を取得し、Snapshotを作成 48
  49. 49. Tracer • tracer = 内部的にはhistogram • metricsとほぼ同じ仕組み • histogram = 内部的にはHdrHistogram 49
  50. 50. Tracerの作成 • TraceModule#withNewContext • 内部的にMetricsOnlyContextなどが作られる • 自動または手動で#finishを実行 • finishするとhistogramのデータ作成(後はmetricsと同じ) Tracer.withNewContext("foo", autoFinish = true) { println("Hello") } 50
  51. 51. まとめ 51
  52. 52. まとめ • Kamonの概要 • Kamonの使い方、サンプルコード • ProFitXの例 • Kamonの内部構造について 52

×