kamonとdatadogによるリアクティブアプリケーションの監視の事例
TRANSCRIPT
紹介の流れ
• 技術環境 / 選んだ経緯
• アプリケーション監視の事例
• Kamonの計測モデル
• 監視の例
• 受信メッセージ数, Kinesisアプリの遅延, 外部接続の応答時間, アプリのボトルネック
• つまづいた点と解決策, Tips
• タグの組合せ数を抑える(フィルタ, リソース解放)
サーバ側 技術環境
Scala/Akka
Docker
EC2/Elastic Beanstalk, DynamoDB, Kinesis, etc.
Kamon
Datad
og
EMR + Spot
Spark
AWS
Kamon
監視系
広告配信系 集計系
…
インフラ構成の省⼒化,伸びる環境に投資
2014年末に選定
AWS
Docker
(環境G)(環境O)
Google Trends goo.gl/cB8ll4
• 健全な基礎
• Actor Model (1973)
• ⾮同期メッセージ通信 → 弾⼒性, 耐障害性, 即応性[REM]
• エコシステム
• 社内事例, JVMベース
• 背圧制御, 永続化, クラスタ, シャーディング などの拡張
⾼性能
TechEmpower Web Framework Benchmarks EC2最新版 (Round11), Nov. 2015, json [WFB]
ThoghtWorksTechnology Radar Nov. 2016 [TTR]
“Architectures based on asynchronous message passing introduce complexity and make the overall system harder to understand”
• 当時から Kamon, Docker に対応 • 監視系の省⼒化と費⽤とのバランス • + “トレンド”
2014年末 に選定
Google Trends goo.gl/yQVIiY
Datadog
ツールS
ツールM (国内)
goo.gl/hq5vth
ツールZ
ツールn
ツールNツールm
goo.gl/yzb3jd
2014年末 に選定
Google Trends goo.gl/yQVIiY
Datadog
ツールS
Kamonの計測モデルと構成要素
• Core • Metrics - 計測対象(Entity)から計測値(EntityRecorder)
へのマップ • Tracing - 複数の計測対象間の相互作⽤の記録
• Integrations • Scala{,z}, Akka, Logback, Annotation, Exexutors,
Play, Spray, JDBC, ElasticSearch, System Metrics • Backends
• Datadog, JMX 他多数
計測器 計測対象(Entity)の例 紹介する監視の例
Counter akka-actor.errors 1. 受信メッセージ数
Histogram
akka-actor.time-in-mailbox 2. Kinesisアプリの遅延
tracer.elapsed-time 3. 外部接続の応答時間
MinMaxCounter akka-actor.mailbox-size 4. アプリのボトルネック
Gauge system-metrics.thread-count -
Kamonの4つの計測器と監視の例
1. 受信メッセージ数の監視 (Counter)
host-a でノード障害 (コンテナにrestartかかる)
host-bにfailover
Kamon.metrics.counter(“my-event”).increment()
2. Kinesisアプリの遅延の監視 (Histogram)
社内勉強会の資料[SMK] (@s_tsuka) より
Kamon.metrics.histogram(“my-delay”).record(v)
タグの組合せ数の制限 (Datadog)
タグの組合せ毎にCustom Metricがカウントされる デフォルトでは「ホスト数 x 100個」まで*
Metirc毎のタグ⼀覧 Datadog UI > Metric > Summary
(*) Datadog Integrationは含まず
…
タグの組合せ数の注意点 (Kamon)
• タグの組合せ毎にKamonのEntityが⽣成される • ⽣成されたEntityは⾃動では削除されない
Kamon.metrics.counter( name = "pageview", tags = Map(“url” -> url) ).increment()
メモリ リーク
• 対策 • 限られた値を取るものしかタグには使わない • LRUキャッシュなどで不要なEntityは明⽰的に remove する
タグの組合せ数の注意点 (kamon-akka)
• Actorのパス毎にKamonのEntityが⽣成される • Actorを⼤量に⽣成する設計パターンがある*
• e.g. Cameoパターン, Cluster Sharding
context.actorOf( MyActor.props, name = “my-actor-” + randomUUID.toString )
(*)もともとAkkaは 数百万Actor/JVM を想定している “~2.5 million actors per GB of heap”, http://akka.io/
Actorの⼤量⽣成の対策 (kamon-akka)
• akka-actorのフィルタで計測対象から除外する • 必要なら別の形で計測を仕込む
• e.g. ClusterShardingStats でActor総数を取る
// application.conf kamon.metric.filters.akka-actor { includes = [ “**” ] excludes = [ “*/user/**/my-actor-*”, “*/system/**” ] }
まとめ
• Kamonと組合せたScala/Akkaアプリの監視についてDatadogを選んだ経緯、1年半の運⽤の中から事例・Tipsを紹介しました
• タグの組合せが増えすぎないように、フィルタやリソース解放などに留意しています
• Kamonの使い⽅詳細や内部の仕組みについては 是⾮弊社のブログ[SBK]・勉強会資料[SMK]もご覧下さい
Reference
• [REM] Reactive Manifesto v2.0, http://www.reactivemanifesto.org/ja • [WFB] TechEmpower Web Framework Benchmarks, Round11, JSON
serialization, EC2, https://www.techempower.com/benchmarks/ (graph script: goo.gl/IpyQ4T )
• [TTR] ThoughtWorks, Technology Radar Nov. 2016, https://www.thoughtworks.com/radar/techniques
• [SBK] KamonとDatadogを使ってAkka actorのパフォーマンスを可視化する, CyberAgent AdTech Studio ScalaBlog, https://adtech.cyberagent.io/scalablog/2015/09/24/kamon_datadog_akka_performance/
• [SMK] Kamonを理解する, AdTech Scala Meetup, http://www.slideshare.net/shuyatsukamoto/kamon-55734536
• [DCM] Datadog FAQ, Limit on the number of custom metrics, https://help.datadoghq.com/hc/en-us/articles/204271775-What-is-a-custom-metric-and-what-is-the-limit-on-the-number-of-custom-metrics-I-can-have-