Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MicrometerとPrometheusによる LINEファミリーアプリのモニタリング

970 views

Published on

LINE Developer Meetup

Published in: Technology
  • Be the first to comment

  • Be the first to like this

MicrometerとPrometheusによる LINEファミリーアプリのモニタリング

  1. 1. MicrometerとPrometheusによる LINEファミリーアプリのモニタリング LINE Developer Meetup in Fukuoka #41 LINE Fukuoka株式会社 開発3室 松崎 学
  2. 2. 自己紹介 @matsumana LINE Fukuoka 株式会社 開発3室 SRE & サーバサイドエンジニア https://github.com/matsumana 松崎 学
  3. 3. • Prometheusとは? • Micrometerとは? • Micrometer導入以前・以後 • Micrometerの標準機能で収集できるメトリクス • Binder作成例 Agenda
  4. 4. Prometheusとは?
  5. 5. https://prometheus.io/docs/introduction/overview/
  6. 6. Micrometerとは?
  7. 7. https://micrometer.io/
  8. 8. ● Datadog ● New Relic ● Ganglia ● Prometheus ● etc… Micrometerが標準サポートしている モニタリングシステム
  9. 9. ● Armeria https://github.com/line/armeria ● RxJava 2とArmeriaでマイクロサービスを非同期化してみた https://engineering.linecorp.com/ja/blog/detail/213 ● レイテンシーを計算する技術の話 https://engineering.linecorp.com/ja/blog/detail/233 ● IMON (LINE内製のモニタリングシステム) ● IMON用のMicrometerライブラリ(MeterRegistry)を開発し、 IMONでもMicrometerを使ったメトリクス収集が可能になっている LINEでのMicrometerの利用例
  10. 10. ● LINEファミリーアプリ (https://line.me/ja/family-apps) ←今日はここにフォーカ ス ● Springの標準メトリクスライブラリになった事により、 Micrometerを利用するサービスが増えている LINEでのMicrometerの利用例
  11. 11. Micrometerの良さを伝えるために まず、Micrometer導入以前は どうやっていたかをお話します
  12. 12. Micrometer導入以前 (jmx_exporter経由でメトリクス収集)
  13. 13. Micrometer導入以前 (jmx_exporter経由でメトリクス収集) ● JMXを使ってメトリクスを収集するので、監視対象アプリケーションに 設定が必要 ● JMXポートなどのJVMオプション ● 監視対象のJMX設定 (Tomcat, Jetty, HikariCP, etc…) ● jmx_exporter用のメトリクス収集設定ファイルが必要
  14. 14. jmx_exporter設定ファイル(例) # java.langとjava.nioのメトリクスのみ収集する例 hostPort: localhost:5000 #監視対象のJMX port lowercaseOutputName: true whitelistObjectNames: - java.lang:* - java.nio:* rules: こういう設定ファイル(yaml)を準備しておくと
  15. 15. こういうJMX MBeanメトリクスが
  16. 16. こんな感じでPrometheus用のメトリクスとしてexportされる そのメトリクスがPrometheusに保存され # HELP java_lang_memory_heapmemoryusage_used # TYPE java_lang_memory_heapmemoryusage_used untyped java_lang_memory_heapmemoryusage_used 9.8744952E7
  17. 17. Grafanaで可視化できる
  18. 18. モニタリングするという目的は達成できたが
  19. 19. 複数のサービス運用に関わっていると アプリケーション毎にJMXの設定をしたり jmx_exporter設定ファイルを作るのは大変
  20. 20. ライブラリを書いた
  21. 21. prometheus-spring-boot (社内用ライブラリ)
  22. 22. Micrometer導入以前 (prometheus-spring-boot 初期バージョン)
  23. 23. prometheus-spring-bootのコンセプト ● 監視対象アプリケーションに依存ライブラリとして追加するだけで、 Prometheus/Grafanaでモニタリング・可視化が出来るようにする
  24. 24. prometheus-spring-bootの実装内容 ● jmx_exporterと、jmx_exporter設定ファイルをライブラリに内包 ● アプリケーションに組み込まれている監視対象(Tomcat, Jetty, HikariCP, etc)の JMX設定を行うSpring AutoConfigurationを実装 ● 社内Grafanaのダッシュボードに合わせて、メトリクスをexport
  25. 25. ● Dropwizard metricsを使ってアプリケーションのHTTP URI毎のレイテンシを exportする ● %tile値: 0.5, 0.75, 0.95, 0.98, 0.99, 0.999, etc… prometheus-spring-bootの実装内容
  26. 26. その後、Micrometerがリリースされる
  27. 27. prometheus-spring-bootを修正 ● jmx_exporter依存ロジックを削除。Micrometerを使って再実装 ● HTTP URI毎のレイテンシもMicrometer標準機能として提供されているので、 Dropwizard metrics依存ロジックも削除 ● その結果、ほぼ全ての機能がMicrometerだけで実現できた 「Micrometer + MicrometerにPRした機能 + 社内向けの機能」という状態 ※MicrometerにPRした機能はMicrometer新バージョンリリース後に削除予定
  28. 28. Micrometer導入以後 (prometheus-spring-boot 現在バージョン) ※Micrometerを直接使っているサービスもある ● Micrometerはメトリクス収集にJMXを使わない ● 構成もprometheus-spring-bootの実装も非常にシンプルになった
  29. 29. Micrometerの標準機能で 収集できるメトリクス (Spring Bootの場合、ライブラリを依存関係に追加するだけでOK)
  30. 30. Binder ● 監視対象ごとにBinderというクラスでメトリクス収集機能が提供されている ● https://github.com/micrometer-metrics/micrometer/tree/v1.0.6/micrometer- core/src/main/java/io/micrometer/core/instrument/binder ● Javaでよく使われるものが標準Binderとして提供されている ● 標準Binderに無いものは、自分で実装すれば良い ● 一般的に使えそうなBinderならPR ● Jetty ThreadのメトリクスをPRした。マージ済 ● https://github.com/micrometer-metrics/micrometer/pull/593 ● 参考記事 ● https://matsumana.info/tags/micrometer/
  31. 31. 標準Binderの一部を紹介
  32. 32. JVMのメトリクス ● ClassLoaderのメトリクス ● loaded数 ● unloaded数 ● Threadのメトリクス ● Thread数 ● Daemon Thread数
  33. 33. JVMのメトリクス ● GCのメトリクス ● Minor GCの発生回数 ● Minor GCの停止時間 ● Major GCの発生回数 ● Major GCの停止時間
  34. 34. JVMのメトリクス ● Heap memoryのメトリクス ● Young Generation (Eden, Survivor) ● Old Generation ● Young Generation (Eden, Survivor)のMax ● Old GenerationのMax
  35. 35. JVMのメトリクス ● Non-Heap memoryのメトリクス ● Code Cache ● Metaspace ● Compressed Class Space
  36. 36. Tomcatのメトリクス ● ThreadPool busy ● ThreadPool current ● ThreadPool max
  37. 37. Jettyのメトリクス ● Requestのメトリクス ● 処理中のリクエスト数 ● Responseのメトリクス ● HTTP status毎(1xx, 2xx, 3xx, 4xx, 5xx)のレスポンス数 ● Threadのメトリクス (2018/09リリース予定のMicrometer1.1.0から使用可能) ● ThreadPool busy ● ThreadPool current ● ThreadPool min ● ThreadPool max
  38. 38. ExecutorServiceのメトリクス ● ThreadPoolのメトリクス ● Queued ● Active ● Pool size ● タスクのメトリクス ● Completed
  39. 39. Logbackのメトリクス ● traceログ出力数 ● debugログ出力数 ● infoログ出力数 ● warn ログ出力数 ● error ログ出力数
  40. 40. URI毎のレイテンシ management: metrics: distribution: percentiles: http.server.requests: 0.5, 0.75, 0.95, 0.98, 0.99, 0.999, 1.0 application.ymlに以下のような設定(指定する%tile値は任意)を追加すると
  41. 41. URI毎のレイテンシ # HELP http_server_requests_seconds # TYPE http_server_requests_seconds summary http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="0.5",} 0.00393216 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="0.75",} 0.004325376 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="0.95",} 0.15925248 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="0.98",} 0.15925248 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="0.99",} 0.15925248 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="0.999",} 0.15925248 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/foo",quantile="1.0",} 0.15925248 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/bar",quantile="0.5",} 0.00131072 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/bar",quantile="0.75",} 0.00131072 http_server_requests_seconds{exception="None",method="GET",status="200",uri="/bar",quantile="0.95",} 0.004390912 レイテンシが以下のようなメトリクスとして取れる
  42. 42. HikariCPのメトリクス (HikariCP自身がMicrometerを使って実装) ● ConnectionPool Active ● ConnectionPool Pending ● ConnectionPool Idle ● ConnectionPool Total ● ConnectionPool Min ● ConnectionPool Max ※Spring Boot 1.5 + micrometer-spring-legacyではJMXを使う必要があります。詳しくは以下を参照 https://matsumana.info/blog/2018/05/23/collect-spring-boot-app-metrics-with-micrometer/
  43. 43. Binder作成例 (監視対象がメトリクスを持っている場合) ● JettyServerThreadPoolMetrics ● https://github.com/micrometer-metrics/micrometer/blob/master/micrometer- core/src/main/java/io/micrometer/core/instrument/binder/jetty/JettyServerThr eadPoolMetrics.java ● https://github.com/micrometer-metrics/micrometer/blob/master/micrometer- core/src/main/java/io/micrometer/core/instrument/binder/jetty/Instrumented QueuedThreadPool.java ● JettyMetricsAutoCofiguration (AutoConfigurationは必要に応じて作成) ● https://github.com/micrometer-metrics/micrometer/blob/master/micrometer- spring- legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetri
  44. 44. 監視対象がメトリクスを持っていない場合は 監視対象にメトリクス収集ロジックを追加する ● HikariCP ● https://github.com/brettwooldridge/HikariCP/pull/1110
  45. 45. Micrometerが色んなミドルウェアや ライブラリで使われるようになると 様々なモニタリングシステムで 簡単に監視できるようになりそう
  46. 46. Appendix https://github.com/fhemberger/chrome-prometheus-formatter Prometheus Formatter (Chrome Extension) # HELP jvm_memory_used_bytes The amount of used memory # TYPE jvm_memory_used_bytes gauge jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 1.637152E7 jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 5.0028744E7 jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 6463920.0 jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 2.53057592E8 jvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 1.3003488E7 jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 2.7751432E7 # HELP jvm_memory_used_bytes The amount of used memory # TYPE jvm_memory_used_bytes gauge jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 1.6291648E7 jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 4.9900088E7 jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 6440552.0 before: after:
  47. 47. THANK YOU

×