Slide 1

Slide 1 text

@superbrothers Prometheus Tokyo Meetup #2 (2019/6/3) ⼊⾨ Prometheus

Slide 2

Slide 2 text

@superbrothers Kazuki Suda / @superbrothers ▶ ソフトウェアエンジニア ▶ Kubernetes Meetup Tokyo, Cloud Native Deep Dive 共同主催者 ▶ Kubernetes Active Contributor ▶ CNCF Ambassador ▶ 「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ 「⼊⾨ Prometheus」監訳書

Slide 3

Slide 3 text

@superbrothers アジェンダ 1. Prometheus とは何か 2. Prometheus のアーキテクチャ - Prometheus サーバ - exporter - クライアントライブラリ - サービスディスカバリ - ダッシュボード - レコーディングルールとアラートルール - アラート管理 - ⻑期記憶ストレージ 3. より詳しく知るには

Slide 4

Slide 4 text

@superbrothers Prometheus とは何か

Slide 5

Slide 5 text

@superbrothers Prometheus ▶ https://github.com/prometheus/prometheus (Apache 2.0) ▶ オープンソースのメトリクスベースモニタリングシステム + プル型で単純なテキストのメトリクス形式 + 柔軟なクエリ⾔語 + サービスディスカバリ機構との連携で動的な環境のモニタリングが得意 + ダッシュボードとアラート通知 ▶ 2012年に SoundCloud の数名のエンジニアが開発 + 2015年のオープンソースとして公開 ▶ 2016年に Cloud Native Computing Foundation の2番⽬のプロジェクトのメンバになる + 2018年8⽉に “卒業” (Graduated) プロジェクトとなる

Slide 6

Slide 6 text

@superbrothers モニタリング 本番環境でアプリケーションやツール、データベース、ネットワークの問題を知り、 それに対処するための情報を得て、問題に対処すること。 ▶ アラートと問題の特定 + システムの状態が悪くなっていることを知り、問題への対処を始める ▶ デバッグ情報の提供 + 問題に対処するために必要な情報の提供 ▶ トレンド調査 + 現時点では問題ではないが時間経過とともにどのように変化していくかを知る + キャパシティプランニング ▶ 他のシステムへの情報提供 + オートスケーリングなど、⾃動化のために必要な情報を提供する

Slide 7

Slide 7 text

@superbrothers モニタリングのカテゴリ http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html Logging
 Events Tracing
 Request scoped Metrics
 Aggregatable Low
 volume High
 volume

Slide 8

Slide 8 text

@superbrothers 208.80.193.39 - - [25/May/2010:16:50:33 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; mediacenter; STB; 560x384; MSNTV 82.80.249.160 - - [25/May/2010:22:48:54 +0100] "GET / HTTP/1.1" 403 267 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; . 198.186.192.44 - - [26/May/2010:02:13:20 +0100] "GET / HTTP/1.1" 403 327 "-" "-" 66.249.71.179 - - [26/May/2010:03:36:51 +0100] "GET /robots.txt HTTP/1.1" 403 269 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 66.249.71.179 - - [26/May/2010:03:36:52 +0100] "GET / HTTP/1.1" 403 263 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 198.186.192.44 - - [27/May/2010:01:56:54 +0100] "GET / HTTP/1.1" 403 327 "-" "-" 208.80.193.29 - - [27/May/2010:03:08:17 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; FunWebProducts; SIMBAR=0; .NET C 66.249.68.210 - - [27/May/2010:03:46:25 +0100] "GET /robots.txt HTTP/1.1" 403 269 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 66.249.68.210 - - [27/May/2010:03:46:25 +0100] "GET / HTTP/1.1" 403 263 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 198.186.192.44 - - [28/May/2010:02:04:30 +0100] "GET / HTTP/1.1" 403 327 "-" "-" 184.73.2.36 - - [28/May/2010:05:14:00 +0100] "GET /robots.txt HTTP/1.0" 403 272 "-" "SheenBot/SheenBot-1.0.4 (Sheen web crawler)" 184.73.2.36 - - [28/May/2010:05:14:00 +0100] "GET / HTTP/1.0" 403 267 "-" "SheenBot/SheenBot-1.0.4 (Sheen web crawler)" 208.80.193.42 - - [28/May/2010:12:56:12 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.0; Windows NT 5.1; FunWebProducts; InfoPat 208.80.193.43 - - [29/May/2010:21:54:59 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; SIMBAR={ED852896-9625-4d90- 188.140.124.209 - - [29/May/2010:23:04:22 +0100] "GET / HTTP/1.1" 403 263 "http://www.google.pt/url? sa=t&source=web&ct=res&cd=2&ved=0CBkQFjAB&url=http%3A%2F%2Ftransmsilverio.com%2F&rct=j&q=transportes+manuel+silverio&ei=YY8BTNzMMZKL4AbUpNTLDg&usg=AFQjCNGYg9Tda SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2)" 188.140.124.209 - - [29/May/2010:23:04:36 +0100] "GET / HTTP/1.1" 403 263 "http://www.google.pt/url? sa=t&source=web&ct=res&cd=2&ved=0CBkQFjAB&url=http%3A%2F%2Ftransmsilverio.com%2F&rct=j&q=transportes+manuel+silverio&ei=YY8BTNzMMZKL4AbUpNTLDg&usg=AFQjCNGYg9Tda SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2)" 188.140.124.209 - - [29/May/2010:23:05:56 +0100] "GET / HTTP/1.1" 403 263 "http://www.google.pt/url? sa=t&source=web&ct=res&cd=1&ved=0CBUQFjAA&url=http%3A%2F%2Ftransmsilverio.com%2F&rct=j&q=www.transmsilverio.com&ei=vI8BTKe6M4SV4gbjruzLDg&usg=AFQjCNGYg9TdafIh9k CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; InfoPath.2)" 208.80.193.30 - - [31/May/2010:05:56:02 +0100] "GET / HTTP/1.0" 403 323 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; YPC 3.2.0; FunWebProducts; 207.44.204.87 - - [31/May/2010:14:35:45 +0100] "GET /wp-login.php HTTP/1.1" 403 274 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html 207.44.204.87 - - [31/May/2010:14:35:46 +0100] "GET /old/wp-login.php HTTP/1.1" 403 276 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot. 207.44.204.87 - - [31/May/2010:14:35:46 +0100] "GET /cms/wp-login.php HTTP/1.1" 403 276 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot. 207.44.204.87 - - [31/May/2010:14:35:47 +0100] "GET /blog/wp-login.php HTTP/1.1" 403 278 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot 207.44.204.87 - - [31/May/2010:14:35:47 +0100] "GET /blog_old/wp-login.php HTTP/1.1" 403 282 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com 207.44.204.87 - - [31/May/2010:14:35:48 +0100] "GET /blog-old/wp-login.php HTTP/1.1" 403 281 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com https://gist.github.com/pmcconnell-tc/9c3d57818d55ba7203d4e56f7142a43f Logging / ロギング ▶ イベントを対象として、イベント1つひとつのコンテキストの⼀部を記録する ▶ 例えば、HTTP リクエストをイベントとして、リクエスト時間、HTTP メソッド、パス、リクエ スト元 IP などのコンテキストをエントリとして記録する + アクセスログ ▶ サンプリングしないので、記録できるコンテキストに⼤きな制限がなく、特定のイベントにどの ような問題があるのかを正確に特定できる ▶ ⼀⽅で⼤量のストレージと帯域が必要になる

Slide 9

Slide 9 text

@superbrothers Tracing / トレーシング ▶ 1つのリクエストといった区切られたスコープのなかで関数呼び出しなどの
 複数のイベントを記録し、ボトルネックがどこにあるのかを明らかにする + スタックトレース + プロセスをまたぐと分散トレーシングと呼ばれる ▶ サンプリングによってデータ量を⼀定に保ちつつ、
 パフォーマンスに及ぼす影響を合理的な範囲に留める 12.94ms 11.95ms 6.91ms 6.71ms 1.27ms 0.04ms

Slide 10

Slide 10 text

@superbrothers Metrics / メトリクス ▶ イベントの集計した結果が経時的にどのように変化しているかを明らかにする ▶ よく使われるメトリクスとしては、HTTP リクエスト数やリクエストの処理にかかった時間、リ ソース使⽤量など ▶ できる限りのコンテキストを無視することで、データ量と処理を合理的な範囲に維持する + カーディナリティ

Slide 11

Slide 11 text

@superbrothers Prometheus の領域 Logging
 Events Tracing
 Request scoped Metrics
 Aggregatable http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html Low
 volume High
 volume

Slide 12

Slide 12 text

@superbrothers Prometheus のアーキテクチャ

Slide 13

Slide 13 text

@superbrothers 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL DNS, EC2, Kubernetes, Consul, file クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB Alertmanager Alertmanager ノード HDD / SSD ダッシュボード Web UI Pushgateway ジョブ ジョブ ジョブ ジョブ メール, Slack
 PagerDuty

Slide 14

Slide 14 text

@superbrothers ▶ 設定ファイルを持つ1個の静的リンクされたバイナリ Prometheus サーバ 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL TSDB HDD / SSD ノード $ prometheus \ --config.file ./prometheus.yml

Slide 15

Slide 15 text

@superbrothers ▶ https://github.com/prometheus/tsdb ▶ 時系列データベース / Time Series Database ストレージ / TSDB 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL TSDB HDD / SSD ノード

Slide 16

Slide 16 text

@superbrothers ▶ HTTP リクエストによるメトリクスの取得 ▶ 通常ターゲットごとに10秒から60秒に1回定期的に実⾏ スクレイピング / Scraping 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL TSDB HDD / SSD ノード クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション

Slide 17

Slide 17 text

@superbrothers メトリクス / Metrics @superbrothers # HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 0.000197882 go_gc_duration_seconds{quantile="0.25"} 0.000485779 go_gc_duration_seconds{quantile="0.5"} 0.006167069 go_gc_duration_seconds{quantile="0.75"} 0.013239405 go_gc_duration_seconds{quantile="1"} 0.013239405 go_gc_duration_seconds_sum 0.020090135 go_gc_duration_seconds_count 4 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 40 # HELP go_info Information about the Go environment. # TYPE go_info gauge go_info{version="go1.11.5"} 1 # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. # TYPE go_memstats_alloc_bytes gauge go_memstats_alloc_bytes 1.325616e+07 # HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. # TYPE go_memstats_alloc_bytes_total counter go_memstats_alloc_bytes_total 1.7018552e+07 # HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. # TYPE go_memstats_buck_hash_sys_bytes gauge go_memstats_buck_hash_sys_bytes 1.452901e+06 $ curl http://:/metrics @superbrothers

Slide 18

Slide 18 text

@superbrothers ▶ ゲージ / Gauge + 状態のスナップショットで、集計により合計、平均の計算と最⼩値、最⼤値の検出を⾏う + CPU やメモリ、ストレージといったリソース使⽤量など ▶ カウンタ / Counter + イベントの数やサイズを追跡し、アプリケーションが開⽰する値は、開始時からの合計となる + ゲージと異なり値⾃体に意味がなく、カウンタがいかに早く増えていくかに意味がある + ノードのネットワークトラフィックの量 メトリクスタイプ / Metric Types @superbrothers

Slide 19

Slide 19 text

@superbrothers ▶ ヒストグラム / Histogram + イベントのサイズの分布を追跡でき、そこから分位数も計算できる + 0.9分位数 (90パーセンタイル) など ▶ サマリ / Summary + 通常_sum、_count のふたつのデータが含み、quantile ラベルを持つ時系列データが含ま れている場合も + _sum、_count は、ともにカウンタ + HTTPレスポンスボディサイズなど メトリクスタイプ / Metric Types @superbrothers

Slide 20

Slide 20 text

@superbrothers エクスポータ / exporter 他の形式のメトリクスデータを Prometheus で処理できる形式に変換する ▶ Node exporter + マシンに関するメトリクスを提供する ▶ HA Proxy exporter, Blackbox exporter, cAdvisor, kube-state-metrics ▶ 数百の exporter がオープンソースで公開されており、すぐに利⽤できる サービス
 ディスカバリ スクレイ
 ピング exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB ノード HDD / SSD

Slide 21

Slide 21 text

@superbrothers クライアントライブラリ / Client library ⾃⾝のアプリケーションにメトリクス⽣成装置を追加する (ダイレクトインストルメンテーション) ▶ 公式ライブラリ + Go、Python、Java/JVM、Ruby ▶ サードパーティ + C#/.Net、Node.js、Haskell、Erlang、Rustなど サービス
 ディスカバリ スクレイ
 ピング TSDB クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション

Slide 22

Slide 22 text

@superbrothers package main import ( "log" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( requests = promauto.NewCounter( prometheus.CounterOpts{ Name: "hello_worlds_total", Help: "Hello Worlds requested.", }) ) func handler(w http.ResponseWriter, r *http.Request) { requests.Inc() w.Write([]byte("Hello World")) } func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(":8000", nil)) } $ go run example.go & $ curl --silent http://localhost:8000/metrics \ | grep hello_worlds_total # HELP hello_worlds_total Hello Worlds requested. # TYPE hello_worlds_total counter hello_worlds_total 15

Slide 23

Slide 23 text

@superbrothers プッシュゲートウェイ / Pushgateway サービスレベルバッチジョブのメトリクスキャッシュ ▶ バッチは短命なワークロードであり、スクレイプできない ▶ Pushgateway は、バッチの終了時にプッシュされた
 直近のメトリクスを開⽰する ▶ 性質上、特定のマシンやインスタンスに限らない
 1つのサービスに適⽤されることに注意
 サービス
 ディスカバリ スクレイ
 ピング TSDB ノード HDD / SSD Pushgateway ジョブ ジョブ ジョブ ジョブ

Slide 24

Slide 24 text

@superbrothers サービスディスカバリ スクレイプターゲットの発⾒ ▶ file_sd ▶ dns_sd ▶ ec2_sd ▶ kubernetes_sd ▶ consul_sd ▶ etc 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL file, DNS, EC2, Kubernetes, Consul TSDB

Slide 25

Slide 25 text

@superbrothers https://kbild.ch/blog/2019-02-18-awsprometheus/

Slide 26

Slide 26 text

@superbrothers ダッシュボード PromQL を利⽤してメトリクスを集計し可視化する ▶ 式ブラウザ + Prometheus Web UI ▶ Grafana PromQL SD ダッシュボード Web UI

Slide 27

Slide 27 text

@superbrothers PromQL ▶ セレクタ http_requests_total{job=“prometheus”,group=“canary"} ▶ マッチャ http_requests_total{environment=~"staging|development",method!="GET"} ▶ 直近5分間の1秒あたりの HTTP リクエスト数の平均 rate(http_requests_total{job=“api-server"}[5m]) ▶ 直近10分間のHTTP リクエストのレイテンシの90パーセンタイル histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))

Slide 28

Slide 28 text

@superbrothers https://www.replex.io/blog/kubernetes-in-production-the-ultimate-guide-to-monitoring-resource-metrics-with-grafana

Slide 29

Slide 29 text

@superbrothers レコーディングルール 定期的に PromQL 式を実⾏し、事前にメトリクスを集計することで負荷を軽減する $ cat prometheus.yml global: scrape_interval: 10s evaluation_interval: 10s rule_files: - rules.yml (略) $ cat rules.yml groups: - name: example rules: - record: job:process_cpu_seconds:rate5m expr: sum without(instance)(rate(process_cpu_seconds_total[5m])) - record: job:process_open_fds:max expr: max without(instance)(process_open_fds)

Slide 30

Slide 30 text

@superbrothers アラートルール 定期的に PromQL 式を実⾏し、結果がそのままアラートとなる $ cat rules.yml groups: - name: node_rules rules: - record: job:up:avg expr: avg without(instance)(up{job="node"}) - alert: ManyInstancesDown expr: avg without(instance)(up{job="node"}) < 0.5 for: 5m

Slide 31

Slide 31 text

@superbrothers https://coreos.com/blog/developing-prometheus-alerts-for-etcd.html

Slide 32

Slide 32 text

@superbrothers アラート管理 / Alertmanager Prometheus からアラートを受信し、それをアラート通知に変換する ▶ メール、Slack、PagerDuty ▶ クラスタリングのサポート + すでに通知済かどうかといった情報の交換 Alertmanager Alertmanager メール, Slack
 PagerDuty

Slide 33

Slide 33 text

@superbrothers ⻑期記憶ストレージ Prometheus はローカルディスクを利⽤するため、残せるデータはそのマシンのディスクサイズに 制限され、数⽇から数週間のデータを扱う。しかし、キャパシティプランニングには数年単位の データが必要となる。 ▶ Remote read/write API + ほかのシステムとの連携 ▶ API に対応している⻑期記憶ストレージ + InfluxDB, Cortex, Thanos, M3DB

Slide 34

Slide 34 text

@superbrothers 
 Prometheus サーバ サービス
 ディスカバリ スクレイ
 ピング PromQL DNS, EC2, Kubernetes, Consul, file クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション クライアント
 ライブラリ アプリケーション exporter exporter exporter exporter exporter サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション サードパーティ
 アプリケーション TSDB Alertmanager Alertmanager ノード HDD / SSD ダッシュボード Web UI Pushgateway ジョブ ジョブ ジョブ ジョブ メール, Slack
 PagerDuty

Slide 35

Slide 35 text

@superbrothers より詳しく知るには

Slide 36

Slide 36 text

@superbrothers https://www.oreilly.co.jp/books/9784873118772/

Slide 37

Slide 37 text

@superbrothers Thanks / Question? ▶ Kazuki Suda, @superbrothers ▶ Slide: https://speakerdeck.com/superbrothers/