Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
2018年10月31日
ヤフー株式会社 池田 誠
Micrometer/Prometheusによる
大規模システムモニタリング
〜ヤフーインターネット広告システムでの導入事例〜
Spring Fest 2018
2.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
自己紹介
2
池田 誠
ヤフー株式会社
所属:インターネット広告の開発部
仕事:
インターネット広告システムの共通機能開発
新技術の検証・導入サポート
言語:C, C++, Java, Kotlin, Python, Go(勉強中)
趣味:ゲーム, スキー
3.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
はじめに
3
ヤフーのインターネット広告システムでは、Micrometerと
Prometheusを採用したモニタリングシステムを構築し、
3000+のSpring Bootアプリケーションインスタンスの
パフォーマンスモニタリングをしています。
本日は、MicrometerとPrometheusの簡単な紹介、大規模
システムでの導入事例として、導入時に遭遇したトラブル
や直面している課題をお話しさせていただきます。
4.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
システムモニタリングの重要性
4
システムモニタリングを行わないと
どんなトラブル起こりますか?
5.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
システムモニタリングの重要性
5
• パフォーマンス問題に気付かない
• エラーの増加に気付かない
• 障害を解析するための情報集めに苦労する
など
サービスを安定して稼働/運用することができない
6.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
システムモニタリングの重要性
6
分散システムでは
多数あるアプリケーション内から
異常アプリケーションを早く特定するため
モニタリングがさらに重要
7.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
アジェンダ
7
• ヤフーのインターネット広告システム紹介
• 導入背景
• Micrometer/Prometheus説明
• Micrometer/Prometheus採用理由
• モニタリングシステム構成
• 苦労したエピソード・トラブル
• まとめ
8.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
アジェンダ
8
• ヤフーのインターネット広告システム紹介
• 導入背景
• Micrometer/Prometheus説明
• Micrometer/Prometheus採用理由
• モニタリングシステム構成
• 苦労したエピソード・トラブル
• まとめ
9.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
ヤフーのインターネット広告システム紹介
システム概要
9
FE
広告主
広告
配信
オーディエンス
• 複数アプリケーションが協調動作
• 全体で数千インスタンスが稼働
広告
出稿
広告管理システム 広告配信システム
10.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
ヤフーのインターネット広告システム紹介
システム概要
10
モニタリングシステムは広告管理システムに導入
FE
広告管理システム 広告配信システム
広告主
広告
配信
オーディエンス
広告
出稿
11.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
ヤフーのインターネット広告システム紹介
アプリケーションの動作プラットフォーム
11
• IaaS (OpenStack)
• 現在の主力プラットフォーム
• PaaS, CaaSに移行中
• PaaS (Pivotal Cloud Foundry)
• CaaS (Kubernetes)
12.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
ヤフーのインターネット広告システム紹介
アプリケーションの種類
12
フロントエンドサーバー APIサーバー
(REST or SOAP)
ストリーム処理
publisher
ストリーム処理
subscriber
メッセージブローカー
バッチサーバー
各アプリケーションが協調動作
13.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
アジェンダ
13
• ヤフーのインターネット広告システム紹介
• 導入背景
• Micrometer/Prometheus説明
• Micrometer/Prometheus採用理由
• モニタリングシステム構成
• 苦労したエピソード・トラブル
• まとめ
14.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
導入背景
14
• 既存の独自モニタリングシステム刷新
• SREを推進するための土台作り/道具整備
※既存の独自モニタリングシステムは広告管理システム独自のシステム
15.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
導入背景
独自モニタリングシステム刷新
15
• 独自モニタリングシステムの課題
• 属人化
• モニタリング項目追加に開発が必要
• カバー範囲が拡大し範疇外の機能を搭載
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
導入背景
Site Reliability Engineering (SRE)
18
• アプリケーション信頼性とユーザー体験を向上させる活動
• モニタリングと改善のサイクル
• レイテンシ、エラー率、トラフィック、リソース(CPU、メモリー、N/Wトラフィック…)
エンジニア アプリケーションモニタリング
改善
19.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
導入背景
Site Reliability Engineering (SRE)
19
• SREを推進するためのモニタリング
• 性能低下の検知
• エラー増加傾向の検知
• アプリケーションアップデート前後の性能比較
• 需要予測、キャパシティプランニング
20.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
アジェンダ
20
• ヤフーのインターネット広告システム紹介
• 導入背景
• Micrometer/Prometheus説明
• Micrometer/Prometheus採用理由
• モニタリングシステム構成
• 苦労したエピソード・トラブル
• まとめ
21.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Prometheus
21
• 時系列DB + モニタリングシステム
• pull方式でメトリクス収集
• 監視対象はメトリクスが記載されたテキストを返却
定期的にPull (HTTP)
Prometheus 監視対象
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="iowait"} 2.94
node_cpu{cpu="cpu0",mode="system"} 937.24
node_cpu{cpu="cpu0",mode="user"} 2583.65
# …
※時系列DBは時系列データの格納・検索に特化したDB
22.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Prometheus
データモデル
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="guest"} 0
node_cpu{cpu="cpu0",mode="iowait"} 2.94
node_cpu{cpu="cpu0",mode="system"} 937.24
node_cpu{cpu="cpu0",mode="user"} 2583.65
# …
22
23.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Prometheus
データモデル
23
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="guest"} 0
node_cpu{cpu="cpu0",mode="iowait"} 2.94
node_cpu{cpu="cpu0",mode="system"} 937.24
node_cpu{cpu="cpu0",mode="user"} 2583.65
# …
メトリクス名 データサンプルラベル名、ラベル値
24.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Prometheus
検索/可視化
24
• 収集したメトリクスはPromQL(独自クエリー)で検索/可視化
※CPU使用率を可視化した例
25.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Prometheus
UI
25
• UIとしてGrafanaと連携
• ダッシュボードを作成・保存可能
Grafana Prometheusエンジニア
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Prometheus
注意点
27
• Prometheus単独では冗長化できない
• 内蔵の時系列DBが冗長化できない
• 公式ドキュメントでの冗長化手段
• 同じ設定のPrometheusをもう1台設置
• 時系列DBを他製品に切り替える
※冗長化に関する公式ドキュメント
<https://prometheus.io/docs/introduction/faq/#can-prometheus-be-made-highly-available>
28.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Micrometer
28
• メトリクス収集ライブラリ
• Dependency追加&多少の設定追加で動作
• 様々なモニタリングシステムと連携可能(※)
• Prometheus, Netflix Atlas, CloudWatch, Datadog,
Graphite, Ganglia, JMX, Influx/Telegraf, New Relic,
StatsD, SignalFx, and Wavefront
※micrometer公式サイトより引用 <https://micrometer.io/>
29.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Micrometer
利用方法(SpringBoot1.5系)
29
Maven or Gradleの設定でdependency追加 application.yml or propertiesに設定追加
※Prometheusと連携する場合の例
これだけでメトリクス収集が開始
30.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Micrometer
利用方法(SpringBoot2系)
30
※Prometheusと連携する場合の例
これだけでメトリクス収集が開始
Maven or Gradleの設定でdependency追加 application.yml or propertiesに設定追加
31.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Micrometer
収集メトリクス
31
• デフォルトで収集されるメトリクス(一部)
• Web Controller(実行回数/レスポンスタイム)
• RestTemplate(実行回数/レスポンスタイム)
• Spring Cloud Streamのpub/subカウント
• JVM(各種メモリ使用状況、スレッド数、GC)
• OSリソース(CPU)
※1 上記はソースコード修正なしで収集
※2 その他の収集可能なメトリクスは以下を参照
<https://spring.io/blog/2018/03/16/micrometer-spring-boot-2-s-new-application-metrics-collector>
32.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Micrometer
カスタムメトリクス
32
• 独自メトリクスを簡単に作成可能
private final MeterRegistry registry;
public SampleServiceImpl(MeterRegistry registry) {
this.registry = registry;
}
// カスタムメトリクス( jobTypeごとに集計)
public void execute(Job job) {
// sample_job_total{job_type="JOB1",} 3.0
// sample_job_total{job_type="JOB2",} 5.0
Counter.builder("sample_job").tags("job_type", job.getJobType().toString())
.register(registry).increment();
}
33.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
アジェンダ
33
• ヤフーのインターネット広告システム紹介
• 導入背景
• Micrometer/Prometheus説明
• Micrometer/Prometheus採用理由
• モニタリングシステム構成
• 苦労したエピソード・トラブル
• まとめ
34.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
モニタリングシステムへの要件
34
• 複数のプラットフォームで導入できること
• IaaS, PaaS, CaaS
• 監視対象アプリケーションへの導入が容易であること
• 可能であればコード修正なしで導入
• 例えばDependency or アノテーションを追加するだけ
• 閾値超えアラートを利用できること
• グラフで可視化できること(当たり前)
• 任意の監視項目・グラフを自由に追加できること
35.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
Micrometer
採用の決め手
35
• アプリケーション内部でしか収集できないメトリクスを収集
• コード修正なしで基本的なメトリクスを自動で収集
• 簡単にカスタマイズできて任意のメトリクスを追加可能
• 様々なモニタリングシステムと連携
• Prometheus, Atlas, CloudWatch, Influx, New Relic …
• Spring Boot公式サポートなので安心
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
事例3: 現在対応中の性能問題
高コストクエリー
65
• 1時系列あたりの集計対象メトリクス(データサンプル)数=約40000
• アプリは約1000インスタンスで構成
• アプリ全体の5分ごとの平均レスポンスタイム(累計レスポンスタイム÷実行回数)を集計
• ステータスコード、URI、methodごとに集計する
sum(increase(http_server_requests_seconds_sum{job="app1"}[5m])) by (status,uri,method)
/
sum(increase( http_server_requests_seconds_count{job="app1"}[5m])) by (status,uri,method)
ステータスコード、URI、methodごとの、5分間の累計レスポンスタイム
ステータスコード、URI、methodごとの、5分間の累計実行回数
66.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
事例3: 現在対応中の性能問題
解決方法(検証中)
66
• Prometheusの1次集計機能(RecordingRule)を利用
groups:
- name: example
interval: 60s # 1次集計間隔
rules:
# 5分間あたりのアプリ全体の累計レスポンスタイムをstatus、uri、methodごとに一次集計する
- record: job:http_server_requests_seconds_sum:app1:increase5m:sum
expr: sum(increase(http_server_requests_seconds_sum{job="app1"}[5m])) by (status,uri,method)
# 5分間あたりのアプリ全体の累計実行回数をstatus、uri、methodごとに一次集計する
- record: job:http_server_requests_seconds_count:app1:increase5m:sum
expr: sum(increase(http_server_requests_seconds_count{job="app1"}[5m])) by (status,uri,method)
67.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
事例3: 現在対応中の性能問題
改善効果(検証結果)
67
• 改善効果
約45秒
約0.4秒
68.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
アジェンダ
68
• ヤフーのインターネット広告システム紹介
• 導入背景
• Micrometer/Prometheus説明
• Micrometer/Prometheus採用理由
• モニタリングシステム構成
• 苦労したエピソード・トラブル
• まとめ
69.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
良かった点
69
• 監視対象側の導入は簡単・低コスト
• 手順はDependencyの追加程度なのであっという間に利用アプリが増えた
• カスタマイズ性抜群 = 属人化が解消
• アプリ開発者がカスタムメトリクスを使い必要なメトリクスを追加してくれた
• アプリ開発者が見たいグラフを自由に追加してくれた
70.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
苦労した点
70
• PromQL習得に学習コストがかかる
• ナレッジ/ドキュメント不足で調査に苦労した
• 例えばPushgatewayにpushする設定方法はソース解析
71.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved.
本日持ち帰っていただきたいこと
71
Micrometer/Prometheusは
•監視対象側の導入は簡単・低コスト
•カスタマイズ性が抜群
•大規模システムにおいても難なく利用可能(※)
※大量メトリクスに対して複雑な集計をする場合は、1次集計する工夫が必要
72.
Copyright (C) 2018Yahoo Japan Corporation. All Rights Reserved. 72
ご静聴ありがとうございました